From 10c9f34f67f487bdfbd7579290f4b2d6438f18c6 Mon Sep 17 00:00:00 2001 From: Greg Burd Date: Sun, 6 Jun 2021 13:46:45 -0400 Subject: [PATCH] Initial import. --- FindBugsExclude.xml | 458 + LICENSE | 76 + README | 5 + ant/PrintBootClassPath.java | 16 + ant/compile.xml | 121 + ant/internal.xml | 1187 ++ build-common.xml | 21 + build.xml | 2394 +++ dist/build.properties | 4 + .../GettingStartedGuide/BerkeleyDB-JE-GSG.pdf | Bin 0 -> 820362 bytes docs/GettingStartedGuide/Cursors.html | 214 + docs/GettingStartedGuide/DBAdmin.html | 157 + docs/GettingStartedGuide/DBEntry.html | 303 + .../DeleteEntryWCursor.html | 122 + docs/GettingStartedGuide/EnvProps.html | 263 + docs/GettingStartedGuide/Positioning.html | 691 + docs/GettingStartedGuide/PutEntryWCursor.html | 186 + .../ReplacingEntryWCursor.html | 123 + docs/GettingStartedGuide/admin.html | 237 + docs/GettingStartedGuide/administration.html | 181 + .../applicationoverview.html | 628 + .../backgroundthreads.html | 187 + docs/GettingStartedGuide/backup.html | 291 + docs/GettingStartedGuide/backuprestore.html | 355 + docs/GettingStartedGuide/baseapi.html | 382 + docs/GettingStartedGuide/bindAPI.html | 792 + docs/GettingStartedGuide/cachesize.html | 131 + .../catastrophicrecovery.html | 117 + .../GettingStartedGuide/commandlinetools.html | 563 + docs/GettingStartedGuide/comparator.html | 260 + .../concurrentProcessing.html | 171 + docs/GettingStartedGuide/cursorUsage.html | 284 + .../dataaccessorclass.html | 119 + docs/GettingStartedGuide/databases.html | 546 + docs/GettingStartedGuide/dbUsage.html | 203 + .../dbenvUsageExample.html | 180 + docs/GettingStartedGuide/dbprops.html | 164 + docs/GettingStartedGuide/dbtUsage.html | 693 + docs/GettingStartedGuide/diskthreshold.html | 124 + docs/GettingStartedGuide/dpl.html | 279 + docs/GettingStartedGuide/dpl_delete.html | 114 + docs/GettingStartedGuide/dpl_entityjoin.html | 193 + docs/GettingStartedGuide/dpl_example.html | 275 + .../dpl_exampledatabaseput.html | 337 + .../dpl_exampleinventoryread.html | 271 + docs/GettingStartedGuide/dpl_replace.html | 109 + docs/GettingStartedGuide/dplindexcreate.html | 419 + docs/GettingStartedGuide/env.html | 412 + docs/GettingStartedGuide/envStats.html | 102 + docs/GettingStartedGuide/envclose.html | 127 + docs/GettingStartedGuide/getmultiple.html | 336 + docs/GettingStartedGuide/gettingStarted.css | 50 + docs/GettingStartedGuide/gettingit.html | 103 + docs/GettingStartedGuide/hotfailover.html | 128 + docs/GettingStartedGuide/index.html | 1101 ++ docs/GettingStartedGuide/indexes.html | 398 + docs/GettingStartedGuide/indexusage.html | 483 + docs/GettingStartedGuide/introduction.html | 616 + docs/GettingStartedGuide/inventoryclass.html | 148 + docs/GettingStartedGuide/jca.html | 106 + docs/GettingStartedGuide/jeexceptions.html | 154 + docs/GettingStartedGuide/jmx.html | 74 + docs/GettingStartedGuide/joins.html | 377 + docs/GettingStartedGuide/keyCreator.html | 241 + .../GettingStartedGuide/logfilesrevealed.html | 133 + docs/GettingStartedGuide/managelogging.html | 260 + docs/GettingStartedGuide/moreinfo.html | 165 + docs/GettingStartedGuide/multiprocess.html | 89 + docs/GettingStartedGuide/mydbenv-persist.html | 156 + docs/GettingStartedGuide/persist_access.html | 243 + docs/GettingStartedGuide/persist_first.html | 316 + docs/GettingStartedGuide/persist_index.html | 245 + docs/GettingStartedGuide/persistobject.html | 147 + docs/GettingStartedGuide/preface.html | 174 + docs/GettingStartedGuide/readSecondary.html | 125 + docs/GettingStartedGuide/restore.html | 103 + docs/GettingStartedGuide/saveret.html | 123 + docs/GettingStartedGuide/secondaryCursor.html | 155 + docs/GettingStartedGuide/secondaryDelete.html | 128 + docs/GettingStartedGuide/secondaryProps.html | 94 + docs/GettingStartedGuide/simpleda.html | 104 + docs/GettingStartedGuide/simpleget.html | 170 + docs/GettingStartedGuide/simpleput.html | 229 + docs/GettingStartedGuide/timetolive.html | 318 + docs/GettingStartedGuide/usingDbt.html | 424 + docs/LICENSE.txt | 76 + .../BerkeleyDB-JE-Replication.pdf | Bin 0 -> 538789 bytes docs/ReplicationGuide/addremovenodes.html | 147 + docs/ReplicationGuide/administration.html | 229 + docs/ReplicationGuide/admintimesync.html | 88 + docs/ReplicationGuide/availability.html | 220 + docs/ReplicationGuide/backups.html | 92 + docs/ReplicationGuide/cons_and_dur.html | 390 + docs/ReplicationGuide/consistency.html | 508 + docs/ReplicationGuide/datamanagement.html | 278 + docs/ReplicationGuide/dbbackup.html | 111 + docs/ReplicationGuide/election-override.html | 331 + docs/ReplicationGuide/enablerep.html | 140 + docs/ReplicationGuide/events.html | 179 + docs/ReplicationGuide/exceptions.html | 318 + docs/ReplicationGuide/gettingStarted.css | 50 + docs/ReplicationGuide/groupreset.html | 75 + docs/ReplicationGuide/hotupgrade.html | 288 + docs/ReplicationGuide/index.html | 679 + docs/ReplicationGuide/introduction.html | 587 + docs/ReplicationGuide/lifecycle.html | 622 + docs/ReplicationGuide/logfile-restore.html | 210 + docs/ReplicationGuide/monitors.html | 164 + docs/ReplicationGuide/nodeconfig.html | 227 + docs/ReplicationGuide/preface.html | 260 + docs/ReplicationGuide/progoverview.html | 498 + docs/ReplicationGuide/repenvironmentopen.html | 157 + docs/ReplicationGuide/repexample.html | 127 + docs/ReplicationGuide/replicawrites.html | 276 + docs/ReplicationGuide/runtransaction.html | 572 + docs/ReplicationGuide/secondary.html | 106 + docs/ReplicationGuide/timesync.html | 84 + docs/ReplicationGuide/two-node.html | 203 + docs/ReplicationGuide/txn-management.html | 799 + docs/ReplicationGuide/txnrollback.html | 119 + docs/ReplicationGuide/utilities.html | 472 + .../BerkeleyDB-JE-Txn.pdf | Bin 0 -> 919596 bytes .../abortresults.html | 86 + docs/TransactionGettingStarted/apireq.html | 176 + .../TransactionGettingStarted/autocommit.html | 166 + docs/TransactionGettingStarted/backup.html | 317 + .../blocking_deadlocks.html | 610 + docs/TransactionGettingStarted/chkpoint.html | 88 + docs/TransactionGettingStarted/deadlock.jpg | Bin 0 -> 12599 bytes docs/TransactionGettingStarted/enabletxn.html | 260 + .../gettingStarted.css | 50 + docs/TransactionGettingStarted/index.html | 523 + .../introduction.html | 215 + docs/TransactionGettingStarted/isolation.html | 759 + .../jebackuprestore.html | 171 + .../jecatastrophicrecovery.html | 114 + .../jehotfailover.html | 131 + docs/TransactionGettingStarted/jelock.html | 260 + docs/TransactionGettingStarted/maxtxns.html | 145 + docs/TransactionGettingStarted/moreinfo.html | 166 + .../multithread-intro.html | 96 + .../nodurabletxn.html | 270 + .../perftune-intro.html | 79 + docs/TransactionGettingStarted/preface.html | 168 + docs/TransactionGettingStarted/readblock.jpg | Bin 0 -> 10504 bytes .../readmodifywrite.html | 159 + .../recovery-intro.html | 98 + docs/TransactionGettingStarted/rwlocks1.jpg | Bin 0 -> 7428 bytes docs/TransactionGettingStarted/simplelock.jpg | Bin 0 -> 4453 bytes .../TransactionGettingStarted/sysfailure.html | 112 + .../txn_ccursor.html | 226 + .../txnconcurrency.html | 373 + docs/TransactionGettingStarted/txncursor.html | 217 + .../txnexample_dpl.html | 705 + .../txnexample_java.html | 767 + .../TransactionGettingStarted/txnindices.html | 161 + docs/TransactionGettingStarted/usingtxns.html | 390 + docs/TransactionGettingStarted/wrapup.html | 254 + docs/TransactionGettingStarted/writeblock.jpg | Bin 0 -> 6369 bytes docs/changelog.html | 3587 +++++ docs/collections/tutorial/BasicProgram.html | 454 + .../tutorial/BerkeleyDB-JE-Collections.pdf | Bin 0 -> 405903 bytes docs/collections/tutorial/Entity.html | 356 + .../tutorial/SerializableEntity.html | 345 + .../tutorial/SerializedObjectStorage.html | 85 + docs/collections/tutorial/Summary.html | 191 + docs/collections/tutorial/Tuple.html | 209 + .../tutorial/UsingCollectionsAPI.html | 358 + .../tutorial/UsingSecondaries.html | 447 + .../tutorial/UsingStoredCollections.html | 661 + .../tutorial/addingdatabaseitems.html | 229 + .../tutorial/collectionOverview.html | 451 + .../tutorial/collectionswithentities.html | 164 + .../tutorial/createbindingscollections.html | 283 + .../tutorial/creatingentitybindings.html | 271 + docs/collections/tutorial/developing.html | 186 + .../tutorial/entitieswithcollections.html | 251 + docs/collections/tutorial/gettingStarted.css | 50 + .../tutorial/handlingexceptions.html | 217 + .../tutorial/implementingmain.html | 253 + docs/collections/tutorial/index.html | 597 + .../tutorial/indexedcollections.html | 248 + docs/collections/tutorial/intro.html | 205 + docs/collections/tutorial/moreinfo.html | 155 + .../tutorial/openclasscatalog.html | 198 + docs/collections/tutorial/opendatabases.html | 167 + .../tutorial/opendbenvironment.html | 197 + .../tutorial/openingforeignkeys.html | 339 + docs/collections/tutorial/preface.html | 142 + .../removingredundantvalueclasses.html | 131 + .../tutorial/retrievingbyindexkey.html | 279 + .../tutorial/retrievingdatabaseitems.html | 216 + .../tutorial/sortedcollections.html | 137 + .../tutorial/transientfieldsinbinding.html | 177 + .../tutorial/tuple-serialentitybindings.html | 198 + .../tutorial/tuplekeybindings.html | 219 + .../tutorial/tupleswithkeycreators.html | 206 + .../tutorial/tutorialintroduction.html | 411 + .../tutorial/usingtransactions.html | 222 + docs/doclet/Debug.java | 58 + docs/doclet/HidingAnnotatedTypeWrapper.java | 35 + docs/doclet/HidingAnnotationDescWrapper.java | 40 + .../HidingAnnotationTypeDocWrapper.java | 29 + ...HidingAnnotationTypeElementDocWrapper.java | 30 + docs/doclet/HidingAnnotationValueWrapper.java | 32 + docs/doclet/HidingClassDocWrapper.java | 241 + docs/doclet/HidingConstructorDocWrapper.java | 22 + docs/doclet/HidingDocWrapper.java | 149 + docs/doclet/HidingDoclet.java | 64 + .../HidingExecutableMemberDocWrapper.java | 100 + docs/doclet/HidingFieldDocWrapper.java | 54 + docs/doclet/HidingMemberDocWrapper.java | 27 + docs/doclet/HidingMethodDocWrapper.java | 68 + docs/doclet/HidingPackageDocWrapper.java | 73 + docs/doclet/HidingParamTagWrapper.java | 35 + docs/doclet/HidingParameterWrapper.java | 47 + .../HidingParameterizedTypeWrapper.java | 49 + .../HidingProgramElementDocWrapper.java | 87 + docs/doclet/HidingRootDocWrapper.java | 87 + docs/doclet/HidingSeeTagWrapper.java | 53 + docs/doclet/HidingSerialFieldTagWrapper.java | 59 + docs/doclet/HidingSourcePositionWrapper.java | 42 + docs/doclet/HidingTagWrapper.java | 62 + docs/doclet/HidingThrowsTagWrapper.java | 42 + docs/doclet/HidingTypeVariableWrapper.java | 39 + docs/doclet/HidingTypeWrapper.java | 91 + docs/doclet/HidingWildcardTypeWrapper.java | 32 + docs/doclet/HidingWrapper.java | 309 + docs/examples.html | 353 + docs/examples/allclasses-frame.html | 26 + docs/examples/allclasses-noframe.html | 26 + docs/examples/constant-values.html | 154 + docs/examples/deprecated-list.html | 125 + docs/examples/help-doc.html | 222 + docs/examples/index-all.html | 283 + docs/examples/index.html | 72 + docs/examples/je/rep/quote/HARouter.html | 301 + .../je/rep/quote/RouterDrivenStockQuotes.html | 335 + .../examples/je/rep/quote/RunTransaction.html | 318 + docs/examples/je/rep/quote/SimpleRouter.html | 285 + docs/examples/je/rep/quote/StockQuotes.html | 410 + ...tockQuotesRMIForwarding.WriteServices.html | 245 + ...QuotesRMIForwarding.WriteServicesImpl.html | 301 + .../rep/quote/StockQuotesRMIForwarding.html | 375 + .../quote/UpdateForwardingStockQuotes.html | 341 + docs/examples/je/rep/quote/package-frame.html | 30 + .../je/rep/quote/package-summary.html | 269 + docs/examples/je/rep/quote/package-tree.html | 155 + docs/examples/overview-tree.html | 159 + docs/examples/package-list | 1 + docs/examples/script.js | 30 + docs/examples/standard-stylesheet.css | 574 + docs/examples/style.css | 15 + docs/images/Oracle_BerkeleyDB_small.png | Bin 0 -> 1196 bytes docs/index.html | 118 + docs/installation.html | 151 + docs/java/allclasses-frame.html | 323 + docs/java/allclasses-noframe.html | 323 + .../com/sleepycat/bind/ByteArrayBinding.html | 328 + .../com/sleepycat/bind/EntityBinding.html | 303 + .../java/com/sleepycat/bind/EntryBinding.html | 275 + .../bind/class-use/ByteArrayBinding.html | 129 + .../bind/class-use/EntityBinding.html | 332 + .../bind/class-use/EntryBinding.html | 582 + .../com/sleepycat/bind/package-frame.html | 25 + .../com/sleepycat/bind/package-summary.html | 189 + .../java/com/sleepycat/bind/package-tree.html | 147 + docs/java/com/sleepycat/bind/package-use.html | 279 + .../sleepycat/bind/serial/ClassCatalog.html | 363 + .../com/sleepycat/bind/serial/SerialBase.html | 369 + .../sleepycat/bind/serial/SerialBinding.html | 450 + .../sleepycat/bind/serial/SerialInput.html | 423 + .../sleepycat/bind/serial/SerialOutput.html | 394 + .../bind/serial/SerialSerialBinding.html | 481 + .../bind/serial/SerialSerialKeyCreator.html | 548 + .../bind/serial/StoredClassCatalog.html | 424 + .../bind/serial/TupleSerialBinding.html | 530 + .../bind/serial/TupleSerialKeyCreator.html | 536 + .../serial/TupleSerialMarshalledBinding.html | 445 + .../TupleSerialMarshalledKeyCreator.html | 403 + .../bind/serial/class-use/ClassCatalog.html | 278 + .../bind/serial/class-use/SerialBase.html | 174 + .../bind/serial/class-use/SerialBinding.html | 243 + .../bind/serial/class-use/SerialInput.html | 129 + .../bind/serial/class-use/SerialOutput.html | 129 + .../serial/class-use/SerialSerialBinding.html | 129 + .../class-use/SerialSerialKeyCreator.html | 129 + .../serial/class-use/StoredClassCatalog.html | 129 + .../serial/class-use/TupleSerialBinding.html | 174 + .../class-use/TupleSerialKeyCreator.html | 173 + .../TupleSerialMarshalledBinding.html | 196 + .../TupleSerialMarshalledKeyCreator.html | 175 + .../sleepycat/bind/serial/package-frame.html | 34 + .../bind/serial/package-summary.html | 250 + .../sleepycat/bind/serial/package-tree.html | 197 + .../sleepycat/bind/serial/package-use.html | 231 + .../bind/tuple/BigDecimalBinding.html | 442 + .../bind/tuple/BigIntegerBinding.html | 435 + .../sleepycat/bind/tuple/BooleanBinding.html | 443 + .../com/sleepycat/bind/tuple/ByteBinding.html | 443 + .../bind/tuple/CharacterBinding.html | 443 + .../sleepycat/bind/tuple/DoubleBinding.html | 443 + .../sleepycat/bind/tuple/FloatBinding.html | 443 + .../sleepycat/bind/tuple/IntegerBinding.html | 443 + .../com/sleepycat/bind/tuple/LongBinding.html | 443 + .../bind/tuple/MarshalledTupleEntry.html | 271 + .../bind/tuple/MarshalledTupleKeyEntity.html | 331 + .../bind/tuple/PackedIntegerBinding.html | 445 + .../bind/tuple/PackedLongBinding.html | 445 + .../sleepycat/bind/tuple/ShortBinding.html | 443 + .../bind/tuple/SortedBigDecimalBinding.html | 442 + .../bind/tuple/SortedDoubleBinding.html | 442 + .../bind/tuple/SortedFloatBinding.html | 442 + .../tuple/SortedPackedIntegerBinding.html | 445 + .../bind/tuple/SortedPackedLongBinding.html | 445 + .../sleepycat/bind/tuple/StringBinding.html | 442 + .../com/sleepycat/bind/tuple/TupleBase.html | 492 + .../sleepycat/bind/tuple/TupleBinding.html | 450 + .../com/sleepycat/bind/tuple/TupleInput.html | 1303 ++ .../bind/tuple/TupleInputBinding.html | 332 + .../bind/tuple/TupleMarshalledBinding.html | 365 + .../com/sleepycat/bind/tuple/TupleOutput.html | 1110 ++ .../bind/tuple/TupleTupleBinding.html | 465 + .../bind/tuple/TupleTupleKeyCreator.html | 464 + .../tuple/TupleTupleMarshalledBinding.html | 403 + .../tuple/TupleTupleMarshalledKeyCreator.html | 382 + .../tuple/class-use/BigDecimalBinding.html | 129 + .../tuple/class-use/BigIntegerBinding.html | 129 + .../bind/tuple/class-use/BooleanBinding.html | 129 + .../bind/tuple/class-use/ByteBinding.html | 129 + .../tuple/class-use/CharacterBinding.html | 129 + .../bind/tuple/class-use/DoubleBinding.html | 129 + .../bind/tuple/class-use/FloatBinding.html | 129 + .../bind/tuple/class-use/IntegerBinding.html | 129 + .../bind/tuple/class-use/LongBinding.html | 129 + .../tuple/class-use/MarshalledTupleEntry.html | 188 + .../class-use/MarshalledTupleKeyEntity.html | 264 + .../tuple/class-use/PackedIntegerBinding.html | 129 + .../tuple/class-use/PackedLongBinding.html | 129 + .../bind/tuple/class-use/ShortBinding.html | 129 + .../class-use/SortedBigDecimalBinding.html | 129 + .../tuple/class-use/SortedDoubleBinding.html | 129 + .../tuple/class-use/SortedFloatBinding.html | 129 + .../class-use/SortedPackedIntegerBinding.html | 129 + .../class-use/SortedPackedLongBinding.html | 129 + .../bind/tuple/class-use/StringBinding.html | 129 + .../bind/tuple/class-use/TupleBase.html | 382 + .../bind/tuple/class-use/TupleBinding.html | 317 + .../bind/tuple/class-use/TupleInput.html | 382 + .../tuple/class-use/TupleInputBinding.html | 129 + .../class-use/TupleMarshalledBinding.html | 129 + .../bind/tuple/class-use/TupleOutput.html | 674 + .../tuple/class-use/TupleTupleBinding.html | 175 + .../tuple/class-use/TupleTupleKeyCreator.html | 173 + .../TupleTupleMarshalledBinding.html | 172 + .../TupleTupleMarshalledKeyCreator.html | 129 + .../sleepycat/bind/tuple/package-frame.html | 52 + .../sleepycat/bind/tuple/package-summary.html | 754 + .../sleepycat/bind/tuple/package-tree.html | 202 + .../com/sleepycat/bind/tuple/package-use.html | 281 + .../collections/CurrentTransaction.html | 437 + .../collections/MapEntryParameter.html | 443 + .../collections/PrimaryKeyAssigner.html | 245 + .../collections/StoredCollection.html | 948 ++ .../collections/StoredCollections.html | 476 + .../collections/StoredContainer.html | 599 + .../sleepycat/collections/StoredEntrySet.html | 460 + .../sleepycat/collections/StoredIterator.html | 807 ++ .../sleepycat/collections/StoredKeySet.html | 480 + .../com/sleepycat/collections/StoredMap.html | 1190 ++ .../collections/StoredSortedEntrySet.html | 638 + .../collections/StoredSortedKeySet.html | 704 + .../collections/StoredSortedMap.html | 792 + .../collections/StoredSortedValueSet.html | 703 + .../sleepycat/collections/StoredValueSet.html | 516 + .../collections/TransactionRunner.html | 649 + .../collections/TransactionWorker.html | 246 + .../collections/TupleSerialFactory.html | 423 + .../class-use/CurrentTransaction.html | 174 + .../class-use/MapEntryParameter.html | 129 + .../class-use/PrimaryKeyAssigner.html | 198 + .../class-use/StoredCollection.html | 222 + .../class-use/StoredCollections.html | 129 + .../class-use/StoredContainer.html | 243 + .../collections/class-use/StoredEntrySet.html | 173 + .../collections/class-use/StoredIterator.html | 199 + .../collections/class-use/StoredKeySet.html | 174 + .../collections/class-use/StoredMap.html | 191 + .../class-use/StoredSortedEntrySet.html | 129 + .../class-use/StoredSortedKeySet.html | 129 + .../class-use/StoredSortedMap.html | 176 + .../class-use/StoredSortedValueSet.html | 129 + .../collections/class-use/StoredValueSet.html | 174 + .../class-use/TransactionRunner.html | 129 + .../class-use/TransactionWorker.html | 174 + .../class-use/TupleSerialFactory.html | 129 + .../sleepycat/collections/package-frame.html | 40 + .../collections/package-summary.html | 282 + .../sleepycat/collections/package-tree.html | 180 + .../sleepycat/collections/package-use.html | 219 + .../je/BinaryEqualityComparator.html | 225 + docs/java/com/sleepycat/je/BtreeStats.html | 668 + docs/java/com/sleepycat/je/CacheMode.html | 723 + .../com/sleepycat/je/CheckpointConfig.html | 541 + docs/java/com/sleepycat/je/CommitToken.html | 352 + docs/java/com/sleepycat/je/Cursor.html | 1975 +++ docs/java/com/sleepycat/je/CursorConfig.html | 608 + docs/java/com/sleepycat/je/CustomStats.html | 264 + docs/java/com/sleepycat/je/Database.html | 1550 ++ .../com/sleepycat/je/DatabaseComparator.html | 254 + .../java/com/sleepycat/je/DatabaseConfig.html | 1737 +++ docs/java/com/sleepycat/je/DatabaseEntry.html | 908 ++ .../com/sleepycat/je/DatabaseException.html | 309 + .../sleepycat/je/DatabaseExistsException.html | 258 + .../je/DatabaseNotFoundException.html | 254 + docs/java/com/sleepycat/je/DatabaseStats.html | 258 + .../com/sleepycat/je/DeadlockException.html | 291 + .../je/DeleteConstraintException.html | 286 + .../com/sleepycat/je/DiskLimitException.html | 257 + .../com/sleepycat/je/DiskOrderedCursor.html | 552 + .../sleepycat/je/DiskOrderedCursorConfig.html | 698 + .../DiskOrderedCursorProducerException.html | 254 + .../sleepycat/je/DuplicateDataException.html | 262 + .../je/Durability.ReplicaAckPolicy.html | 422 + .../sleepycat/je/Durability.SyncPolicy.html | 394 + docs/java/com/sleepycat/je/Durability.html | 590 + docs/java/com/sleepycat/je/Environment.html | 1749 +++ .../com/sleepycat/je/EnvironmentConfig.html | 7254 +++++++++ .../je/EnvironmentFailureException.html | 389 + .../je/EnvironmentLockedException.html | 260 + .../je/EnvironmentMutableConfig.html | 875 ++ .../je/EnvironmentNotFoundException.html | 259 + .../com/sleepycat/je/EnvironmentStats.html | 5941 ++++++++ .../je/EnvironmentWedgedException.html | 278 + .../java/com/sleepycat/je/ExceptionEvent.html | 328 + .../com/sleepycat/je/ExceptionListener.html | 236 + .../je/ForeignConstraintException.html | 283 + .../sleepycat/je/ForeignKeyDeleteAction.html | 408 + .../com/sleepycat/je/ForeignKeyNullifier.html | 271 + .../je/ForeignMultiKeyNullifier.html | 272 + docs/java/com/sleepycat/je/ForwardCursor.html | 423 + docs/java/com/sleepycat/je/Get.html | 689 + docs/java/com/sleepycat/je/JEVersion.html | 484 + docs/java/com/sleepycat/je/JoinConfig.html | 436 + docs/java/com/sleepycat/je/JoinCursor.html | 558 + .../sleepycat/je/LockConflictException.html | 420 + docs/java/com/sleepycat/je/LockMode.html | 704 + .../je/LockNotAvailableException.html | 273 + .../sleepycat/je/LockNotGrantedException.html | 284 + docs/java/com/sleepycat/je/LockStats.html | 534 + .../sleepycat/je/LockTimeoutException.html | 285 + .../com/sleepycat/je/LogWriteException.html | 266 + .../je/OperationFailureException.html | 404 + .../com/sleepycat/je/OperationResult.html | 299 + .../com/sleepycat/je/OperationStatus.html | 406 + .../com/sleepycat/je/PartialComparator.html | 200 + .../sleepycat/je/PreloadConfig.Phases.html | 343 + docs/java/com/sleepycat/je/PreloadConfig.html | 631 + docs/java/com/sleepycat/je/PreloadStats.html | 427 + docs/java/com/sleepycat/je/PreloadStatus.html | 385 + .../com/sleepycat/je/ProgressListener.html | 288 + docs/java/com/sleepycat/je/Put.html | 441 + docs/java/com/sleepycat/je/ReadOptions.html | 388 + .../com/sleepycat/je/RecoveryProgress.html | 620 + .../je/ReplicaConsistencyPolicy.html | 270 + .../sleepycat/je/RunRecoveryException.html | 263 + .../com/sleepycat/je/SecondaryConfig.html | 864 ++ .../je/SecondaryConstraintException.html | 274 + .../com/sleepycat/je/SecondaryCursor.html | 2142 +++ .../com/sleepycat/je/SecondaryDatabase.html | 1171 ++ .../je/SecondaryIntegrityException.html | 300 + .../com/sleepycat/je/SecondaryKeyCreator.html | 342 + .../je/SecondaryMultiKeyCreator.html | 342 + .../je/SecondaryReferenceException.html | 365 + docs/java/com/sleepycat/je/Sequence.html | 409 + .../java/com/sleepycat/je/SequenceConfig.html | 811 ++ .../sleepycat/je/SequenceExistsException.html | 257 + .../je/SequenceIntegrityException.html | 256 + .../je/SequenceNotFoundException.html | 257 + .../je/SequenceOverflowException.html | 256 + docs/java/com/sleepycat/je/SequenceStats.html | 432 + docs/java/com/sleepycat/je/StatsConfig.html | 554 + .../je/ThreadInterruptedException.html | 292 + .../com/sleepycat/je/Transaction.State.html | 444 + docs/java/com/sleepycat/je/Transaction.html | 1020 ++ .../com/sleepycat/je/TransactionConfig.html | 976 ++ .../sleepycat/je/TransactionStats.Active.html | 308 + .../com/sleepycat/je/TransactionStats.html | 422 + .../je/TransactionTimeoutException.html | 284 + .../je/UniqueConstraintException.html | 284 + docs/java/com/sleepycat/je/VerifyConfig.html | 776 + .../je/VersionMismatchException.html | 263 + docs/java/com/sleepycat/je/WriteOptions.html | 804 + docs/java/com/sleepycat/je/XAEnvironment.html | 517 + .../com/sleepycat/je/XAFailureException.html | 257 + .../class-use/BinaryEqualityComparator.html | 129 + .../sleepycat/je/class-use/BtreeStats.html | 129 + .../com/sleepycat/je/class-use/CacheMode.html | 302 + .../je/class-use/CheckpointConfig.html | 228 + .../sleepycat/je/class-use/CommitToken.html | 234 + .../com/sleepycat/je/class-use/Cursor.html | 221 + .../sleepycat/je/class-use/CursorConfig.html | 413 + .../sleepycat/je/class-use/CustomStats.html | 189 + .../com/sleepycat/je/class-use/Database.html | 582 + .../je/class-use/DatabaseComparator.html | 129 + .../je/class-use/DatabaseConfig.html | 438 + .../sleepycat/je/class-use/DatabaseEntry.html | 1532 ++ .../je/class-use/DatabaseException.html | 1964 +++ .../je/class-use/DatabaseExistsException.html | 185 + .../class-use/DatabaseNotFoundException.html | 240 + .../sleepycat/je/class-use/DatabaseStats.html | 195 + .../je/class-use/DeadlockException.html | 176 + .../class-use/DeleteConstraintException.html | 129 + .../je/class-use/DiskLimitException.html | 129 + .../je/class-use/DiskOrderedCursor.html | 183 + .../je/class-use/DiskOrderedCursorConfig.html | 272 + .../DiskOrderedCursorProducerException.html | 129 + .../je/class-use/DuplicateDataException.html | 129 + .../Durability.ReplicaAckPolicy.html | 247 + .../je/class-use/Durability.SyncPolicy.html | 210 + .../sleepycat/je/class-use/Durability.html | 251 + .../sleepycat/je/class-use/Environment.html | 661 + .../je/class-use/EnvironmentConfig.html | 411 + .../EnvironmentFailureException.html | 416 + .../class-use/EnvironmentLockedException.html | 296 + .../class-use/EnvironmentMutableConfig.html | 271 + .../EnvironmentNotFoundException.html | 296 + .../je/class-use/EnvironmentStats.html | 174 + .../class-use/EnvironmentWedgedException.html | 129 + .../je/class-use/ExceptionEvent.html | 174 + .../je/class-use/ExceptionListener.html | 189 + .../class-use/ForeignConstraintException.html | 129 + .../je/class-use/ForeignKeyDeleteAction.html | 204 + .../je/class-use/ForeignKeyNullifier.html | 261 + .../class-use/ForeignMultiKeyNullifier.html | 191 + .../sleepycat/je/class-use/ForwardCursor.html | 194 + docs/java/com/sleepycat/je/class-use/Get.html | 332 + .../com/sleepycat/je/class-use/JEVersion.html | 215 + .../sleepycat/je/class-use/JoinConfig.html | 254 + .../sleepycat/je/class-use/JoinCursor.html | 183 + .../je/class-use/LockConflictException.html | 230 + .../com/sleepycat/je/class-use/LockMode.html | 826 ++ .../class-use/LockNotAvailableException.html | 129 + .../je/class-use/LockNotGrantedException.html | 129 + .../com/sleepycat/je/class-use/LockStats.html | 176 + .../je/class-use/LockTimeoutException.html | 129 + .../je/class-use/LogWriteException.html | 129 + .../class-use/OperationFailureException.html | 526 + .../je/class-use/OperationResult.html | 387 + .../je/class-use/OperationStatus.html | 778 + .../je/class-use/PartialComparator.html | 129 + .../je/class-use/PreloadConfig.Phases.html | 211 + .../sleepycat/je/class-use/PreloadConfig.html | 233 + .../sleepycat/je/class-use/PreloadStats.html | 181 + .../sleepycat/je/class-use/PreloadStatus.html | 211 + .../je/class-use/ProgressListener.html | 245 + docs/java/com/sleepycat/je/class-use/Put.html | 261 + .../sleepycat/je/class-use/ReadOptions.html | 342 + .../je/class-use/RecoveryProgress.html | 212 + .../class-use/ReplicaConsistencyPolicy.html | 291 + .../je/class-use/RunRecoveryException.html | 292 + .../je/class-use/SecondaryConfig.html | 349 + .../SecondaryConstraintException.html | 192 + .../je/class-use/SecondaryCursor.html | 199 + .../je/class-use/SecondaryDatabase.html | 399 + .../SecondaryIntegrityException.html | 129 + .../je/class-use/SecondaryKeyCreator.html | 261 + .../class-use/SecondaryMultiKeyCreator.html | 191 + .../SecondaryReferenceException.html | 207 + .../com/sleepycat/je/class-use/Sequence.html | 204 + .../je/class-use/SequenceConfig.html | 303 + .../je/class-use/SequenceExistsException.html | 129 + .../class-use/SequenceIntegrityException.html | 129 + .../class-use/SequenceNotFoundException.html | 129 + .../class-use/SequenceOverflowException.html | 129 + .../sleepycat/je/class-use/SequenceStats.html | 174 + .../sleepycat/je/class-use/StatsConfig.html | 347 + .../class-use/ThreadInterruptedException.html | 129 + .../je/class-use/Transaction.State.html | 187 + .../sleepycat/je/class-use/Transaction.html | 741 + .../je/class-use/TransactionConfig.html | 378 + .../je/class-use/TransactionStats.Active.html | 174 + .../je/class-use/TransactionStats.html | 174 + .../TransactionTimeoutException.html | 129 + .../class-use/UniqueConstraintException.html | 129 + .../sleepycat/je/class-use/VerifyConfig.html | 268 + .../class-use/VersionMismatchException.html | 173 + .../sleepycat/je/class-use/WriteOptions.html | 340 + .../sleepycat/je/class-use/XAEnvironment.html | 129 + .../je/class-use/XAFailureException.html | 129 + .../com/sleepycat/je/jca/ra/JEConnection.html | 417 + .../je/jca/ra/JEConnectionFactory.html | 286 + .../com/sleepycat/je/jca/ra/JEException.html | 267 + .../je/jca/ra/class-use/JEConnection.html | 181 + .../jca/ra/class-use/JEConnectionFactory.html | 129 + .../je/jca/ra/class-use/JEException.html | 181 + .../sleepycat/je/jca/ra/package-frame.html | 28 + .../sleepycat/je/jca/ra/package-summary.html | 219 + .../com/sleepycat/je/jca/ra/package-tree.html | 168 + .../com/sleepycat/je/jca/ra/package-use.html | 178 + .../com/sleepycat/je/jmx/JEDiagnostics.html | 656 + docs/java/com/sleepycat/je/jmx/JEMBean.html | 629 + .../com/sleepycat/je/jmx/JEMBeanHelper.html | 805 + docs/java/com/sleepycat/je/jmx/JEMonitor.html | 674 + .../je/jmx/class-use/JEDiagnostics.html | 129 + .../sleepycat/je/jmx/class-use/JEMBean.html | 182 + .../je/jmx/class-use/JEMBeanHelper.html | 129 + .../sleepycat/je/jmx/class-use/JEMonitor.html | 129 + .../com/sleepycat/je/jmx/package-frame.html | 23 + .../com/sleepycat/je/jmx/package-summary.html | 186 + .../com/sleepycat/je/jmx/package-tree.html | 148 + .../com/sleepycat/je/jmx/package-use.html | 164 + docs/java/com/sleepycat/je/package-frame.html | 123 + .../com/sleepycat/je/package-summary.html | 852 ++ docs/java/com/sleepycat/je/package-tree.html | 321 + docs/java/com/sleepycat/je/package-use.html | 1250 ++ .../com/sleepycat/je/rep/AppStateMonitor.html | 274 + .../je/rep/CommitPointConsistencyPolicy.html | 498 + .../je/rep/DatabasePreemptedException.html | 349 + .../je/rep/GroupShutdownException.html | 257 + .../je/rep/InsufficientAcksException.html | 372 + .../je/rep/InsufficientLogException.html | 344 + .../je/rep/InsufficientReplicasException.html | 393 + .../je/rep/LockPreemptedException.html | 278 + .../je/rep/LogOverwriteException.html | 267 + .../rep/MasterReplicaTransitionException.html | 318 + .../je/rep/MasterStateException.html | 264 + .../rep/MasterTransferFailureException.html | 251 + .../je/rep/MemberNotFoundException.html | 251 + .../com/sleepycat/je/rep/NetworkRestore.html | 361 + .../je/rep/NetworkRestoreConfig.html | 427 + .../je/rep/NoConsistencyRequiredPolicy.html | 435 + docs/java/com/sleepycat/je/rep/NodeState.html | 521 + docs/java/com/sleepycat/je/rep/NodeType.html | 516 + .../com/sleepycat/je/rep/QuorumPolicy.html | 385 + .../je/rep/ReplicaConsistencyException.html | 364 + .../je/rep/ReplicaStateException.html | 264 + .../je/rep/ReplicaWriteException.html | 272 + .../je/rep/ReplicatedEnvironment.State.html | 518 + .../je/rep/ReplicatedEnvironment.html | 1293 ++ .../je/rep/ReplicatedEnvironmentStats.html | 1329 ++ .../sleepycat/je/rep/ReplicationConfig.html | 2412 +++ .../sleepycat/je/rep/ReplicationGroup.html | 462 + .../je/rep/ReplicationMutableConfig.html | 1005 ++ .../com/sleepycat/je/rep/ReplicationNode.html | 316 + .../je/rep/RestartRequiredException.html | 360 + .../sleepycat/je/rep/RollbackException.html | 358 + .../je/rep/RollbackProhibitedException.html | 397 + .../sleepycat/je/rep/StateChangeEvent.html | 313 + .../je/rep/StateChangeException.html | 349 + .../sleepycat/je/rep/StateChangeListener.html | 262 + .../com/sleepycat/je/rep/SyncupProgress.html | 402 + .../je/rep/TimeConsistencyPolicy.html | 478 + .../je/rep/UnknownMasterException.html | 351 + .../com/sleepycat/je/rep/arbiter/Arbiter.html | 406 + .../je/rep/arbiter/ArbiterConfig.html | 680 + .../je/rep/arbiter/ArbiterMutableConfig.html | 473 + .../je/rep/arbiter/ArbiterStats.html | 376 + .../je/rep/arbiter/class-use/Arbiter.html | 129 + .../rep/arbiter/class-use/ArbiterConfig.html | 228 + .../class-use/ArbiterMutableConfig.html | 233 + .../rep/arbiter/class-use/ArbiterStats.html | 174 + .../je/rep/arbiter/package-frame.html | 23 + .../je/rep/arbiter/package-summary.html | 179 + .../je/rep/arbiter/package-tree.html | 148 + .../sleepycat/je/rep/arbiter/package-use.html | 177 + .../je/rep/class-use/AppStateMonitor.html | 176 + .../CommitPointConsistencyPolicy.html | 129 + .../class-use/DatabasePreemptedException.html | 129 + .../rep/class-use/GroupShutdownException.html | 129 + .../class-use/InsufficientAcksException.html | 129 + .../class-use/InsufficientLogException.html | 202 + .../InsufficientReplicasException.html | 129 + .../rep/class-use/LockPreemptedException.html | 129 + .../rep/class-use/LogOverwriteException.html | 129 + .../MasterReplicaTransitionException.html | 129 + .../rep/class-use/MasterStateException.html | 183 + .../MasterTransferFailureException.html | 177 + .../class-use/MemberNotFoundException.html | 183 + .../je/rep/class-use/NetworkRestore.html | 129 + .../rep/class-use/NetworkRestoreConfig.html | 207 + .../NoConsistencyRequiredPolicy.html | 175 + .../sleepycat/je/rep/class-use/NodeState.html | 180 + .../sleepycat/je/rep/class-use/NodeType.html | 209 + .../je/rep/class-use/QuorumPolicy.html | 200 + .../ReplicaConsistencyException.html | 186 + .../rep/class-use/ReplicaStateException.html | 176 + .../rep/class-use/ReplicaWriteException.html | 129 + .../ReplicatedEnvironment.State.html | 229 + .../rep/class-use/ReplicatedEnvironment.html | 129 + .../class-use/ReplicatedEnvironmentStats.html | 175 + .../je/rep/class-use/ReplicationConfig.html | 294 + .../je/rep/class-use/ReplicationGroup.html | 235 + .../class-use/ReplicationMutableConfig.html | 233 + .../je/rep/class-use/ReplicationNode.html | 329 + .../class-use/RestartRequiredException.html | 217 + .../je/rep/class-use/RollbackException.html | 176 + .../RollbackProhibitedException.html | 129 + .../je/rep/class-use/StateChangeEvent.html | 202 + .../rep/class-use/StateChangeException.html | 200 + .../je/rep/class-use/StateChangeListener.html | 192 + .../je/rep/class-use/SyncupProgress.html | 212 + .../rep/class-use/TimeConsistencyPolicy.html | 129 + .../rep/class-use/UnknownMasterException.html | 240 + .../GroupChangeEvent.GroupChangeType.html | 357 + .../je/rep/monitor/GroupChangeEvent.html | 322 + .../je/rep/monitor/JoinGroupEvent.html | 293 + .../monitor/LeaveGroupEvent.LeaveReason.html | 372 + .../je/rep/monitor/LeaveGroupEvent.html | 348 + .../je/rep/monitor/MemberChangeEvent.html | 264 + .../com/sleepycat/je/rep/monitor/Monitor.html | 594 + .../je/rep/monitor/MonitorChangeEvent.html | 254 + .../je/rep/monitor/MonitorChangeListener.html | 329 + .../je/rep/monitor/MonitorConfig.html | 706 + .../je/rep/monitor/MonitorConfigBeanInfo.html | 351 + .../je/rep/monitor/NewMasterEvent.html | 288 + .../GroupChangeEvent.GroupChangeType.html | 189 + .../monitor/class-use/GroupChangeEvent.html | 176 + .../rep/monitor/class-use/JoinGroupEvent.html | 177 + .../LeaveGroupEvent.LeaveReason.html | 188 + .../monitor/class-use/LeaveGroupEvent.html | 176 + .../monitor/class-use/MemberChangeEvent.html | 187 + .../je/rep/monitor/class-use/Monitor.html | 129 + .../monitor/class-use/MonitorChangeEvent.html | 199 + .../class-use/MonitorChangeListener.html | 176 + .../rep/monitor/class-use/MonitorConfig.html | 250 + .../class-use/MonitorConfigBeanInfo.html | 129 + .../rep/monitor/class-use/NewMasterEvent.html | 176 + .../je/rep/monitor/package-frame.html | 37 + .../je/rep/monitor/package-summary.html | 261 + .../je/rep/monitor/package-tree.html | 181 + .../sleepycat/je/rep/monitor/package-use.html | 214 + .../com/sleepycat/je/rep/package-frame.html | 66 + .../com/sleepycat/je/rep/package-summary.html | 553 + .../com/sleepycat/je/rep/package-tree.html | 238 + .../com/sleepycat/je/rep/package-use.html | 412 + .../sleepycat/je/rep/util/AtomicLongMax.html | 316 + .../je/rep/util/DbEnableReplication.html | 394 + .../sleepycat/je/rep/util/DbGroupAdmin.html | 429 + .../com/sleepycat/je/rep/util/DbPing.html | 334 + .../je/rep/util/DbResetRepGroup.html | 416 + .../je/rep/util/ReplicationGroupAdmin.html | 596 + .../je/rep/util/class-use/AtomicLongMax.html | 129 + .../util/class-use/DbEnableReplication.html | 129 + .../je/rep/util/class-use/DbGroupAdmin.html | 129 + .../je/rep/util/class-use/DbPing.html | 129 + .../rep/util/class-use/DbResetRepGroup.html | 129 + .../util/class-use/ReplicationGroupAdmin.html | 129 + .../sleepycat/je/rep/util/package-frame.html | 25 + .../je/rep/util/package-summary.html | 203 + .../sleepycat/je/rep/util/package-tree.html | 147 + .../sleepycat/je/rep/util/package-use.html | 129 + .../com/sleepycat/je/util/ConsoleHandler.html | 298 + docs/java/com/sleepycat/je/util/DbBackup.html | 868 ++ .../com/sleepycat/je/util/DbCacheSize.html | 674 + .../je/util/DbDeleteReservedFiles.html | 279 + docs/java/com/sleepycat/je/util/DbDump.html | 722 + .../com/sleepycat/je/util/DbFilterStats.html | 328 + docs/java/com/sleepycat/je/util/DbLoad.html | 614 + .../com/sleepycat/je/util/DbPrintLog.html | 361 + .../com/sleepycat/je/util/DbScavenger.html | 371 + docs/java/com/sleepycat/je/util/DbSpace.html | 403 + docs/java/com/sleepycat/je/util/DbStat.html | 313 + .../com/sleepycat/je/util/DbTruncateLog.html | 316 + docs/java/com/sleepycat/je/util/DbVerify.html | 389 + .../com/sleepycat/je/util/DbVerifyLog.html | 421 + .../com/sleepycat/je/util/FileHandler.html | 351 + .../je/util/LogVerificationException.html | 291 + .../je/util/LogVerificationInputStream.html | 528 + .../LogVerificationReadableByteChannel.html | 430 + docs/java/com/sleepycat/je/util/Splitter.html | 280 + .../je/util/class-use/ConsoleHandler.html | 129 + .../sleepycat/je/util/class-use/DbBackup.html | 129 + .../je/util/class-use/DbCacheSize.html | 129 + .../util/class-use/DbDeleteReservedFiles.html | 129 + .../sleepycat/je/util/class-use/DbDump.html | 173 + .../je/util/class-use/DbFilterStats.html | 129 + .../sleepycat/je/util/class-use/DbLoad.html | 129 + .../je/util/class-use/DbPrintLog.html | 129 + .../je/util/class-use/DbScavenger.html | 129 + .../sleepycat/je/util/class-use/DbSpace.html | 129 + .../sleepycat/je/util/class-use/DbStat.html | 129 + .../je/util/class-use/DbTruncateLog.html | 129 + .../sleepycat/je/util/class-use/DbVerify.html | 171 + .../je/util/class-use/DbVerifyLog.html | 129 + .../je/util/class-use/FileHandler.html | 129 + .../class-use/LogVerificationException.html | 180 + .../class-use/LogVerificationInputStream.html | 129 + .../LogVerificationReadableByteChannel.html | 129 + .../sleepycat/je/util/class-use/Splitter.html | 129 + .../com/sleepycat/je/util/package-frame.html | 41 + .../sleepycat/je/util/package-summary.html | 294 + .../com/sleepycat/je/util/package-tree.html | 198 + .../com/sleepycat/je/util/package-use.html | 177 + .../com/sleepycat/persist/EntityCursor.html | 1666 +++ .../com/sleepycat/persist/EntityIndex.html | 1653 +++ .../com/sleepycat/persist/EntityJoin.html | 501 + .../com/sleepycat/persist/EntityResult.html | 273 + .../com/sleepycat/persist/EntityStore.html | 1288 ++ .../com/sleepycat/persist/ForwardCursor.html | 398 + .../persist/IndexNotAvailableException.html | 276 + .../com/sleepycat/persist/PrimaryIndex.html | 1785 +++ .../com/sleepycat/persist/SecondaryIndex.html | 2097 +++ .../com/sleepycat/persist/StoreConfig.html | 889 ++ .../persist/StoreConfigBeanInfo.html | 351 + .../persist/StoreExistsException.html | 253 + .../persist/StoreNotFoundException.html | 253 + .../persist/class-use/EntityCursor.html | 240 + .../persist/class-use/EntityIndex.html | 202 + .../persist/class-use/EntityJoin.html | 129 + .../persist/class-use/EntityResult.html | 200 + .../persist/class-use/EntityStore.html | 129 + .../persist/class-use/ForwardCursor.html | 212 + .../class-use/IndexNotAvailableException.html | 129 + .../persist/class-use/PrimaryIndex.html | 258 + .../persist/class-use/SecondaryIndex.html | 231 + .../persist/class-use/StoreConfig.html | 321 + .../class-use/StoreConfigBeanInfo.html | 129 + .../class-use/StoreExistsException.html | 174 + .../class-use/StoreNotFoundException.html | 200 + .../sleepycat/persist/evolve/Conversion.html | 682 + .../sleepycat/persist/evolve/Converter.html | 446 + .../persist/evolve/DeletedClassException.html | 254 + .../com/sleepycat/persist/evolve/Deleter.html | 396 + .../persist/evolve/EntityConverter.html | 405 + .../persist/evolve/EvolveConfig.html | 409 + .../persist/evolve/EvolveConfigBeanInfo.html | 351 + .../sleepycat/persist/evolve/EvolveEvent.html | 277 + .../persist/evolve/EvolveListener.html | 242 + .../sleepycat/persist/evolve/EvolveStats.html | 276 + .../evolve/IncompatibleClassException.html | 305 + .../sleepycat/persist/evolve/Mutation.html | 364 + .../sleepycat/persist/evolve/Mutations.html | 587 + .../com/sleepycat/persist/evolve/Renamer.html | 446 + .../persist/evolve/class-use/Conversion.html | 208 + .../persist/evolve/class-use/Converter.html | 221 + .../class-use/DeletedClassException.html | 129 + .../persist/evolve/class-use/Deleter.html | 206 + .../evolve/class-use/EntityConverter.html | 129 + .../evolve/class-use/EvolveConfig.html | 221 + .../class-use/EvolveConfigBeanInfo.html | 129 + .../persist/evolve/class-use/EvolveEvent.html | 173 + .../evolve/class-use/EvolveListener.html | 189 + .../persist/evolve/class-use/EvolveStats.html | 201 + .../class-use/IncompatibleClassException.html | 174 + .../persist/evolve/class-use/Mutation.html | 193 + .../persist/evolve/class-use/Mutations.html | 224 + .../persist/evolve/class-use/Renamer.html | 206 + .../persist/evolve/package-frame.html | 39 + .../persist/evolve/package-summary.html | 624 + .../persist/evolve/package-tree.html | 196 + .../sleepycat/persist/evolve/package-use.html | 273 + .../persist/model/AnnotationModel.html | 400 + .../persist/model/ClassEnhancer.html | 487 + .../persist/model/ClassEnhancerTask.html | 404 + .../persist/model/ClassMetadata.html | 569 + .../sleepycat/persist/model/DeleteAction.html | 390 + .../com/sleepycat/persist/model/Entity.html | 447 + .../persist/model/EntityMetadata.html | 393 + .../sleepycat/persist/model/EntityModel.html | 681 + .../persist/model/FieldMetadata.html | 408 + .../com/sleepycat/persist/model/KeyField.html | 323 + .../persist/model/NotPersistent.html | 194 + .../sleepycat/persist/model/NotTransient.html | 194 + .../sleepycat/persist/model/Persistent.html | 271 + .../persist/model/PersistentProxy.html | 356 + .../sleepycat/persist/model/PrimaryKey.html | 376 + .../persist/model/PrimaryKeyMetadata.html | 362 + .../sleepycat/persist/model/Relationship.html | 411 + .../sleepycat/persist/model/SecondaryKey.html | 495 + .../persist/model/SecondaryKeyMetadata.html | 463 + .../model/class-use/AnnotationModel.html | 129 + .../model/class-use/ClassEnhancer.html | 129 + .../model/class-use/ClassEnhancerTask.html | 129 + .../model/class-use/ClassMetadata.html | 205 + .../persist/model/class-use/DeleteAction.html | 207 + .../persist/model/class-use/Entity.html | 129 + .../model/class-use/EntityMetadata.html | 204 + .../persist/model/class-use/EntityModel.html | 274 + .../model/class-use/FieldMetadata.html | 246 + .../persist/model/class-use/KeyField.html | 129 + .../model/class-use/NotPersistent.html | 129 + .../persist/model/class-use/NotTransient.html | 129 + .../persist/model/class-use/Persistent.html | 129 + .../model/class-use/PersistentProxy.html | 129 + .../persist/model/class-use/PrimaryKey.html | 129 + .../model/class-use/PrimaryKeyMetadata.html | 218 + .../persist/model/class-use/Relationship.html | 207 + .../persist/model/class-use/SecondaryKey.html | 129 + .../model/class-use/SecondaryKeyMetadata.html | 220 + .../persist/model/package-frame.html | 47 + .../persist/model/package-summary.html | 310 + .../sleepycat/persist/model/package-tree.html | 191 + .../sleepycat/persist/model/package-use.html | 283 + .../com/sleepycat/persist/package-frame.html | 38 + .../sleepycat/persist/package-summary.html | 837 ++ .../com/sleepycat/persist/package-tree.html | 205 + .../com/sleepycat/persist/package-use.html | 251 + .../com/sleepycat/persist/raw/RawField.html | 263 + .../com/sleepycat/persist/raw/RawObject.html | 525 + .../com/sleepycat/persist/raw/RawStore.html | 502 + .../com/sleepycat/persist/raw/RawType.html | 606 + .../persist/raw/class-use/RawField.html | 175 + .../persist/raw/class-use/RawObject.html | 240 + .../persist/raw/class-use/RawStore.html | 129 + .../persist/raw/class-use/RawType.html | 279 + .../sleepycat/persist/raw/package-frame.html | 26 + .../persist/raw/package-summary.html | 188 + .../sleepycat/persist/raw/package-tree.html | 148 + .../sleepycat/persist/raw/package-use.html | 206 + .../sleepycat/util/ClassResolver.Stream.html | 371 + .../com/sleepycat/util/ClassResolver.html | 329 + .../sleepycat/util/ConfigBeanInfoBase.html | 570 + .../sleepycat/util/ExceptionUnwrapper.html | 320 + .../com/sleepycat/util/ExceptionWrapper.html | 270 + .../com/sleepycat/util/FastInputStream.html | 710 + .../com/sleepycat/util/FastOutputStream.html | 783 + .../sleepycat/util/IOExceptionWrapper.html | 353 + .../com/sleepycat/util/PackedInteger.html | 763 + .../util/RuntimeExceptionWrapper.html | 353 + docs/java/com/sleepycat/util/UtfOps.html | 554 + .../util/class-use/ClassResolver.Stream.html | 174 + .../util/class-use/ClassResolver.html | 129 + .../util/class-use/ConfigBeanInfoBase.html | 222 + .../util/class-use/ExceptionUnwrapper.html | 129 + .../util/class-use/ExceptionWrapper.html | 179 + .../util/class-use/FastInputStream.html | 174 + .../util/class-use/FastOutputStream.html | 201 + .../util/class-use/IOExceptionWrapper.html | 129 + .../util/class-use/PackedInteger.html | 129 + .../class-use/RuntimeExceptionWrapper.html | 129 + .../com/sleepycat/util/class-use/UtfOps.html | 129 + .../com/sleepycat/util/package-frame.html | 36 + .../com/sleepycat/util/package-summary.html | 243 + .../java/com/sleepycat/util/package-tree.html | 187 + docs/java/com/sleepycat/util/package-use.html | 292 + docs/java/constant-values.html | 1836 +++ docs/java/deprecated-list.html | 1015 ++ docs/java/help-doc.html | 234 + docs/java/index-all.html | 12102 ++++++++++++++++ docs/java/index.html | 75 + docs/java/overview-frame.html | 39 + docs/java/overview-summary.html | 270 + docs/java/overview-tree.html | 720 + docs/java/package-list | 17 + docs/java/script.js | 30 + docs/java/serialized-form.html | 1820 +++ docs/java/standard-stylesheet.css | 574 + docs/java/style.css | 15 + docs/jconsole/Choose-MBean.JPG | Bin 0 -> 82411 bytes docs/jconsole/Choose-group.JPG | Bin 0 -> 56467 bytes docs/jconsole/Display-cumulative-stats.JPG | Bin 0 -> 77962 bytes docs/jconsole/Graph-stat.JPG | Bin 0 -> 77807 bytes docs/jconsole/Interval-setting.JPG | Bin 0 -> 77767 bytes docs/jconsole/JConsole-plugin.html | 407 + docs/jconsole/JEDiagnostics-attributes.JPG | Bin 0 -> 54025 bytes docs/jconsole/JEDiagnostics-operations.JPG | Bin 0 -> 48473 bytes docs/jconsole/JEMonitor-attributes.JPG | Bin 0 -> 63660 bytes docs/jconsole/JEMonitor-operations.JPG | Bin 0 -> 63270 bytes docs/jconsole/JEStats-plugin.JPG | Bin 0 -> 78574 bytes docs/jconsole/MBean-operations.JPG | Bin 0 -> 60617 bytes docs/jconsole/Mutable-configs.JPG | Bin 0 -> 56813 bytes docs/jconsole/Non-zero.JPG | Bin 0 -> 77433 bytes docs/jconsole/RepJEMonitor-operations.JPG | Bin 0 -> 67624 bytes docs/jconsole/RepJEStats-plugin.JPG | Bin 0 -> 86939 bytes docs/jconsole/Save-log.JPG | Bin 0 -> 70152 bytes docs/jconsole/Show-graph.JPG | Bin 0 -> 77543 bytes docs/jconsole/Show-tips.JPG | Bin 0 -> 82273 bytes docs/jconsole/Start-record.JPG | Bin 0 -> 56396 bytes docs/jconsole/Stop-record.JPG | Bin 0 -> 61976 bytes docs/jconsole/Unlog-stat.JPG | Bin 0 -> 57587 bytes docs/relnotes.html | 80 + docs/sleepycat-idoc.css | 56 + docs/sleepycat/legal.html | 41 + docs/sleepycat/license_je.html | 24 + docs/traceLogging.html | 109 + .../collections/access/AccessExample.java | 276 + .../collections/hello/HelloDatabaseWorld.java | 157 + examples/collections/ship/basic/PartData.java | 69 + examples/collections/ship/basic/PartKey.java | 45 + examples/collections/ship/basic/Sample.java | 256 + .../ship/basic/SampleDatabase.java | 133 + .../collections/ship/basic/SampleViews.java | 127 + .../collections/ship/basic/ShipmentData.java | 46 + .../collections/ship/basic/ShipmentKey.java | 53 + .../collections/ship/basic/SupplierData.java | 62 + .../collections/ship/basic/SupplierKey.java | 45 + examples/collections/ship/basic/Weight.java | 54 + examples/collections/ship/entity/Part.java | 77 + .../collections/ship/entity/PartData.java | 70 + examples/collections/ship/entity/PartKey.java | 45 + examples/collections/ship/entity/Sample.java | 237 + .../ship/entity/SampleDatabase.java | 326 + .../collections/ship/entity/SampleViews.java | 311 + .../collections/ship/entity/Shipment.java | 60 + .../collections/ship/entity/ShipmentData.java | 47 + .../collections/ship/entity/ShipmentKey.java | 53 + .../collections/ship/entity/Supplier.java | 68 + .../collections/ship/entity/SupplierData.java | 63 + .../collections/ship/entity/SupplierKey.java | 45 + examples/collections/ship/entity/Weight.java | 54 + examples/collections/ship/factory/Part.java | 111 + .../collections/ship/factory/PartKey.java | 64 + examples/collections/ship/factory/Sample.java | 237 + .../ship/factory/SampleDatabase.java | 221 + .../collections/ship/factory/SampleViews.java | 147 + .../collections/ship/factory/Shipment.java | 107 + .../collections/ship/factory/ShipmentKey.java | 74 + .../collections/ship/factory/Supplier.java | 113 + .../collections/ship/factory/SupplierKey.java | 64 + examples/collections/ship/factory/Weight.java | 54 + examples/collections/ship/index/PartData.java | 69 + examples/collections/ship/index/PartKey.java | 45 + examples/collections/ship/index/Sample.java | 280 + .../ship/index/SampleDatabase.java | 326 + .../collections/ship/index/SampleViews.java | 166 + .../collections/ship/index/ShipmentData.java | 46 + .../collections/ship/index/ShipmentKey.java | 53 + .../collections/ship/index/SupplierData.java | 62 + .../collections/ship/index/SupplierKey.java | 45 + examples/collections/ship/index/Weight.java | 54 + .../ship/marshal/MarshalledEntity.java | 47 + .../ship/marshal/MarshalledKey.java | 41 + examples/collections/ship/marshal/Part.java | 121 + .../collections/ship/marshal/PartKey.java | 64 + examples/collections/ship/marshal/Sample.java | 238 + .../ship/marshal/SampleDatabase.java | 255 + .../collections/ship/marshal/SampleViews.java | 281 + .../collections/ship/marshal/Shipment.java | 118 + .../collections/ship/marshal/ShipmentKey.java | 74 + .../collections/ship/marshal/Supplier.java | 123 + .../collections/ship/marshal/SupplierKey.java | 64 + examples/collections/ship/marshal/Weight.java | 54 + examples/collections/ship/sentity/Part.java | 95 + .../collections/ship/sentity/PartKey.java | 43 + examples/collections/ship/sentity/Sample.java | 238 + .../ship/sentity/SampleDatabase.java | 318 + .../collections/ship/sentity/SampleViews.java | 424 + .../collections/ship/sentity/Shipment.java | 80 + .../collections/ship/sentity/ShipmentKey.java | 51 + .../collections/ship/sentity/Supplier.java | 87 + .../collections/ship/sentity/SupplierKey.java | 43 + examples/collections/ship/sentity/Weight.java | 54 + examples/collections/ship/tuple/Part.java | 77 + examples/collections/ship/tuple/PartData.java | 70 + examples/collections/ship/tuple/PartKey.java | 43 + examples/collections/ship/tuple/Sample.java | 237 + .../ship/tuple/SampleDatabase.java | 318 + .../collections/ship/tuple/SampleViews.java | 401 + examples/collections/ship/tuple/Shipment.java | 60 + .../collections/ship/tuple/ShipmentData.java | 47 + .../collections/ship/tuple/ShipmentKey.java | 51 + examples/collections/ship/tuple/Supplier.java | 68 + .../collections/ship/tuple/SupplierData.java | 63 + .../collections/ship/tuple/SupplierKey.java | 43 + examples/collections/ship/tuple/Weight.java | 54 + examples/jca/HOWTO-jboss.txt | 217 + examples/jca/HOWTO-oc4j.txt | 266 + examples/jca/HOWTO-sjsas.txt | 248 + examples/jca/jboss/jboss.xml | 16 + examples/jca/jboss/je-localtx-ds.xml | 9 + examples/jca/jboss/je-no-tx-ds.xml | 8 + examples/jca/jboss/je-xa-ds.xml | 9 + examples/jca/oc4j/orion-ejb-jar.xml | 2 + examples/jca/simple/Simple.java | 29 + examples/jca/simple/SimpleBean.java | 210 + examples/jca/simple/SimpleClient.java | 48 + examples/jca/simple/SimpleHome.java | 24 + examples/jca/simple/ejb-jar.xml | 37 + examples/jca/sjsas8_1/sun-ejb-jar.xml | 21 + examples/je/BindingExample.java | 242 + examples/je/MeasureInsertSize.java | 236 + examples/je/SecondaryExample.java | 330 + examples/je/SequenceExample.java | 93 + examples/je/SimpleExample.java | 207 + examples/je/ToManyExample.java | 475 + .../je/gettingStarted/ExampleDatabasePut.java | 237 + .../gettingStarted/ExampleInventoryRead.java | 213 + examples/je/gettingStarted/Inventory.java | 74 + .../je/gettingStarted/InventoryBinding.java | 59 + .../je/gettingStarted/ItemNameKeyCreator.java | 51 + examples/je/gettingStarted/MyDbEnv.java | 167 + examples/je/gettingStarted/Vendor.java | 94 + examples/je/gettingStarted/inventory.txt | 800 + examples/je/gettingStarted/vendors.txt | 6 + examples/je/rep/quote/Command.java | 100 + examples/je/rep/quote/DataAccessor.java | 27 + examples/je/rep/quote/HARouter.java | 568 + examples/je/rep/quote/Quote.java | 40 + examples/je/rep/quote/QuoteUtil.java | 176 + .../je/rep/quote/RouterDrivenStockQuotes.java | 160 + examples/je/rep/quote/RunTransaction.java | 292 + examples/je/rep/quote/SimpleRouter.java | 243 + examples/je/rep/quote/StockQuotes.java | 693 + .../rep/quote/StockQuotesRMIForwarding.java | 364 + .../quote/UpdateForwardingStockQuotes.java | 267 + examples/je/rep/quote/package.html | 71 + examples/je/txn/DBWriter.java | 180 + examples/je/txn/PayloadData.java | 32 + examples/je/txn/TxnGuide.java | 161 + examples/jmx/JEApplicationMBean.java | 329 + examples/jmx/README.txt | 47 + examples/jmx/je-jboss-service.xml | 44 + examples/persist/CustomKeyOrderExample.java | 128 + examples/persist/DplDump.java | 166 + examples/persist/EventExample.java | 418 + examples/persist/EventExampleDPL.java | 275 + examples/persist/PersonExample.java | 258 + examples/persist/ScalaPersonExample.scala | 123 + .../persist/gettingStarted/DataAccessor.java | 48 + .../gettingStarted/ExampleDatabasePut.java | 194 + .../gettingStarted/ExampleInventoryRead.java | 156 + .../persist/gettingStarted/Inventory.java | 84 + examples/persist/gettingStarted/MyDbEnv.java | 89 + examples/persist/gettingStarted/Vendor.java | 100 + examples/persist/gettingStarted/inventory.txt | 800 + examples/persist/gettingStarted/vendors.txt | 6 + examples/persist/sqlapp/DataAccessor.java | 228 + examples/persist/sqlapp/Department.java | 67 + examples/persist/sqlapp/Employee.java | 102 + examples/persist/sqlapp/SQLApp.java | 329 + examples/persist/txn/PayloadDataEntity.java | 40 + examples/persist/txn/StoreWriter.java | 177 + examples/persist/txn/TxnGuideDPL.java | 134 + examples/resources/jboss/jndi.properties | 4 + ivy.xml | 21 + src/com/sleepycat/asm/AnnotationVisitor.java | 169 + src/com/sleepycat/asm/AnnotationWriter.java | 371 + src/com/sleepycat/asm/Attribute.java | 255 + src/com/sleepycat/asm/ByteVector.java | 339 + src/com/sleepycat/asm/ClassReader.java | 2496 ++++ src/com/sleepycat/asm/ClassVisitor.java | 320 + src/com/sleepycat/asm/ClassWriter.java | 1776 +++ src/com/sleepycat/asm/Context.java | 145 + src/com/sleepycat/asm/Edge.java | 75 + src/com/sleepycat/asm/FieldVisitor.java | 150 + src/com/sleepycat/asm/FieldWriter.java | 329 + src/com/sleepycat/asm/Frame.java | 1462 ++ src/com/sleepycat/asm/Handle.java | 170 + src/com/sleepycat/asm/Handler.java | 121 + src/com/sleepycat/asm/Item.java | 312 + src/com/sleepycat/asm/Label.java | 560 + src/com/sleepycat/asm/MethodVisitor.java | 880 ++ src/com/sleepycat/asm/MethodWriter.java | 2913 ++++ src/com/sleepycat/asm/Opcodes.java | 361 + src/com/sleepycat/asm/Type.java | 896 ++ src/com/sleepycat/asm/TypePath.java | 193 + src/com/sleepycat/asm/package-info.java | 18 + src/com/sleepycat/bind/ByteArrayBinding.java | 56 + src/com/sleepycat/bind/EntityBinding.java | 59 + src/com/sleepycat/bind/EntryBinding.java | 48 + .../sleepycat/bind/RecordNumberBinding.java | 77 + src/com/sleepycat/bind/package.html | 9 + .../sleepycat/bind/serial/ClassCatalog.java | 111 + src/com/sleepycat/bind/serial/SerialBase.java | 101 + .../sleepycat/bind/serial/SerialBinding.java | 196 + .../sleepycat/bind/serial/SerialInput.java | 106 + .../sleepycat/bind/serial/SerialOutput.java | 124 + .../bind/serial/SerialSerialBinding.java | 123 + .../bind/serial/SerialSerialKeyCreator.java | 152 + .../bind/serial/StoredClassCatalog.java | 499 + .../bind/serial/TupleSerialBinding.java | 121 + .../bind/serial/TupleSerialKeyCreator.java | 146 + .../serial/TupleSerialMarshalledBinding.java | 98 + .../TupleSerialMarshalledKeyCreator.java | 83 + src/com/sleepycat/bind/serial/package.html | 9 + .../bind/tuple/BigDecimalBinding.java | 88 + .../bind/tuple/BigIntegerBinding.java | 81 + .../sleepycat/bind/tuple/BooleanBinding.java | 89 + src/com/sleepycat/bind/tuple/ByteBinding.java | 89 + .../bind/tuple/CharacterBinding.java | 89 + .../sleepycat/bind/tuple/DoubleBinding.java | 89 + .../sleepycat/bind/tuple/FloatBinding.java | 89 + .../sleepycat/bind/tuple/IntegerBinding.java | 89 + src/com/sleepycat/bind/tuple/LongBinding.java | 89 + .../bind/tuple/MarshalledTupleEntry.java | 49 + .../bind/tuple/MarshalledTupleKeyEntity.java | 80 + .../bind/tuple/PackedIntegerBinding.java | 88 + .../bind/tuple/PackedLongBinding.java | 88 + .../sleepycat/bind/tuple/ShortBinding.java | 89 + .../bind/tuple/SortedBigDecimalBinding.java | 88 + .../bind/tuple/SortedDoubleBinding.java | 77 + .../bind/tuple/SortedFloatBinding.java | 76 + .../tuple/SortedPackedIntegerBinding.java | 88 + .../bind/tuple/SortedPackedLongBinding.java | 88 + .../sleepycat/bind/tuple/StringBinding.java | 90 + src/com/sleepycat/bind/tuple/TupleBase.java | 170 + .../sleepycat/bind/tuple/TupleBinding.java | 135 + src/com/sleepycat/bind/tuple/TupleInput.java | 865 ++ .../bind/tuple/TupleInputBinding.java | 50 + .../bind/tuple/TupleMarshalledBinding.java | 73 + src/com/sleepycat/bind/tuple/TupleOutput.java | 779 + .../bind/tuple/TupleTupleBinding.java | 100 + .../bind/tuple/TupleTupleKeyCreator.java | 119 + .../tuple/TupleTupleMarshalledBinding.java | 100 + .../tuple/TupleTupleMarshalledKeyCreator.java | 78 + src/com/sleepycat/bind/tuple/package.html | 394 + .../sleepycat/collections/BaseIterator.java | 29 + .../sleepycat/collections/BlockIterator.java | 779 + .../collections/CurrentTransaction.java | 523 + src/com/sleepycat/collections/DataCursor.java | 930 ++ src/com/sleepycat/collections/DataView.java | 685 + .../collections/MapEntryParameter.java | 129 + .../sleepycat/collections/MyRangeCursor.java | 79 + .../collections/PrimaryKeyAssigner.java | 39 + .../collections/StoredCollection.java | 742 + .../collections/StoredCollections.java | 209 + .../collections/StoredContainer.java | 476 + .../sleepycat/collections/StoredEntrySet.java | 208 + .../sleepycat/collections/StoredIterator.java | 736 + .../sleepycat/collections/StoredKeySet.java | 175 + src/com/sleepycat/collections/StoredList.java | 746 + src/com/sleepycat/collections/StoredMap.java | 817 ++ .../sleepycat/collections/StoredMapEntry.java | 49 + .../collections/StoredSortedEntrySet.java | 260 + .../collections/StoredSortedKeySet.java | 279 + .../collections/StoredSortedMap.java | 390 + .../collections/StoredSortedValueSet.java | 291 + .../sleepycat/collections/StoredValueSet.java | 220 + .../collections/TransactionRunner.java | 349 + .../collections/TransactionWorker.java | 39 + .../collections/TupleSerialFactory.java | 172 + src/com/sleepycat/collections/package.html | 19 + src/com/sleepycat/compat/DbCompat.java | 709 + src/com/sleepycat/compat/package-info.java | 17 + .../je/BinaryEqualityComparator.java | 72 + src/com/sleepycat/je/BtreeStats.java | 265 + src/com/sleepycat/je/CacheMode.java | 357 + src/com/sleepycat/je/CheckpointConfig.java | 200 + .../je/CheckpointConfigBeanInfo.java | 36 + src/com/sleepycat/je/CommitToken.java | 131 + src/com/sleepycat/je/Cursor.java | 5542 +++++++ src/com/sleepycat/je/CursorConfig.java | 249 + .../sleepycat/je/CursorConfigBeanInfo.java | 36 + src/com/sleepycat/je/CustomStats.java | 44 + src/com/sleepycat/je/Database.java | 2519 ++++ src/com/sleepycat/je/DatabaseComparator.java | 34 + src/com/sleepycat/je/DatabaseConfig.java | 1772 +++ .../sleepycat/je/DatabaseConfigBeanInfo.java | 35 + src/com/sleepycat/je/DatabaseEntry.java | 533 + src/com/sleepycat/je/DatabaseException.java | 163 + .../sleepycat/je/DatabaseExistsException.java | 56 + .../je/DatabaseNotFoundException.java | 52 + src/com/sleepycat/je/DatabaseStats.java | 26 + src/com/sleepycat/je/DbInternal.java | 726 + src/com/sleepycat/je/DeadlockException.java | 84 + .../je/DeleteConstraintException.java | 78 + src/com/sleepycat/je/DiskLimitException.java | 93 + src/com/sleepycat/je/DiskOrderedCursor.java | 381 + .../sleepycat/je/DiskOrderedCursorConfig.java | 376 + .../je/DiskOrderedCursorConfigBeanInfo.java | 43 + .../DiskOrderedCursorProducerException.java | 44 + .../sleepycat/je/DuplicateDataException.java | 60 + src/com/sleepycat/je/Durability.java | 360 + src/com/sleepycat/je/Environment.java | 2555 ++++ src/com/sleepycat/je/EnvironmentConfig.java | 4740 ++++++ .../je/EnvironmentConfigBeanInfo.java | 35 + .../je/EnvironmentFailureException.java | 499 + .../je/EnvironmentLockedException.java | 57 + .../je/EnvironmentMutableConfig.java | 770 + .../je/EnvironmentMutableConfigBeanInfo.java | 36 + .../je/EnvironmentNotFoundException.java | 56 + src/com/sleepycat/je/EnvironmentStats.java | 4280 ++++++ .../je/EnvironmentWedgedException.java | 79 + src/com/sleepycat/je/ExceptionEvent.java | 62 + src/com/sleepycat/je/ExceptionListener.java | 29 + .../je/ForeignConstraintException.java | 73 + .../sleepycat/je/ForeignKeyDeleteAction.java | 57 + src/com/sleepycat/je/ForeignKeyNullifier.java | 61 + .../je/ForeignMultiKeyNullifier.java | 67 + src/com/sleepycat/je/ForwardCursor.java | 165 + src/com/sleepycat/je/Get.java | 298 + src/com/sleepycat/je/JEVersion.java | 166 + src/com/sleepycat/je/JoinConfig.java | 126 + src/com/sleepycat/je/JoinConfigBeanInfo.java | 36 + src/com/sleepycat/je/JoinCursor.java | 495 + .../sleepycat/je/LockConflictException.java | 211 + src/com/sleepycat/je/LockMode.java | 344 + .../je/LockNotAvailableException.java | 63 + .../sleepycat/je/LockNotGrantedException.java | 85 + src/com/sleepycat/je/LockStats.java | 200 + .../sleepycat/je/LockTimeoutException.java | 74 + src/com/sleepycat/je/LogWriteException.java | 80 + .../je/OperationFailureException.java | 240 + src/com/sleepycat/je/OperationResult.java | 71 + src/com/sleepycat/je/OperationStatus.java | 50 + src/com/sleepycat/je/PartialComparator.java | 47 + src/com/sleepycat/je/PreloadConfig.java | 288 + .../sleepycat/je/PreloadConfigBeanInfo.java | 36 + src/com/sleepycat/je/PreloadStats.java | 253 + src/com/sleepycat/je/PreloadStatus.java | 66 + src/com/sleepycat/je/ProgressListener.java | 71 + src/com/sleepycat/je/Put.java | 108 + src/com/sleepycat/je/ReadOptions.java | 97 + src/com/sleepycat/je/RecoveryProgress.java | 126 + .../je/ReplicaConsistencyPolicy.java | 67 + .../sleepycat/je/RunRecoveryException.java | 54 + .../sleepycat/je/SecondaryAssociation.java | 288 + src/com/sleepycat/je/SecondaryConfig.java | 668 + .../sleepycat/je/SecondaryConfigBeanInfo.java | 34 + .../je/SecondaryConstraintException.java | 56 + src/com/sleepycat/je/SecondaryCursor.java | 1796 +++ src/com/sleepycat/je/SecondaryDatabase.java | 1799 +++ .../je/SecondaryIntegrityException.java | 97 + src/com/sleepycat/je/SecondaryKeyCreator.java | 136 + .../je/SecondaryMultiKeyCreator.java | 142 + .../je/SecondaryReferenceException.java | 120 + src/com/sleepycat/je/Sequence.java | 612 + src/com/sleepycat/je/SequenceConfig.java | 459 + .../sleepycat/je/SequenceConfigBeanInfo.java | 36 + .../sleepycat/je/SequenceExistsException.java | 55 + .../je/SequenceIntegrityException.java | 54 + .../je/SequenceNotFoundException.java | 55 + .../je/SequenceOverflowException.java | 54 + src/com/sleepycat/je/SequenceStats.java | 127 + src/com/sleepycat/je/StatsConfig.java | 197 + src/com/sleepycat/je/StatsConfigBeanInfo.java | 36 + .../je/ThreadInterruptedException.java | 107 + src/com/sleepycat/je/Transaction.java | 949 ++ src/com/sleepycat/je/TransactionConfig.java | 650 + .../je/TransactionConfigBeanInfo.java | 36 + src/com/sleepycat/je/TransactionStats.java | 174 + .../je/TransactionTimeoutException.java | 73 + .../je/UniqueConstraintException.java | 75 + src/com/sleepycat/je/VerifyConfig.java | 442 + .../sleepycat/je/VerifyConfigBeanInfo.java | 36 + .../je/VersionMismatchException.java | 59 + src/com/sleepycat/je/WriteOptions.java | 491 + src/com/sleepycat/je/XAEnvironment.java | 412 + src/com/sleepycat/je/XAFailureException.java | 60 + .../cleaner/BaseLocalUtilizationTracker.java | 171 + .../je/cleaner/BaseUtilizationTracker.java | 365 + src/com/sleepycat/je/cleaner/Cleaner.java | 1646 +++ .../je/cleaner/CleanerStatDefinition.java | 391 + .../sleepycat/je/cleaner/DbFileSummary.java | 159 + .../je/cleaner/DbFileSummaryMap.java | 207 + .../je/cleaner/ExpirationProfile.java | 566 + .../je/cleaner/ExpirationTracker.java | 335 + .../sleepycat/je/cleaner/FileProcessor.java | 1990 +++ .../sleepycat/je/cleaner/FileProtector.java | 893 ++ .../sleepycat/je/cleaner/FileSelector.java | 624 + src/com/sleepycat/je/cleaner/FileSummary.java | 452 + .../sleepycat/je/cleaner/FilesToMigrate.java | 251 + src/com/sleepycat/je/cleaner/INSummary.java | 54 + src/com/sleepycat/je/cleaner/LNInfo.java | 74 + .../je/cleaner/LocalUtilizationTracker.java | 121 + src/com/sleepycat/je/cleaner/OffsetList.java | 221 + .../je/cleaner/PackedObsoleteInfo.java | 73 + .../sleepycat/je/cleaner/PackedOffsets.java | 243 + .../cleaner/RecoveryUtilizationTracker.java | 200 + .../je/cleaner/ReservedFileInfo.java | 75 + .../je/cleaner/TrackedFileSummary.java | 201 + .../je/cleaner/UtilizationCalculator.java | 495 + .../je/cleaner/UtilizationProfile.java | 1446 ++ .../je/cleaner/UtilizationTracker.java | 230 + src/com/sleepycat/je/cleaner/VerifyUtils.java | 436 + .../sleepycat/je/cleaner/package-info.java | 17 + .../je/config/BooleanConfigParam.java | 54 + src/com/sleepycat/je/config/ConfigParam.java | 147 + .../je/config/DurationConfigParam.java | 91 + .../je/config/EnvironmentParams.java | 1833 +++ .../sleepycat/je/config/IntConfigParam.java | 81 + .../sleepycat/je/config/LongConfigParam.java | 82 + .../sleepycat/je/config/ShortConfigParam.java | 85 + src/com/sleepycat/je/config/package-info.java | 17 + .../sleepycat/je/dbi/BTreeStatDefinition.java | 79 + .../je/dbi/CompressedOopsDetector.java | 96 + src/com/sleepycat/je/dbi/CursorImpl.java | 4096 ++++++ src/com/sleepycat/je/dbi/DatabaseId.java | 174 + src/com/sleepycat/je/dbi/DatabaseImpl.java | 2571 ++++ src/com/sleepycat/je/dbi/DbConfigManager.java | 706 + src/com/sleepycat/je/dbi/DbEnvPool.java | 456 + src/com/sleepycat/je/dbi/DbEnvState.java | 67 + src/com/sleepycat/je/dbi/DbTree.java | 2107 +++ src/com/sleepycat/je/dbi/DbType.java | 170 + .../sleepycat/je/dbi/DbiStatDefinition.java | 296 + .../je/dbi/DiskOrderedCursorImpl.java | 456 + .../sleepycat/je/dbi/DiskOrderedScanner.java | 2324 +++ src/com/sleepycat/je/dbi/DupKeyData.java | 409 + .../sleepycat/je/dbi/EnvConfigObserver.java | 31 + .../je/dbi/EnvironmentFailureReason.java | 185 + src/com/sleepycat/je/dbi/EnvironmentImpl.java | 3702 +++++ src/com/sleepycat/je/dbi/ExpirationInfo.java | 82 + src/com/sleepycat/je/dbi/GetMode.java | 44 + src/com/sleepycat/je/dbi/INList.java | 496 + src/com/sleepycat/je/dbi/LSNAccumulator.java | 128 + src/com/sleepycat/je/dbi/MemoryBudget.java | 1348 ++ src/com/sleepycat/je/dbi/NodeSequence.java | 151 + src/com/sleepycat/je/dbi/Operation.java | 76 + src/com/sleepycat/je/dbi/PutMode.java | 46 + src/com/sleepycat/je/dbi/RangeConstraint.java | 18 + .../je/dbi/RangeRestartException.java | 30 + src/com/sleepycat/je/dbi/RecordVersion.java | 37 + src/com/sleepycat/je/dbi/RepConfigProxy.java | 23 + .../je/dbi/ReplicatedDatabaseConfig.java | 222 + src/com/sleepycat/je/dbi/SearchMode.java | 54 + .../je/dbi/SequenceStatDefinition.java | 61 + .../sleepycat/je/dbi/SortedLSNTreeWalker.java | 1205 ++ src/com/sleepycat/je/dbi/StartupTracker.java | 620 + src/com/sleepycat/je/dbi/TTL.java | 299 + src/com/sleepycat/je/dbi/TriggerManager.java | 468 + src/com/sleepycat/je/dbi/TriggerUtils.java | 164 + src/com/sleepycat/je/dbi/TruncateResult.java | 36 + .../sleepycat/je/dbi/TxnStatDefinition.java | 58 + src/com/sleepycat/je/dbi/VLSNProxy.java | 27 + src/com/sleepycat/je/dbi/package-info.java | 18 + src/com/sleepycat/je/evictor/Arbiter.java | 122 + .../sleepycat/je/evictor/CHeapAllocator.java | 230 + .../sleepycat/je/evictor/DummyAllocator.java | 67 + src/com/sleepycat/je/evictor/Evictor.java | 3415 +++++ .../je/evictor/EvictorStatDefinition.java | 406 + .../je/evictor/OffHeapAllocator.java | 176 + .../je/evictor/OffHeapAllocatorFactory.java | 46 + .../sleepycat/je/evictor/OffHeapCache.java | 3584 +++++ .../je/evictor/OffHeapStatDefinition.java | 231 + .../sleepycat/je/evictor/package-info.java | 17 + .../je/incomp/INCompStatDefinition.java | 87 + src/com/sleepycat/je/incomp/INCompressor.java | 658 + src/com/sleepycat/je/incomp/package-info.java | 18 + src/com/sleepycat/je/jca/ra/JEConnection.java | 107 + .../je/jca/ra/JEConnectionFactory.java | 48 + .../je/jca/ra/JEConnectionFactoryImpl.java | 76 + .../je/jca/ra/JEConnectionMetaData.java | 40 + src/com/sleepycat/je/jca/ra/JEException.java | 23 + .../je/jca/ra/JELocalTransaction.java | 134 + .../je/jca/ra/JEManagedConnection.java | 315 + .../je/jca/ra/JEManagedConnectionFactory.java | 106 + .../sleepycat/je/jca/ra/JERequestInfo.java | 60 + src/com/sleepycat/je/jca/ra/package.html | 42 + src/com/sleepycat/je/jca/ra/ra.xml | 56 + src/com/sleepycat/je/jmx/JEDiagnostics.java | 318 + src/com/sleepycat/je/jmx/JEMBean.java | 236 + src/com/sleepycat/je/jmx/JEMBeanHelper.java | 750 + src/com/sleepycat/je/jmx/JEMonitor.java | 544 + src/com/sleepycat/je/jmx/package.html | 23 + src/com/sleepycat/je/jmx/plugin/JEStats.java | 49 + .../je/jmx/plugin/JEStatsPlugin.java | 47 + src/com/sleepycat/je/jmx/plugin/Stats.java | 1366 ++ .../sleepycat/je/jmx/plugin/StatsPlugin.java | 91 + .../je/jmx/plugin/StatsSwingWorker.java | 58 + .../sleepycat/je/jmx/plugin/package-info.java | 17 + .../com.sun.tools.jconsole.JConsolePlugin | 1 + src/com/sleepycat/je/latch/Latch.java | 118 + src/com/sleepycat/je/latch/LatchContext.java | 37 + src/com/sleepycat/je/latch/LatchFactory.java | 127 + src/com/sleepycat/je/latch/LatchImpl.java | 179 + .../je/latch/LatchStatDefinition.java | 81 + src/com/sleepycat/je/latch/LatchSupport.java | 215 + src/com/sleepycat/je/latch/LatchTable.java | 84 + .../je/latch/LatchWithStatsImpl.java | 204 + src/com/sleepycat/je/latch/OwnerInfo.java | 43 + src/com/sleepycat/je/latch/SharedLatch.java | 38 + .../sleepycat/je/latch/SharedLatchImpl.java | 194 + src/com/sleepycat/je/latch/TimingLatch.java | 167 + src/com/sleepycat/je/latch/package-info.java | 18 + .../je/log/BasicVersionedWriteLoggable.java | 60 + .../je/log/CheckpointFileReader.java | 99 + .../sleepycat/je/log/ChecksumException.java | 34 + .../sleepycat/je/log/ChecksumValidator.java | 89 + .../sleepycat/je/log/CleanerFileReader.java | 343 + .../je/log/DbOpReplicationContext.java | 107 + src/com/sleepycat/je/log/DumpFileReader.java | 159 + src/com/sleepycat/je/log/FSyncManager.java | 524 + src/com/sleepycat/je/log/FileCacheWarmer.java | 168 + .../je/log/FileDeletionDetector.java | 322 + src/com/sleepycat/je/log/FileHandle.java | 97 + .../sleepycat/je/log/FileHandleSource.java | 46 + src/com/sleepycat/je/log/FileHeader.java | 188 + src/com/sleepycat/je/log/FileManager.java | 3321 +++++ src/com/sleepycat/je/log/FileReader.java | 1274 ++ src/com/sleepycat/je/log/FileSource.java | 87 + src/com/sleepycat/je/log/INFileReader.java | 614 + src/com/sleepycat/je/log/JEFileFilter.java | 106 + src/com/sleepycat/je/log/LNFileReader.java | 258 + src/com/sleepycat/je/log/LastFileReader.java | 435 + src/com/sleepycat/je/log/LogBuffer.java | 389 + src/com/sleepycat/je/log/LogBufferPool.java | 660 + .../sleepycat/je/log/LogBufferSegment.java | 51 + src/com/sleepycat/je/log/LogEntryHeader.java | 629 + src/com/sleepycat/je/log/LogEntryType.java | 1055 ++ src/com/sleepycat/je/log/LogFlusher.java | 247 + src/com/sleepycat/je/log/LogItem.java | 56 + src/com/sleepycat/je/log/LogManager.java | 1548 ++ src/com/sleepycat/je/log/LogParams.java | 137 + src/com/sleepycat/je/log/LogSource.java | 48 + .../sleepycat/je/log/LogStatDefinition.java | 388 + src/com/sleepycat/je/log/LogUtils.java | 641 + src/com/sleepycat/je/log/Loggable.java | 74 + src/com/sleepycat/je/log/PrintFileReader.java | 89 + src/com/sleepycat/je/log/Provisional.java | 298 + .../sleepycat/je/log/ReplicationContext.java | 138 + src/com/sleepycat/je/log/RestoreMarker.java | 156 + .../sleepycat/je/log/ScavengerFileReader.java | 243 + .../sleepycat/je/log/SearchFileReader.java | 73 + src/com/sleepycat/je/log/StatsFileReader.java | 610 + src/com/sleepycat/je/log/Trace.java | 196 + .../je/log/UtilizationFileReader.java | 349 + .../je/log/VLSNDistributionReader.java | 178 + .../je/log/VersionedWriteLoggable.java | 105 + src/com/sleepycat/je/log/WholeEntry.java | 38 + .../sleepycat/je/log/entry/AbortLogEntry.java | 47 + .../je/log/entry/BINDeltaLogEntry.java | 59 + src/com/sleepycat/je/log/entry/BaseEntry.java | 177 + .../je/log/entry/BaseReplicableEntry.java | 74 + .../je/log/entry/CommitLogEntry.java | 47 + .../je/log/entry/DbOperationType.java | 153 + .../je/log/entry/DeletedDupLNLogEntry.java | 110 + .../sleepycat/je/log/entry/EmptyLogEntry.java | 58 + .../je/log/entry/FileHeaderEntry.java | 55 + .../je/log/entry/INContainingEntry.java | 61 + .../sleepycat/je/log/entry/INLogEntry.java | 394 + .../sleepycat/je/log/entry/LNLogEntry.java | 1122 ++ src/com/sleepycat/je/log/entry/LogEntry.java | 132 + .../je/log/entry/MatchpointLogEntry.java | 47 + .../je/log/entry/NameLNLogEntry.java | 298 + .../je/log/entry/OldBINDeltaLogEntry.java | 74 + .../je/log/entry/ReplicableLogEntry.java | 139 + .../je/log/entry/RestoreRequired.java | 134 + .../je/log/entry/SingleItemEntry.java | 127 + .../log/entry/SingleItemReplicableEntry.java | 86 + .../sleepycat/je/log/entry/TraceLogEntry.java | 94 + .../sleepycat/je/log/entry/package-info.java | 17 + src/com/sleepycat/je/log/package-info.java | 18 + src/com/sleepycat/je/package.html | 47 + .../sleepycat/je/recovery/CheckpointEnd.java | 347 + .../je/recovery/CheckpointStart.java | 110 + .../je/recovery/CheckpointStatDefinition.java | 104 + .../sleepycat/je/recovery/Checkpointer.java | 1660 +++ src/com/sleepycat/je/recovery/DirtyINMap.java | 836 ++ .../sleepycat/je/recovery/RecoveryInfo.java | 98 + .../je/recovery/RecoveryManager.java | 3324 +++++ .../je/recovery/RollbackTracker.java | 1063 ++ .../je/recovery/VLSNRecoveryProxy.java | 28 + .../sleepycat/je/recovery/package-info.java | 18 + src/com/sleepycat/je/rep/AppStateMonitor.java | 64 + .../je/rep/CommitPointConsistencyPolicy.java | 226 + .../je/rep/DatabasePreemptedException.java | 115 + .../je/rep/GroupShutdownException.java | 123 + .../je/rep/InsufficientAcksException.java | 156 + .../je/rep/InsufficientLogException.java | 429 + .../je/rep/InsufficientReplicasException.java | 131 + .../je/rep/LockPreemptedException.java | 69 + .../je/rep/LogFileRewriteListener.java | 36 + .../je/rep/LogOverwriteException.java | 68 + .../rep/MasterReplicaTransitionException.java | 65 + .../je/rep/MasterStateException.java | 53 + .../rep/MasterTransferFailureException.java | 51 + .../je/rep/MemberActiveException.java | 52 + .../je/rep/MemberNotFoundException.java | 50 + src/com/sleepycat/je/rep/NetworkRestore.java | 457 + .../je/rep/NetworkRestoreConfig.java | 160 + .../je/rep/NetworkRestoreConfigBeanInfo.java | 36 + .../je/rep/NoConsistencyRequiredPolicy.java | 104 + src/com/sleepycat/je/rep/NodeState.java | 243 + src/com/sleepycat/je/rep/NodeType.java | 188 + src/com/sleepycat/je/rep/QuorumPolicy.java | 63 + src/com/sleepycat/je/rep/RepInternal.java | 139 + src/com/sleepycat/je/rep/RepStatManager.java | 105 + .../je/rep/ReplicaConsistencyException.java | 119 + .../je/rep/ReplicaStateException.java | 45 + .../je/rep/ReplicaWriteException.java | 57 + .../je/rep/ReplicatedEnvironment.java | 1350 ++ .../je/rep/ReplicatedEnvironmentStats.java | 946 ++ .../je/rep/ReplicationBasicConfig.java | 83 + .../rep/ReplicationBasicConfigBeanInfo.java | 36 + .../sleepycat/je/rep/ReplicationConfig.java | 1939 +++ .../je/rep/ReplicationConfigBeanInfo.java | 35 + .../sleepycat/je/rep/ReplicationGroup.java | 202 + .../je/rep/ReplicationMutableConfig.java | 722 + .../rep/ReplicationMutableConfigBeanInfo.java | 36 + .../je/rep/ReplicationNetworkConfig.java | 611 + .../rep/ReplicationNetworkConfigBeanInfo.java | 36 + src/com/sleepycat/je/rep/ReplicationNode.java | 57 + .../je/rep/ReplicationSSLConfig.java | 1232 ++ .../je/rep/ReplicationSSLConfigBeanInfo.java | 36 + .../je/rep/ReplicationSecurityException.java | 62 + .../je/rep/RestartRequiredException.java | 79 + .../sleepycat/je/rep/RollbackException.java | 148 + .../je/rep/RollbackProhibitedException.java | 184 + .../sleepycat/je/rep/StateChangeEvent.java | 94 + .../je/rep/StateChangeException.java | 85 + .../sleepycat/je/rep/StateChangeListener.java | 55 + src/com/sleepycat/je/rep/SyncupProgress.java | 49 + .../je/rep/TimeConsistencyPolicy.java | 176 + .../je/rep/UnknownMasterException.java | 68 + src/com/sleepycat/je/rep/arbiter/Arbiter.java | 273 + .../je/rep/arbiter/ArbiterConfig.java | 495 + .../je/rep/arbiter/ArbiterMutableConfig.java | 228 + .../je/rep/arbiter/ArbiterStats.java | 114 + .../arbiter/impl/ArbBinaryStateService.java | 151 + .../je/rep/arbiter/impl/ArbiterAcker.java | 884 ++ .../je/rep/arbiter/impl/ArbiterImpl.java | 862 ++ .../arbiter/impl/ArbiterNodeStateService.java | 89 + .../rep/arbiter/impl/ArbiterOutputThread.java | 53 + .../arbiter/impl/ArbiterStatDefinition.java | 73 + .../rep/arbiter/impl/ArbiterVLSNTracker.java | 255 + .../rep/arbiter/impl/MonitorEventManager.java | 150 + .../je/rep/arbiter/impl/package-info.java | 17 + src/com/sleepycat/je/rep/arbiter/package.html | 6 + .../sleepycat/je/rep/arbitration/Arbiter.java | 170 + .../je/rep/arbitration/ArbiterProvider.java | 67 + .../DesignatedPrimaryProvider.java | 129 + .../je/rep/arbitration/package-info.java | 18 + .../sleepycat/je/rep/elections/Acceptor.java | 314 + .../je/rep/elections/ElectionAgentThread.java | 104 + .../sleepycat/je/rep/elections/Elections.java | 997 ++ .../je/rep/elections/ElectionsConfig.java | 66 + .../sleepycat/je/rep/elections/Learner.java | 568 + .../je/rep/elections/MasterValue.java | 125 + .../sleepycat/je/rep/elections/Proposer.java | 546 + .../rep/elections/ProposerStatDefinition.java | 67 + .../sleepycat/je/rep/elections/Protocol.java | 760 + .../je/rep/elections/RankingProposer.java | 283 + .../elections/TimebasedProposalGenerator.java | 268 + src/com/sleepycat/je/rep/elections/Utils.java | 436 + .../je/rep/elections/package-info.java | 17 + .../je/rep/impl/BinaryNodeStateProtocol.java | 269 + .../je/rep/impl/BinaryNodeStateService.java | 151 + .../je/rep/impl/EnumConfigParam.java | 59 + .../sleepycat/je/rep/impl/GroupService.java | 359 + .../MinJEVersionUnsupportedException.java | 62 + .../je/rep/impl/NodeStateProtocol.java | 149 + .../je/rep/impl/NodeStateService.java | 89 + .../je/rep/impl/PointConsistencyPolicy.java | 131 + .../je/rep/impl/RepConfigManager.java | 112 + .../je/rep/impl/RepEnvConfigObserver.java | 31 + src/com/sleepycat/je/rep/impl/RepGroupDB.java | 1521 ++ .../sleepycat/je/rep/impl/RepGroupImpl.java | 1441 ++ .../je/rep/impl/RepGroupProtocol.java | 506 + src/com/sleepycat/je/rep/impl/RepImpl.java | 2303 +++ .../je/rep/impl/RepImplStatDefinition.java | 38 + .../sleepycat/je/rep/impl/RepNodeImpl.java | 445 + src/com/sleepycat/je/rep/impl/RepParams.java | 1613 ++ .../sleepycat/je/rep/impl/TextProtocol.java | 1205 ++ .../impl/networkRestore/FeederManager.java | 290 + .../impl/networkRestore/LogFileFeeder.java | 531 + .../impl/networkRestore/NetworkBackup.java | 939 ++ .../NetworkBackupStatDefinition.java | 68 + .../networkRestore/NetworkBackupStats.java | 77 + .../je/rep/impl/networkRestore/Protocol.java | 423 + .../rep/impl/networkRestore/package-info.java | 18 + .../je/rep/impl/node/ChannelTimeoutTask.java | 87 + .../je/rep/impl/node/CommitFreezeLatch.java | 179 + .../sleepycat/je/rep/impl/node/DbCache.java | 218 + .../je/rep/impl/node/DurabilityQuorum.java | 250 + .../je/rep/impl/node/ElectionQuorum.java | 150 + .../sleepycat/je/rep/impl/node/Feeder.java | 1674 +++ .../je/rep/impl/node/FeederManager.java | 1047 ++ .../node/FeederManagerStatDefinition.java | 129 + .../je/rep/impl/node/JoinGroupTimeouts.java | 127 + .../je/rep/impl/node/MasterTransfer.java | 378 + .../je/rep/impl/node/MonitorEventManager.java | 144 + .../je/rep/impl/node/NameIdPair.java | 184 + .../sleepycat/je/rep/impl/node/NodeState.java | 100 + .../sleepycat/je/rep/impl/node/RepNode.java | 2721 ++++ .../sleepycat/je/rep/impl/node/Replay.java | 1495 ++ .../rep/impl/node/ReplayStatDefinition.java | 211 + .../sleepycat/je/rep/impl/node/Replica.java | 1745 +++ .../je/rep/impl/node/ReplicaFactory.java | 94 + .../je/rep/impl/node/ReplicaOutputThread.java | 47 + .../impl/node/ReplicaOutputThreadBase.java | 326 + .../rep/impl/node/ReplicaStatDefinition.java | 67 + .../impl/node/cbvlsn/CleanerBarrierState.java | 100 + .../je/rep/impl/node/cbvlsn/GlobalCBVLSN.java | 451 + .../impl/node/cbvlsn/LocalCBVLSNTracker.java | 170 + .../impl/node/cbvlsn/LocalCBVLSNUpdater.java | 289 + .../je/rep/impl/node/cbvlsn/package-info.java | 19 + .../je/rep/impl/node/package-info.java | 17 + .../sleepycat/je/rep/impl/package-info.java | 17 + .../je/rep/jmx/RepJEDiagnostics.java | 47 + .../sleepycat/je/rep/jmx/RepJEMonitor.java | 123 + .../sleepycat/je/rep/jmx/package-info.java | 17 + .../je/rep/jmx/plugin/RepJEStats.java | 50 + .../je/rep/jmx/plugin/RepJEStatsPlugin.java | 56 + .../je/rep/jmx/plugin/package-info.java | 17 + .../com.sun.tools.jconsole.JConsolePlugin | 1 + .../je/rep/monitor/GroupChangeEvent.java | 91 + .../je/rep/monitor/JoinGroupEvent.java | 50 + .../je/rep/monitor/LeaveGroupEvent.java | 103 + .../je/rep/monitor/MemberChangeEvent.java | 39 + src/com/sleepycat/je/rep/monitor/Monitor.java | 914 ++ .../je/rep/monitor/MonitorChangeEvent.java | 40 + .../je/rep/monitor/MonitorChangeListener.java | 84 + .../je/rep/monitor/MonitorConfig.java | 444 + .../je/rep/monitor/MonitorConfigBeanInfo.java | 32 + .../je/rep/monitor/MonitorService.java | 147 + .../je/rep/monitor/NewMasterEvent.java | 45 + .../sleepycat/je/rep/monitor/Protocol.java | 260 + src/com/sleepycat/je/rep/monitor/package.html | 27 + src/com/sleepycat/je/rep/net/DataChannel.java | 97 + .../je/rep/net/DataChannelFactory.java | 215 + .../sleepycat/je/rep/net/InstanceContext.java | 57 + .../sleepycat/je/rep/net/InstanceLogger.java | 31 + .../sleepycat/je/rep/net/InstanceParams.java | 43 + .../sleepycat/je/rep/net/LoggerFactory.java | 30 + .../sleepycat/je/rep/net/PasswordSource.java | 29 + .../je/rep/net/SSLAuthenticator.java | 35 + src/com/sleepycat/je/rep/net/package.html | 23 + src/com/sleepycat/je/rep/package.html | 110 + .../je/rep/stream/ArbiterFeederSource.java | 124 + .../stream/ArbiterFeederStatDefinition.java | 29 + .../sleepycat/je/rep/stream/BaseProtocol.java | 1321 ++ .../sleepycat/je/rep/stream/FeederFilter.java | 52 + .../sleepycat/je/rep/stream/FeederReader.java | 558 + .../je/rep/stream/FeederReplicaHandshake.java | 632 + .../je/rep/stream/FeederReplicaSyncup.java | 418 + .../sleepycat/je/rep/stream/FeederSource.java | 39 + .../je/rep/stream/FeederSyncupReader.java | 188 + .../rep/stream/FeederTxnStatDefinition.java | 95 + .../sleepycat/je/rep/stream/FeederTxns.java | 273 + .../je/rep/stream/InputWireRecord.java | 122 + .../je/rep/stream/MasterChangeListener.java | 78 + .../je/rep/stream/MasterFeederSource.java | 116 + .../sleepycat/je/rep/stream/MasterStatus.java | 178 + .../rep/stream/MasterSuggestionGenerator.java | 95 + .../rep/stream/MatchpointSearchResults.java | 331 + .../je/rep/stream/OutputWireRecord.java | 527 + src/com/sleepycat/je/rep/stream/Protocol.java | 920 ++ .../je/rep/stream/ReplicaFeederHandshake.java | 437 + .../stream/ReplicaFeederHandshakeConfig.java | 60 + .../je/rep/stream/ReplicaFeederSyncup.java | 830 ++ .../je/rep/stream/ReplicaSyncupReader.java | 421 + .../je/rep/stream/SubscriberFeederSyncup.java | 245 + .../sleepycat/je/rep/stream/VLSNReader.java | 162 + .../sleepycat/je/rep/stream/WireRecord.java | 69 + .../sleepycat/je/rep/stream/package-info.java | 18 + .../je/rep/subscription/ClientAuthMethod.java | 122 + .../je/rep/subscription/ServerAuthMethod.java | 133 + .../rep/subscription/StreamAuthenticator.java | 67 + .../je/rep/subscription/Subscription.java | 280 + .../subscription/SubscriptionAuthHandler.java | 48 + .../subscription/SubscriptionCallback.java | 66 + .../rep/subscription/SubscriptionConfig.java | 803 + .../SubscriptionOutputThread.java | 89 + .../SubscriptionProcessMessageThread.java | 231 + .../je/rep/subscription/SubscriptionStat.java | 124 + .../SubscriptionStatDefinition.java | 60 + .../rep/subscription/SubscriptionStatus.java | 36 + .../rep/subscription/SubscriptionThread.java | 851 ++ .../je/rep/subscription/package-info.java | 17 + .../je/rep/txn/MasterThreadLocker.java | 35 + src/com/sleepycat/je/rep/txn/MasterTxn.java | 718 + src/com/sleepycat/je/rep/txn/ReadonlyTxn.java | 151 + src/com/sleepycat/je/rep/txn/ReplayTxn.java | 713 + .../je/rep/txn/ReplicaThreadLocker.java | 105 + .../sleepycat/je/rep/txn/package-info.java | 18 + .../sleepycat/je/rep/util/AtomicLongMax.java | 59 + .../je/rep/util/DbEnableReplication.java | 256 + .../sleepycat/je/rep/util/DbGroupAdmin.java | 601 + src/com/sleepycat/je/rep/util/DbPing.java | 355 + .../je/rep/util/DbResetRepGroup.java | 267 + .../je/rep/util/ReplicationGroupAdmin.java | 678 + .../sleepycat/je/rep/util/ldiff/Block.java | 122 + .../sleepycat/je/rep/util/ldiff/BlockBag.java | 183 + .../je/rep/util/ldiff/DiffRecordAnalyzer.java | 336 + .../je/rep/util/ldiff/DiffTracker.java | 111 + .../sleepycat/je/rep/util/ldiff/LDiff.java | 855 ++ .../je/rep/util/ldiff/LDiffConfig.java | 244 + .../rep/util/ldiff/LDiffConfigBeanInfo.java | 32 + .../ldiff/LDiffRecordRequestException.java | 46 + .../je/rep/util/ldiff/LDiffService.java | 232 + .../je/rep/util/ldiff/LDiffUtil.java | 167 + .../je/rep/util/ldiff/MismatchedRegion.java | 103 + .../sleepycat/je/rep/util/ldiff/Protocol.java | 489 + .../sleepycat/je/rep/util/ldiff/Record.java | 81 + .../sleepycat/je/rep/util/ldiff/Window.java | 210 + .../je/rep/util/ldiff/package-info.java | 18 + src/com/sleepycat/je/rep/util/package.html | 23 + .../je/rep/utilint/BinaryProtocol.java | 1158 ++ .../utilint/BinaryProtocolStatDefinition.java | 186 + .../je/rep/utilint/DbCacheSizeRepEnv.java | 51 + .../sleepycat/je/rep/utilint/DbDumpGroup.java | 161 + .../je/rep/utilint/DbFeederPrintLog.java | 266 + .../sleepycat/je/rep/utilint/DbNullNode.java | 402 + .../je/rep/utilint/DbRepRunAction.java | 141 + .../je/rep/utilint/DbStreamVerify.java | 430 + src/com/sleepycat/je/rep/utilint/DbSync.java | 340 + .../je/rep/utilint/FreePortLocator.java | 218 + .../je/rep/utilint/HostPortPair.java | 102 + .../je/rep/utilint/IntRunningTotalStat.java | 36 + .../je/rep/utilint/LongMinZeroStat.java | 38 + .../je/rep/utilint/NamedChannel.java | 90 + .../rep/utilint/NamedChannelWithTimeout.java | 176 + .../sleepycat/je/rep/utilint/RepUtils.java | 598 + .../je/rep/utilint/ReplicationFormatter.java | 34 + .../je/rep/utilint/ServiceDispatcher.java | 1247 ++ .../je/rep/utilint/ServiceHandshake.java | 1131 ++ .../je/rep/utilint/SimpleTxnMap.java | 195 + .../je/rep/utilint/SizeAwaitMap.java | 279 + .../utilint/SizeAwaitMapStatDefinition.java | 43 + .../utilint/StatCaptureRepDefinitions.java | 187 + .../rep/utilint/net/AbstractDataChannel.java | 52 + .../je/rep/utilint/net/AliasKeyManager.java | 112 + .../net/DataChannelFactoryBuilder.java | 428 + .../je/rep/utilint/net/SSLChannelFactory.java | 976 ++ .../rep/utilint/net/SSLDNAuthenticator.java | 63 + .../je/rep/utilint/net/SSLDNHostVerifier.java | 74 + .../je/rep/utilint/net/SSLDNMatcher.java | 95 + .../je/rep/utilint/net/SSLDataChannel.java | 840 ++ .../utilint/net/SSLMirrorAuthenticator.java | 53 + .../utilint/net/SSLMirrorHostVerifier.java | 60 + .../je/rep/utilint/net/SSLMirrorMatcher.java | 172 + .../rep/utilint/net/SSLStdHostVerifier.java | 117 + .../rep/utilint/net/SimpleChannelFactory.java | 55 + .../je/rep/utilint/net/SimpleDataChannel.java | 117 + .../je/rep/utilint/net/package-info.java | 17 + .../je/rep/utilint/package-info.java | 17 + .../sleepycat/je/rep/vlsn/GhostBucket.java | 164 + .../sleepycat/je/rep/vlsn/LogItemCache.java | 121 + src/com/sleepycat/je/rep/vlsn/VLSNBucket.java | 1077 ++ src/com/sleepycat/je/rep/vlsn/VLSNIndex.java | 2527 ++++ .../je/rep/vlsn/VLSNIndexStatDefinition.java | 75 + src/com/sleepycat/je/rep/vlsn/VLSNRange.java | 413 + .../je/rep/vlsn/VLSNRecoveryTracker.java | 135 + .../sleepycat/je/rep/vlsn/VLSNTracker.java | 1137 ++ .../sleepycat/je/rep/vlsn/package-info.java | 17 + .../sleepycat/je/statcap/EnvStatsLogger.java | 147 + src/com/sleepycat/je/statcap/JvmStats.java | 110 + src/com/sleepycat/je/statcap/StatCapture.java | 324 + .../je/statcap/StatCaptureDefinitions.java | 379 + src/com/sleepycat/je/statcap/StatManager.java | 258 + src/com/sleepycat/je/statcap/StatUtils.java | 31 + .../sleepycat/je/statcap/package-info.java | 17 + src/com/sleepycat/je/tree/BIN.java | 2556 ++++ src/com/sleepycat/je/tree/BINBoundary.java | 24 + .../je/tree/BINDeltaBloomFilter.java | 235 + src/com/sleepycat/je/tree/BINReference.java | 74 + src/com/sleepycat/je/tree/ChildReference.java | 370 + src/com/sleepycat/je/tree/CountEstimator.java | 369 + .../je/tree/CursorsExistException.java | 34 + src/com/sleepycat/je/tree/DeltaInfo.java | 117 + src/com/sleepycat/je/tree/EntryStates.java | 40 + src/com/sleepycat/je/tree/FileSummaryLN.java | 480 + src/com/sleepycat/je/tree/IN.java | 6495 +++++++++ src/com/sleepycat/je/tree/INArrayRep.java | 158 + src/com/sleepycat/je/tree/INKeyRep.java | 729 + src/com/sleepycat/je/tree/INLongRep.java | 439 + src/com/sleepycat/je/tree/INTargetRep.java | 368 + src/com/sleepycat/je/tree/Key.java | 340 + src/com/sleepycat/je/tree/LN.java | 1172 ++ src/com/sleepycat/je/tree/MapLN.java | 345 + src/com/sleepycat/je/tree/NameLN.java | 227 + src/com/sleepycat/je/tree/Node.java | 174 + .../je/tree/NodeNotEmptyException.java | 34 + src/com/sleepycat/je/tree/OldBINDelta.java | 215 + src/com/sleepycat/je/tree/SearchResult.java | 50 + .../je/tree/SplitRequiredException.java | 25 + src/com/sleepycat/je/tree/StorageSize.java | 212 + src/com/sleepycat/je/tree/TrackingInfo.java | 51 + src/com/sleepycat/je/tree/Tree.java | 2796 ++++ src/com/sleepycat/je/tree/TreeLocation.java | 65 + src/com/sleepycat/je/tree/TreeUtils.java | 33 + .../je/tree/TreeWalkerStatsAccumulator.java | 27 + src/com/sleepycat/je/tree/VersionedLN.java | 72 + .../sleepycat/je/tree/WithRootLatched.java | 25 + .../sleepycat/je/tree/dupConvert/DBIN.java | 160 + src/com/sleepycat/je/tree/dupConvert/DIN.java | 250 + .../je/tree/dupConvert/DupConvert.java | 564 + .../je/tree/dupConvert/DupCountLN.java | 172 + .../je/tree/dupConvert/INDeleteInfo.java | 111 + .../je/tree/dupConvert/INDupDeleteInfo.java | 136 + .../je/tree/dupConvert/package-info.java | 18 + src/com/sleepycat/je/tree/package-info.java | 18 + .../je/trigger/PersistentTrigger.java | 151 + .../je/trigger/ReplicatedDatabaseTrigger.java | 187 + .../je/trigger/TransactionTrigger.java | 90 + src/com/sleepycat/je/trigger/Trigger.java | 177 + src/com/sleepycat/je/trigger/package.html | 118 + src/com/sleepycat/je/txn/BasicLocker.java | 378 + src/com/sleepycat/je/txn/BuddyLocker.java | 210 + .../sleepycat/je/txn/DummyLockManager.java | 273 + src/com/sleepycat/je/txn/HandleLocker.java | 121 + src/com/sleepycat/je/txn/Lock.java | 124 + .../sleepycat/je/txn/LockAttemptResult.java | 32 + src/com/sleepycat/je/txn/LockConflict.java | 60 + src/com/sleepycat/je/txn/LockGrantType.java | 67 + src/com/sleepycat/je/txn/LockImpl.java | 845 ++ src/com/sleepycat/je/txn/LockInfo.java | 141 + src/com/sleepycat/je/txn/LockManager.java | 2228 +++ src/com/sleepycat/je/txn/LockResult.java | 87 + .../sleepycat/je/txn/LockStatDefinition.java | 95 + src/com/sleepycat/je/txn/LockType.java | 211 + src/com/sleepycat/je/txn/LockUpgrade.java | 101 + src/com/sleepycat/je/txn/Locker.java | 936 ++ src/com/sleepycat/je/txn/LockerFactory.java | 222 + src/com/sleepycat/je/txn/PreparedTxn.java | 58 + .../sleepycat/je/txn/ReadCommittedLocker.java | 177 + src/com/sleepycat/je/txn/RollbackEnd.java | 126 + src/com/sleepycat/je/txn/RollbackStart.java | 170 + .../sleepycat/je/txn/SyncedLockManager.java | 270 + src/com/sleepycat/je/txn/ThinLockImpl.java | 202 + src/com/sleepycat/je/txn/ThreadLocker.java | 141 + src/com/sleepycat/je/txn/Txn.java | 2492 ++++ src/com/sleepycat/je/txn/TxnAbort.java | 49 + src/com/sleepycat/je/txn/TxnChain.java | 437 + src/com/sleepycat/je/txn/TxnCommit.java | 58 + src/com/sleepycat/je/txn/TxnEnd.java | 101 + src/com/sleepycat/je/txn/TxnManager.java | 456 + src/com/sleepycat/je/txn/TxnPrepare.java | 96 + src/com/sleepycat/je/txn/UndoReader.java | 115 + .../je/txn/VersionedWriteTxnEnd.java | 185 + src/com/sleepycat/je/txn/WriteLockInfo.java | 218 + src/com/sleepycat/je/txn/package-info.java | 17 + src/com/sleepycat/je/util/ConsoleHandler.java | 74 + src/com/sleepycat/je/util/DbBackup.java | 811 ++ src/com/sleepycat/je/util/DbCacheSize.java | 2222 +++ .../je/util/DbDeleteReservedFiles.java | 241 + src/com/sleepycat/je/util/DbDump.java | 473 + src/com/sleepycat/je/util/DbFilterStats.java | 355 + src/com/sleepycat/je/util/DbLoad.java | 646 + src/com/sleepycat/je/util/DbPrintLog.java | 393 + src/com/sleepycat/je/util/DbRunAction.java | 413 + src/com/sleepycat/je/util/DbScavenger.java | 467 + src/com/sleepycat/je/util/DbSpace.java | 558 + src/com/sleepycat/je/util/DbStat.java | 150 + src/com/sleepycat/je/util/DbTruncateLog.java | 159 + src/com/sleepycat/je/util/DbVerify.java | 304 + src/com/sleepycat/je/util/DbVerifyLog.java | 351 + src/com/sleepycat/je/util/FileHandler.java | 114 + .../je/util/LogVerificationException.java | 37 + .../je/util/LogVerificationInputStream.java | 273 + .../LogVerificationReadableByteChannel.java | 216 + src/com/sleepycat/je/util/Splitter.java | 115 + src/com/sleepycat/je/util/package.html | 25 + .../je/util/verify/BtreeVerifier.java | 2095 +++ .../je/util/verify/DataVerifier.java | 311 + .../je/util/verify/VerifierUtils.java | 92 + .../je/util/verify/package-info.java | 17 + .../je/utilint/ActiveTxnArrayStat.java | 118 + src/com/sleepycat/je/utilint/Adler32.java | 156 + .../sleepycat/je/utilint/AtomicIntStat.java | 116 + .../je/utilint/AtomicLongComponent.java | 86 + .../je/utilint/AtomicLongMapStat.java | 109 + .../sleepycat/je/utilint/AtomicLongStat.java | 116 + src/com/sleepycat/je/utilint/BaseStat.java | 58 + src/com/sleepycat/je/utilint/BitMap.java | 133 + src/com/sleepycat/je/utilint/BooleanStat.java | 66 + src/com/sleepycat/je/utilint/CmdUtil.java | 153 + .../sleepycat/je/utilint/CollectionUtils.java | 154 + .../je/utilint/ConfiguredRedirectHandler.java | 76 + .../je/utilint/ConsoleRedirectHandler.java | 59 + .../je/utilint/CronScheduleParser.java | 352 + .../sleepycat/je/utilint/DaemonRunner.java | 25 + .../sleepycat/je/utilint/DaemonThread.java | 292 + .../sleepycat/je/utilint/DatabaseUtil.java | 88 + .../je/utilint/DbCacheSizeRepEnv.java | 31 + src/com/sleepycat/je/utilint/DbLsn.java | 285 + .../je/utilint/DoubleExpMovingAvg.java | 197 + src/com/sleepycat/je/utilint/EventTrace.java | 334 + .../je/utilint/FileRedirectHandler.java | 81 + .../sleepycat/je/utilint/FileStoreInfo.java | 164 + src/com/sleepycat/je/utilint/FloatStat.java | 78 + src/com/sleepycat/je/utilint/FormatUtil.java | 72 + .../je/utilint/FormatterRedirectHandler.java | 55 + .../sleepycat/je/utilint/HexFormatter.java | 24 + src/com/sleepycat/je/utilint/IntStat.java | 86 + .../sleepycat/je/utilint/IntegralLongAvg.java | 91 + .../je/utilint/IntegralLongAvgStat.java | 100 + .../je/utilint/IntegralRateStat.java | 47 + .../je/utilint/InternalException.java | 35 + .../sleepycat/je/utilint/JVMSystemUtils.java | 180 + src/com/sleepycat/je/utilint/JarMain.java | 125 + .../je/utilint/Java7FileStoreInfo.java | 93 + src/com/sleepycat/je/utilint/LSNStat.java | 52 + src/com/sleepycat/je/utilint/LogVerifier.java | 433 + src/com/sleepycat/je/utilint/LoggerUtils.java | 587 + .../sleepycat/je/utilint/LongArrayStat.java | 124 + src/com/sleepycat/je/utilint/LongAvgRate.java | 252 + .../je/utilint/LongAvgRateMapStat.java | 178 + .../sleepycat/je/utilint/LongAvgRateStat.java | 117 + .../sleepycat/je/utilint/LongDiffMapStat.java | 83 + .../sleepycat/je/utilint/LongDiffStat.java | 189 + src/com/sleepycat/je/utilint/LongMaxStat.java | 72 + .../sleepycat/je/utilint/LongMaxZeroStat.java | 33 + src/com/sleepycat/je/utilint/LongMinStat.java | 65 + src/com/sleepycat/je/utilint/LongStat.java | 94 + src/com/sleepycat/je/utilint/MapStat.java | 202 + .../je/utilint/MapStatComponent.java | 46 + src/com/sleepycat/je/utilint/Matchpoint.java | 125 + .../sleepycat/je/utilint/NanoTimeUtil.java | 34 + .../je/utilint/NoClearAtomicLongStat.java | 45 + src/com/sleepycat/je/utilint/Pair.java | 41 + .../sleepycat/je/utilint/PollCondition.java | 54 + src/com/sleepycat/je/utilint/PropUtil.java | 222 + .../je/utilint/RelatchRequiredException.java | 33 + .../sleepycat/je/utilint/SizeofMarker.java | 22 + src/com/sleepycat/je/utilint/Stat.java | 121 + .../sleepycat/je/utilint/StatDefinition.java | 105 + src/com/sleepycat/je/utilint/StatGroup.java | 454 + .../je/utilint/StatsAccumulator.java | 201 + .../sleepycat/je/utilint/StoppableThread.java | 492 + .../je/utilint/StoppableThreadFactory.java | 82 + src/com/sleepycat/je/utilint/StringStat.java | 75 + src/com/sleepycat/je/utilint/TestHook.java | 44 + .../sleepycat/je/utilint/TestHookAdapter.java | 44 + .../sleepycat/je/utilint/TestHookExecute.java | 43 + src/com/sleepycat/je/utilint/Timestamp.java | 158 + src/com/sleepycat/je/utilint/TinyHashSet.java | 224 + .../sleepycat/je/utilint/TracerFormatter.java | 113 + src/com/sleepycat/je/utilint/VLSN.java | 233 + .../sleepycat/je/utilint/package-info.java | 17 + src/com/sleepycat/persist/BasicCursor.java | 389 + src/com/sleepycat/persist/BasicIndex.java | 298 + src/com/sleepycat/persist/BasicIterator.java | 88 + .../sleepycat/persist/DataValueAdapter.java | 62 + src/com/sleepycat/persist/DatabaseNamer.java | 118 + src/com/sleepycat/persist/EntityCursor.java | 1280 ++ src/com/sleepycat/persist/EntityIndex.java | 1216 ++ src/com/sleepycat/persist/EntityJoin.java | 385 + src/com/sleepycat/persist/EntityResult.java | 54 + src/com/sleepycat/persist/EntityStore.java | 941 ++ .../sleepycat/persist/EntityValueAdapter.java | 67 + src/com/sleepycat/persist/ForwardCursor.java | 127 + .../persist/IndexNotAvailableException.java | 86 + src/com/sleepycat/persist/KeySelector.java | 46 + .../sleepycat/persist/KeyValueAdapter.java | 61 + src/com/sleepycat/persist/KeysIndex.java | 138 + src/com/sleepycat/persist/PrimaryIndex.java | 752 + .../persist/PrimaryKeyValueAdapter.java | 61 + src/com/sleepycat/persist/SecondaryIndex.java | 1051 ++ src/com/sleepycat/persist/StoreConfig.java | 567 + .../persist/StoreConfigBeanInfo.java | 32 + .../persist/StoreExistsException.java | 60 + .../persist/StoreNotFoundException.java | 64 + src/com/sleepycat/persist/SubIndex.java | 422 + src/com/sleepycat/persist/SubIndexCursor.java | 91 + src/com/sleepycat/persist/ValueAdapter.java | 71 + .../sleepycat/persist/evolve/Conversion.java | 445 + .../sleepycat/persist/evolve/Converter.java | 143 + .../persist/evolve/DeletedClassException.java | 60 + src/com/sleepycat/persist/evolve/Deleter.java | 108 + .../persist/evolve/EntityConverter.java | 100 + .../persist/evolve/EvolveConfig.java | 124 + .../persist/evolve/EvolveConfigBeanInfo.java | 32 + .../sleepycat/persist/evolve/EvolveEvent.java | 53 + .../persist/evolve/EvolveInternal.java | 50 + .../persist/evolve/EvolveListener.java | 32 + .../sleepycat/persist/evolve/EvolveStats.java | 52 + .../evolve/IncompatibleClassException.java | 66 + .../sleepycat/persist/evolve/Mutation.java | 95 + .../sleepycat/persist/evolve/Mutations.java | 244 + src/com/sleepycat/persist/evolve/Renamer.java | 129 + src/com/sleepycat/persist/evolve/package.html | 402 + .../sleepycat/persist/impl/AbstractInput.java | 45 + src/com/sleepycat/persist/impl/Accessor.java | 277 + src/com/sleepycat/persist/impl/Catalog.java | 122 + .../persist/impl/CollectionProxy.java | 172 + .../persist/impl/ComparatorCatalog.java | 43 + .../sleepycat/persist/impl/ComplexFormat.java | 2313 +++ .../persist/impl/CompositeKeyFormat.java | 364 + .../persist/impl/ConverterReader.java | 81 + src/com/sleepycat/persist/impl/Enhanced.java | 175 + .../persist/impl/EnhancedAccessor.java | 215 + .../sleepycat/persist/impl/EntityInput.java | 130 + .../sleepycat/persist/impl/EntityOutput.java | 83 + .../sleepycat/persist/impl/EnumFormat.java | 253 + src/com/sleepycat/persist/impl/Evolver.java | 773 + src/com/sleepycat/persist/impl/FieldInfo.java | 258 + src/com/sleepycat/persist/impl/Format.java | 1172 ++ .../sleepycat/persist/impl/KeyLocation.java | 31 + src/com/sleepycat/persist/impl/MapProxy.java | 89 + .../persist/impl/NonPersistentFormat.java | 76 + .../persist/impl/ObjectArrayFormat.java | 228 + .../persist/impl/PersistCatalog.java | 1429 ++ .../persist/impl/PersistComparator.java | 162 + .../persist/impl/PersistEntityBinding.java | 324 + .../persist/impl/PersistKeyAssigner.java | 101 + .../persist/impl/PersistKeyBinding.java | 154 + .../persist/impl/PersistKeyCreator.java | 254 + .../persist/impl/PrimitiveArrayFormat.java | 150 + .../sleepycat/persist/impl/ProxiedFormat.java | 215 + .../persist/impl/RawAbstractInput.java | 252 + .../sleepycat/persist/impl/RawAccessor.java | 297 + .../sleepycat/persist/impl/RawArrayInput.java | 54 + .../persist/impl/RawComplexInput.java | 53 + .../persist/impl/RawSingleInput.java | 45 + .../persist/impl/ReadOnlyCatalog.java | 104 + src/com/sleepycat/persist/impl/Reader.java | 46 + .../sleepycat/persist/impl/RecordInput.java | 346 + .../sleepycat/persist/impl/RecordOutput.java | 196 + .../persist/impl/ReflectionAccessor.java | 537 + .../persist/impl/RefreshException.java | 142 + .../sleepycat/persist/impl/SimpleCatalog.java | 276 + .../sleepycat/persist/impl/SimpleFormat.java | 939 ++ src/com/sleepycat/persist/impl/Store.java | 1903 +++ .../sleepycat/persist/impl/StoredModel.java | 73 + .../sleepycat/persist/impl/WidenerInput.java | 605 + .../sleepycat/persist/impl/package-info.java | 17 + .../persist/model/AnnotationModel.java | 443 + .../persist/model/BytecodeEnhancer.java | 1758 +++ .../persist/model/ClassEnhancer.java | 329 + .../persist/model/ClassEnhancerTask.java | 114 + .../persist/model/ClassMetadata.java | 239 + .../sleepycat/persist/model/DeleteAction.java | 52 + src/com/sleepycat/persist/model/Entity.java | 262 + .../persist/model/EntityMetadata.java | 102 + .../sleepycat/persist/model/EntityModel.java | 398 + .../persist/model/FieldMetadata.java | 103 + src/com/sleepycat/persist/model/KeyField.java | 134 + .../persist/model/ModelInternal.java | 60 + .../persist/model/NotPersistent.java | 47 + .../sleepycat/persist/model/NotTransient.java | 47 + .../sleepycat/persist/model/Persistent.java | 51 + .../persist/model/PersistentProxy.java | 136 + .../sleepycat/persist/model/PrimaryKey.java | 182 + .../persist/model/PrimaryKeyMetadata.java | 73 + .../sleepycat/persist/model/Relationship.java | 66 + .../sleepycat/persist/model/SecondaryKey.java | 228 + .../persist/model/SecondaryKeyMetadata.java | 146 + src/com/sleepycat/persist/model/package.html | 5 + src/com/sleepycat/persist/package.html | 605 + src/com/sleepycat/persist/raw/RawField.java | 40 + src/com/sleepycat/persist/raw/RawObject.java | 336 + src/com/sleepycat/persist/raw/RawStore.java | 197 + src/com/sleepycat/persist/raw/RawType.java | 202 + src/com/sleepycat/persist/raw/package.html | 5 + src/com/sleepycat/util/ClassResolver.java | 142 + .../sleepycat/util/ConfigBeanInfoBase.java | 290 + .../sleepycat/util/ExceptionUnwrapper.java | 73 + src/com/sleepycat/util/ExceptionWrapper.java | 43 + src/com/sleepycat/util/FastInputStream.java | 218 + src/com/sleepycat/util/FastOutputStream.java | 300 + .../sleepycat/util/IOExceptionWrapper.java | 49 + src/com/sleepycat/util/PackedInteger.java | 1072 ++ .../util/RuntimeExceptionWrapper.java | 53 + src/com/sleepycat/util/UtfOps.java | 289 + src/com/sleepycat/util/keyrange/KeyRange.java | 356 + .../util/keyrange/KeyRangeException.java | 32 + .../sleepycat/util/keyrange/RangeCursor.java | 1496 ++ .../sleepycat/util/keyrange/package-info.java | 17 + src/com/sleepycat/util/package.html | 5 + .../sleepycat/utilint/ActivityCounter.java | 180 + src/com/sleepycat/utilint/Latency.java | 223 + src/com/sleepycat/utilint/LatencyStat.java | 324 + src/com/sleepycat/utilint/StatLogger.java | 276 + src/com/sleepycat/utilint/StatsTracker.java | 127 + src/com/sleepycat/utilint/StringUtils.java | 154 + src/com/sleepycat/utilint/package-info.java | 17 + .../bind/serial/test/MarshalledObject.java | 132 + .../bind/serial/test/NullClassCatalog.java | 46 + .../bind/serial/test/SerialBindingTest.java | 313 + .../bind/serial/test/TestClassCatalog.java | 74 + .../sleepycat/bind/test/BindingSpeedTest.java | 482 + .../bind/tuple/test/MarshalledObject.java | 141 + .../bind/tuple/test/TupleBindingTest.java | 486 + .../bind/tuple/test/TupleFormatTest.java | 1203 ++ .../bind/tuple/test/TupleOrderingTest.java | 578 + .../sleepycat/collections/KeyRangeTest.java | 426 + .../collections/test/CollectionTest.java | 2990 ++++ .../collections/test/ForeignKeyTest.java | 365 + .../collections/test/IterDeadlockTest.java | 218 + .../collections/test/IterRepositionTest.java | 122 + .../sleepycat/collections/test/JoinTest.java | 223 + .../test/NullTransactionRunner.java | 37 + .../collections/test/NullValueTest.java | 215 + .../test/SecondaryDeadlockTest.java | 202 + .../collections/test/TestDataBinding.java | 38 + .../collections/test/TestEntity.java | 49 + .../collections/test/TestEntityBinding.java | 68 + .../collections/test/TestKeyAssigner.java | 46 + .../collections/test/TestKeyCreator.java | 61 + .../collections/test/TestSR15721.java | 97 + .../sleepycat/collections/test/TestStore.java | 284 + .../collections/test/TransactionTest.java | 996 ++ .../collections/test/XACollectionTest.java | 141 + .../test/serial/CatalogCornerCaseTest.java | 92 + .../test/serial/StoredClassCatalogTest.java | 193 + .../serial/StoredClassCatalogTestInit.java | 169 + .../collections/test/serial/TestSerial.java | 75 + .../test/serial/TestSerial.java.original | 71 + .../test/serial/TupleSerialFactoryTest.java | 252 + test/com/sleepycat/je/ApiTest.java | 36 + test/com/sleepycat/je/ClassLoaderTest.java | 311 + test/com/sleepycat/je/ConfigBeanInfoTest.java | 292 + test/com/sleepycat/je/CursorEdgeTest.java | 729 + test/com/sleepycat/je/CursorTest.java | 1481 ++ .../sleepycat/je/DatabaseComparatorsTest.java | 663 + test/com/sleepycat/je/DatabaseConfigTest.java | 1103 ++ test/com/sleepycat/je/DatabaseEntryTest.java | 343 + test/com/sleepycat/je/DatabaseTest.java | 2863 ++++ test/com/sleepycat/je/DbHandleLockTest.java | 213 + test/com/sleepycat/je/DbTestProxy.java | 30 + test/com/sleepycat/je/DirtyReadTest.java | 216 + test/com/sleepycat/je/DupSlotReuseTest.java | 395 + test/com/sleepycat/je/EnvMultiSubDirTest.java | 207 + .../sleepycat/je/EnvironmentConfigTest.java | 245 + .../com/sleepycat/je/EnvironmentStatTest.java | 413 + test/com/sleepycat/je/EnvironmentTest.java | 1810 +++ .../sleepycat/je/GetSearchBothRangeTest.java | 502 + test/com/sleepycat/je/InterruptTest.java | 198 + .../je/LoadedClassImpl.java.original | 185 + .../sleepycat/je/MultiProcessWriteTest.java | 308 + test/com/sleepycat/je/ReadCommittedTest.java | 541 + .../sleepycat/je/RunRecoveryFailureTest.java | 174 + test/com/sleepycat/je/StatCaptureTest.java | 912 ++ test/com/sleepycat/je/TruncateTest.java | 711 + .../je/cleaner/BackgroundIOTest.java | 284 + .../com/sleepycat/je/cleaner/CleanerTest.java | 2123 +++ .../sleepycat/je/cleaner/CleanerTestBase.java | 71 + .../je/cleaner/CleanerTestUtils.java | 43 + .../sleepycat/je/cleaner/DiskLimitTest.java | 649 + .../je/cleaner/FileProtectorTest.java | 979 ++ .../je/cleaner/FileSelectionTest.java | 1492 ++ .../je/cleaner/INUtilizationTest.java | 1326 ++ .../je/cleaner/MakeMigrationLogFiles.java | 114 + test/com/sleepycat/je/cleaner/OffsetTest.java | 113 + .../sleepycat/je/cleaner/RMWLockingTest.java | 194 + .../je/cleaner/ReadOnlyLockingTest.java | 314 + .../sleepycat/je/cleaner/ReadOnlyProcess.java | 60 + .../com/sleepycat/je/cleaner/SR10553Test.java | 180 + .../com/sleepycat/je/cleaner/SR10597Test.java | 165 + .../com/sleepycat/je/cleaner/SR12885Test.java | 271 + .../com/sleepycat/je/cleaner/SR12978Test.java | 201 + .../com/sleepycat/je/cleaner/SR13061Test.java | 123 + .../com/sleepycat/je/cleaner/SR18567Test.java | 202 + .../sleepycat/je/cleaner/TTLCleaningTest.java | 870 ++ .../je/cleaner/TruncateAndRemoveTest.java | 1455 ++ .../sleepycat/je/cleaner/UtilizationTest.java | 1433 ++ test/com/sleepycat/je/cleaner/WakeupTest.java | 245 + test/com/sleepycat/je/cleaner/migrate_f0.jdb | Bin 0 -> 998963 bytes test/com/sleepycat/je/cleaner/migrate_f1.jdb | Bin 0 -> 922787 bytes .../sleepycat/je/cleaner/rmw_bad_offsets.jdb | Bin 0 -> 3597 bytes .../je/config/EnvironmentParamsTest.java | 93 + .../je/dbi/BINDeltaOperationTest.java | 496 + .../com/sleepycat/je/dbi/BINDeltaOpsTest.java | 881 ++ .../sleepycat/je/dbi/CodeCoverageTest.java | 64 + .../je/dbi/CompressedOopsDetectorTest.java | 42 + .../sleepycat/je/dbi/DbConfigManagerTest.java | 65 + .../sleepycat/je/dbi/DbCursorDeleteTest.java | 466 + .../com/sleepycat/je/dbi/DbCursorDupTest.java | 206 + .../je/dbi/DbCursorDuplicateDeleteTest.java | 1112 ++ .../je/dbi/DbCursorDuplicateTest.java | 1049 ++ .../dbi/DbCursorDuplicateValidationTest.java | 64 + .../sleepycat/je/dbi/DbCursorSearchTest.java | 314 + test/com/sleepycat/je/dbi/DbCursorTest.java | 1494 ++ .../sleepycat/je/dbi/DbCursorTestBase.java | 773 + test/com/sleepycat/je/dbi/DbEnvPoolTest.java | 239 + test/com/sleepycat/je/dbi/DbTreeTest.java | 67 + .../je/dbi/DeleteUpdateWithoutReadTest.java | 221 + .../sleepycat/je/dbi/DiskOrderedScanTest.java | 1610 ++ .../je/dbi/DuplicateEntryException.java | 29 + .../com/sleepycat/je/dbi/EmbeddedOpsTest.java | 606 + test/com/sleepycat/je/dbi/INListTest.java | 466 + .../sleepycat/je/dbi/MemoryBudgetTest.java | 115 + test/com/sleepycat/je/dbi/NullCursor.java | 34 + test/com/sleepycat/je/dbi/SR12641.java | 201 + .../je/dbi/SortedLSNTreeWalkerTest.java | 424 + .../sleepycat/je/dbi/StartupTrackerTest.java | 117 + .../sleepycat/je/dbi/UncontendedLockTest.java | 276 + .../je/evictor/BackgroundEvictionTest.java | 330 + .../sleepycat/je/evictor/CacheModeTest.java | 1057 ++ .../sleepycat/je/evictor/EvictActionTest.java | 997 ++ .../je/evictor/EvictNNodesStatsTest.java | 381 + .../je/evictor/EvictSelectionTest.java | 239 + .../je/evictor/EvictionThreadPoolTest.java | 180 + test/com/sleepycat/je/evictor/LRUTest.java | 423 + .../je/evictor/MeasureOffHeapMemory.java | 336 + .../je/evictor/OffHeapAllocatorTest.java | 54 + .../je/evictor/OffHeapCacheTest.java | 689 + .../sleepycat/je/evictor/SharedCacheTest.java | 800 + .../com/sleepycat/je/incomp/EmptyBINTest.java | 449 + .../sleepycat/je/incomp/INCompressorTest.java | 1297 ++ test/com/sleepycat/je/je.properties | 4 + .../sleepycat/je/jmx/JEApplicationMBean.java | 328 + .../sleepycat/je/jmx/JEDiagnosticsTest.java | 260 + test/com/sleepycat/je/jmx/JEMonitorTest.java | 275 + test/com/sleepycat/je/jmx/MBeanTest.java | 118 + test/com/sleepycat/je/jmx/MBeanTestUtils.java | 265 + .../sleepycat/je/junit/JUnitMethodThread.java | 53 + .../je/junit/JUnitProcessThread.java | 157 + test/com/sleepycat/je/junit/JUnitThread.java | 130 + test/com/sleepycat/je/latch/LatchTest.java | 442 + .../je/log/BufferPoolReadLatchTest.java | 112 + .../sleepycat/je/log/FSyncManagerTest.java | 277 + .../sleepycat/je/log/FileEdgeCaseTest.java | 300 + .../je/log/FileManagerMultiDataDirTest.java | 289 + .../com/sleepycat/je/log/FileManagerTest.java | 634 + .../je/log/FileManagerTestUtils.java | 49 + .../je/log/FileReaderBufferingTest.java | 175 + test/com/sleepycat/je/log/FileReaderTest.java | 166 + .../sleepycat/je/log/INFileReaderTest.java | 436 + .../com/sleepycat/je/log/IOExceptionTest.java | 299 + test/com/sleepycat/je/log/InvisibleTest.java | 349 + .../sleepycat/je/log/LNFileReaderTest.java | 515 + .../sleepycat/je/log/LastFileReaderTest.java | 601 + .../sleepycat/je/log/LogBufferPoolTest.java | 305 + test/com/sleepycat/je/log/LogEntryTest.java | 102 + test/com/sleepycat/je/log/LogFileGapTest.java | 197 + test/com/sleepycat/je/log/LogFlusherTest.java | 556 + test/com/sleepycat/je/log/LogManagerTest.java | 1071 ++ test/com/sleepycat/je/log/LogUtilsTest.java | 172 + test/com/sleepycat/je/log/LoggableTest.java | 419 + .../sleepycat/je/log/TestUtilLogReader.java | 85 + test/com/sleepycat/je/log/WriteQueueTest.java | 297 + .../je/logversion/LogEntryVersionTest.java | 385 + .../je/logversion/LogHeaderVersionTest.java | 107 + .../logversion/MakeLogEntryVersionData.java | 315 + .../logversion/MakeLogHeaderVersionData.java | 80 + test/com/sleepycat/je/logversion/Utils.java | 40 + test/com/sleepycat/je/logversion/je-1.5.4.jdb | Bin 0 -> 17648 bytes test/com/sleepycat/je/logversion/je-1.5.4.txt | 186 + test/com/sleepycat/je/logversion/je-1.7.0.jdb | Bin 0 -> 17657 bytes test/com/sleepycat/je/logversion/je-1.7.0.txt | 189 + test/com/sleepycat/je/logversion/je-2.0.0.jdb | Bin 0 -> 10206 bytes test/com/sleepycat/je/logversion/je-2.0.0.txt | 149 + .../com/sleepycat/je/logversion/je-3.1.25.jdb | Bin 0 -> 10653 bytes .../com/sleepycat/je/logversion/je-3.1.25.txt | 149 + .../com/sleepycat/je/logversion/je-3.2.22.jdb | Bin 0 -> 10819 bytes .../com/sleepycat/je/logversion/je-3.2.22.txt | 151 + .../com/sleepycat/je/logversion/je-3.2.79.jdb | Bin 0 -> 11689 bytes .../com/sleepycat/je/logversion/je-3.2.79.txt | 164 + .../com/sleepycat/je/logversion/je-3.3.78.jdb | Bin 0 -> 7984 bytes .../com/sleepycat/je/logversion/je-3.3.78.txt | 171 + .../com/sleepycat/je/logversion/je-4.0.51.jdb | Bin 0 -> 7212 bytes .../com/sleepycat/je/logversion/je-4.0.51.txt | 167 + .../com/sleepycat/je/logversion/je-5.0.39.jdb | Bin 0 -> 5848 bytes .../com/sleepycat/je/logversion/je-5.0.39.txt | 132 + .../com/sleepycat/je/logversion/je-6.0.13.jdb | Bin 0 -> 6031 bytes .../com/sleepycat/je/logversion/je-6.0.13.txt | 132 + .../com/sleepycat/je/logversion/je-6.2.12.jdb | Bin 0 -> 6054 bytes .../com/sleepycat/je/logversion/je-6.2.12.txt | 132 + .../com/sleepycat/je/logversion/je-6.4.14.jdb | Bin 0 -> 6002 bytes .../com/sleepycat/je/logversion/je-6.4.14.txt | 131 + test/com/sleepycat/je/logversion/je-7.0.6.jdb | Bin 0 -> 6526 bytes test/com/sleepycat/je/logversion/je-7.0.6.txt | 140 + test/com/sleepycat/je/logversion/je-7.1.9.jdb | Bin 0 -> 6533 bytes test/com/sleepycat/je/logversion/je-7.1.9.txt | 140 + .../sleepycat/je/logversion/maxversion.jdb | Bin 0 -> 1712 bytes .../sleepycat/je/logversion/minversion.jdb | Bin 0 -> 1333 bytes .../je/recovery/CheckBINDeltaTest.java | 166 + test/com/sleepycat/je/recovery/CheckBase.java | 515 + .../je/recovery/CheckNewRootTest.java | 431 + .../je/recovery/CheckReverseSplitsTest.java | 307 + .../je/recovery/CheckSplitAuntTest.java | 155 + .../je/recovery/CheckSplitsTest.java | 392 + .../je/recovery/CheckpointActivationTest.java | 290 + .../recovery/DbConfigUpdateRecoveryTest.java | 197 + .../je/recovery/LNSlotReuseTest.java | 164 + .../je/recovery/Level2SplitBugTest.java | 331 + .../sleepycat/je/recovery/MultiEnvTest.java | 45 + .../je/recovery/Recovery2PCTest.java | 624 + .../je/recovery/RecoveryAbortTest.java | 709 + .../je/recovery/RecoveryCheckpointTest.java | 415 + .../je/recovery/RecoveryDeleteTest.java | 81 + .../je/recovery/RecoveryDeltaTest.java | 379 + .../je/recovery/RecoveryDuplicatesTest.java | 117 + .../je/recovery/RecoveryEdgeTest.java | 525 + .../sleepycat/je/recovery/RecoveryTest.java | 314 + .../je/recovery/RecoveryTestBase.java | 952 ++ .../je/recovery/Rollback2PCTest.java | 203 + .../je/recovery/RollbackTrackerTest.java | 643 + .../je/recovery/stepwise/CommitEntry.java | 58 + .../recovery/stepwise/EntryTrackerReader.java | 163 + .../je/recovery/stepwise/LogEntryInfo.java | 67 + .../stepwise/NonTxnalDeletedEntry.java | 60 + .../je/recovery/stepwise/NonTxnalEntry.java | 52 + .../je/recovery/stepwise/TestData.java | 77 + .../recovery/stepwise/TxnalDeletedEntry.java | 64 + .../je/recovery/stepwise/TxnalEntry.java | 64 + test/com/sleepycat/je/rep.properties | 6 + .../com/sleepycat/je/rep/CheckAccessTest.java | 156 + .../com/sleepycat/je/rep/CheckConfigTest.java | 668 + .../rep/CommitPointConsistencyPolicyTest.java | 175 + test/com/sleepycat/je/rep/ConversionTest.java | 120 + .../je/rep/DatabaseOperationTest.java | 1035 ++ .../rep/ElectableGroupSizeOverrideTest.java | 264 + .../sleepycat/je/rep/ExceptionIdiomsTest.java | 313 + .../je/rep/ExternalNodeTypeTest.java | 207 + .../com/sleepycat/je/rep/GroupCommitTest.java | 196 + test/com/sleepycat/je/rep/HandshakeTest.java | 323 + .../sleepycat/je/rep/HardRecoveryTest.java | 621 + test/com/sleepycat/je/rep/JoinGroupTest.java | 297 + .../je/rep/JoinGroupTimeoutsTest.java | 206 + .../sleepycat/je/rep/LocalWriteTxnTest.java | 631 + .../je/rep/LogRewriteWarningTest.java | 175 + .../sleepycat/je/rep/MasterChangeTest.java | 621 + test/com/sleepycat/je/rep/MockClientNode.java | 261 + .../je/rep/MultiProcessOpenEnvTest.java | 886 ++ .../sleepycat/je/rep/NodePriorityTest.java | 214 + test/com/sleepycat/je/rep/ParamTest.java | 127 + .../je/rep/PerDbReplicationTest.java | 161 + .../je/rep/RecoveryUtilizationTest.java | 155 + .../je/rep/RepEnvMultiSubDirTest.java | 312 + .../sleepycat/je/rep/RepGroupAdminTest.java | 228 + .../sleepycat/je/rep/RepIDSequenceTest.java | 182 + test/com/sleepycat/je/rep/RepPreloadTest.java | 358 + .../rep/ReplicatedEnvironmentStatsTest.java | 94 + .../je/rep/ReplicatedEnvironmentTest.java | 974 ++ .../je/rep/ReplicatedTransactionTest.java | 828 ++ .../je/rep/ReplicationConfigTest.java | 193 + .../je/rep/ReplicationGroupTest.java | 138 + .../je/rep/ReplicationNetworkConfigTest.java | 1233 ++ .../je/rep/ReplicationRateStatsTest.java | 535 + .../sleepycat/je/rep/SecondaryNodeTest.java | 515 + .../sleepycat/je/rep/SerializationTest.java | 83 + .../je/rep/StateChangeListenerTest.java | 301 + .../je/rep/StoredClassCatalogTest.java | 89 + .../je/rep/UnknownStateReplicaTest.java | 182 + .../je/rep/UnresolvedHelperHostTest.java | 215 + .../com/sleepycat/je/rep/arb/ArbiterTest.java | 2122 +++ .../je/rep/dual/ClassLoaderTest.java | 17 + .../sleepycat/je/rep/dual/CursorEdgeTest.java | 22 + .../com/sleepycat/je/rep/dual/CursorTest.java | 27 + .../je/rep/dual/DatabaseComparatorsTest.java | 42 + .../je/rep/dual/DatabaseConfigTest.java | 42 + .../je/rep/dual/DatabaseEntryTest.java | 17 + .../sleepycat/je/rep/dual/DatabaseTest.java | 83 + .../je/rep/dual/DbHandleLockTest.java | 17 + .../sleepycat/je/rep/dual/DirtyReadTest.java | 17 + .../je/rep/dual/EnvironmentTest.java | 121 + .../je/rep/dual/GetSearchBothRangeTest.java | 18 + .../je/rep/dual/ReadCommittedTest.java | 17 + .../sleepycat/je/rep/dual/SecondaryTest.java | 56 + .../sleepycat/je/rep/dual/TruncateTest.java | 93 + .../sleepycat/je/rep/dual/dbi/DbTreeTest.java | 17 + .../je/rep/dual/dbi/EmbeddedOpsTest.java | 17 + .../rep/dual/dbi/SortedLSNTreeWalkerTest.java | 18 + .../je/rep/dual/incomp/INCompressorTest.java | 95 + .../je/rep/dual/log/FileReaderTest.java | 21 + .../rep/dual/persist/test/ForeignKeyTest.java | 33 + .../je/rep/dual/persist/test/IndexTest.java | 29 + .../je/rep/dual/persist/test/JoinTest.java | 30 + .../rep/dual/persist/test/NegativeTest.java | 29 + .../rep/dual/persist/test/OperationTest.java | 30 + .../rep/dual/persist/test/SequenceTest.java | 16 + .../dual/persist/test/SubclassIndexTest.java | 17 + .../je/rep/dual/test/AtomicPutTest.java | 32 + .../je/rep/dual/test/ForeignKeyTest.java | 30 + .../je/rep/dual/test/InternalCursorTest.java | 31 + .../sleepycat/je/rep/dual/test/JoinTest.java | 30 + .../je/rep/dual/test/PhantomRestartTest.java | 22 + .../je/rep/dual/test/PhantomTest.java | 23 + .../rep/dual/test/SecondaryDirtyReadTest.java | 36 + .../je/rep/dual/test/SequenceTest.java | 30 + .../sleepycat/je/rep/dual/test/TTLTest.java | 51 + .../je/rep/dual/test/ToManyTest.java | 33 + .../je/rep/dual/tree/KeyPrefixTest.java | 16 + .../je/rep/dual/tree/MemorySizeTest.java | 24 + .../je/rep/dual/tree/SR13034Test.java | 16 + .../rep/dual/tree/SplitRace_SR11144Test.java | 17 + .../sleepycat/je/rep/dual/tree/SplitTest.java | 16 + .../je/rep/dual/trigger/ConfigTest.java | 60 + .../je/rep/dual/trigger/InvokeTest.java | 260 + .../je/rep/dual/txn/LockManagerTest.java | 16 + .../sleepycat/je/rep/dual/txn/LockTest.java | 16 + .../je/rep/dual/txn/TxnFSyncTest.java | 47 + .../je/rep/dual/txn/TxnMemoryTest.java | 34 + .../sleepycat/je/rep/dual/txn/TxnTest.java | 39 + .../je/rep/dual/txn/TxnTimeoutTest.java | 68 + .../je/rep/dual/util/VerifyLogTest.java | 16 + .../je/rep/dupconvert/RepDupConvertTest.java | 252 + .../dupconvert/je-4.1.7_deletedLNCommit_0.jdb | Bin 0 -> 22879 bytes .../dupconvert/je-4.1.7_deletedLNCommit_1.jdb | Bin 0 -> 4535 bytes .../dupconvert/je-4.1.7_deletedLNCommit_2.jdb | Bin 0 -> 1938 bytes .../je-4.1.7_deletedLNNoCommit_0.jdb | Bin 0 -> 23014 bytes .../je-4.1.7_deletedLNNoCommit_1.jdb | Bin 0 -> 4535 bytes .../je-4.1.7_deletedLNNoCommit_2.jdb | Bin 0 -> 1938 bytes .../je/rep/dupconvert/je-4.1.7_din_0.jdb | Bin 0 -> 18550 bytes .../je/rep/dupconvert/je-4.1.7_din_1.jdb | Bin 0 -> 18550 bytes .../je/rep/dupconvert/je-4.1.7_din_2.jdb | Bin 0 -> 18550 bytes .../je/rep/dupconvert/je-4.1.7_mixIN_0.jdb | Bin 0 -> 27834 bytes .../je/rep/dupconvert/je-4.1.7_mixIN_1.jdb | Bin 0 -> 4535 bytes .../je/rep/dupconvert/je-4.1.7_mixIN_2.jdb | Bin 0 -> 1938 bytes .../rep/dupconvert/je-4.1.7_singletonLN_0.jdb | Bin 0 -> 21385 bytes .../rep/dupconvert/je-4.1.7_singletonLN_1.jdb | Bin 0 -> 21385 bytes .../rep/dupconvert/je-4.1.7_singletonLN_2.jdb | Bin 0 -> 21385 bytes .../je/rep/elections/AcceptorTest.java | 191 + .../elections/ElectionWithLogVersionTest.java | 223 + .../je/rep/elections/ElectionsTest.java | 502 + .../je/rep/elections/JoinerElectionTest.java | 226 + .../je/rep/elections/ProtocolFailureTest.java | 273 + .../je/rep/elections/ProtocolTest.java | 394 + .../je/rep/elections/RankingProposerTest.java | 295 + .../je/rep/elections/VLSNFreezeLatchTest.java | 85 + .../com/sleepycat/je/rep/impl/DTVLSNTest.java | 440 + .../je/rep/impl/DynamicGroupTest.java | 504 + .../je/rep/impl/GroupDbAckFailureTest.java | 275 + .../je/rep/impl/GroupServiceTest.java | 171 + .../rep/impl/NetworkPartitionHealingTest.java | 296 + .../je/rep/impl/NodeStateProtocolTest.java | 60 + .../sleepycat/je/rep/impl/RepGroupDBTest.java | 189 + .../impl/RepGroupImplCompatibilityTest.java | 98 + .../je/rep/impl/RepGroupImplTest.java | 57 + .../je/rep/impl/RepGroupProtocolTest.java | 306 + .../sleepycat/je/rep/impl/RepTestBase.java | 622 + .../ReplayWithBinDeltaInsertionsTest.java | 314 + .../sleepycat/je/rep/impl/RoundRobinTest.java | 307 + .../je/rep/impl/TextProtocolTestBase.java | 109 + .../InterruptedNetworkRestoreTest.java | 262 + .../networkRestore/NetworkBackupTest.java | 693 + .../NetworkRestoreNoMasterTest.java | 236 + .../networkRestore/NetworkRestoreTest.java | 475 + .../networkRestore/OneNodeRestoreTest.java | 272 + .../rep/impl/networkRestore/ProtocolTest.java | 130 + .../je/rep/impl/node/CBVLSNTest.java | 602 + .../je/rep/impl/node/DbCacheTest.java | 117 + .../rep/impl/node/FeederRecordBatchTest.java | 179 + .../je/rep/impl/node/GroupShutdownTest.java | 423 + .../je/rep/impl/node/MasterBounceTest.java | 69 + .../je/rep/impl/node/MasterTransferTest.java | 3129 ++++ .../rep/impl/node/MinRetainedVLSNsTest.java | 116 + .../rep/impl/node/MinorityTransferTest.java | 163 + .../je/rep/impl/node/PrimaryNodeTest.java | 552 + .../je/rep/impl/node/RepNodeTest.java | 70 + .../ReplicaMasterStateTransitionsTest.java | 98 + .../impl/node/ReplicaOutputThreadTest.java | 240 + .../je/rep/impl/node/ReplicaTimeoutTest.java | 143 + .../je/rep/impl/node/UpdateJEVersionTest.java | 398 + .../rep/impl/node/UpdateNodeAddressTest.java | 248 + .../je/rep/jmx/RepJEDiagnosticsTest.java | 66 + .../je/rep/jmx/RepJEMonitorTest.java | 67 + .../MonitorChangeListenerNoEventsTest.java | 80 + .../monitor/MonitorChangeListenerTest.java | 368 + .../sleepycat/je/rep/monitor/MonitorTest.java | 263 + .../je/rep/monitor/MonitorTestBase.java | 173 + .../je/rep/monitor/PingCommandTest.java | 423 + .../je/rep/monitor/ProtocolTest.java | 164 + .../je/rep/node/replica/ReplayTest.java | 179 + .../je/rep/persist/test/AppBaseImpl.java | 84 + .../je/rep/persist/test/AppImpl.java.0 | 204 + .../je/rep/persist/test/AppImpl.java.1 | 308 + .../je/rep/persist/test/AppInterface.java | 45 + .../je/rep/persist/test/SimpleTest.java | 214 + .../je/rep/persist/test/UpgradeTest.java | 900 ++ test/com/sleepycat/je/rep/secure.properties | 9 + .../je/rep/stream/FeederFilterTest.java | 277 + .../je/rep/stream/FeederReaderTest.java | 729 + .../je/rep/stream/FeederWriteQueueTest.java | 188 + .../sleepycat/je/rep/stream/ProtocolTest.java | 424 + .../rep/stream/ReplicaSyncupReaderTest.java | 229 + .../je/rep/stream/VLSNTestUtils.java | 284 + .../subscription/EntryRequestTypeTest.java | 364 + .../SubscriptionAuthTestHelper.java | 169 + .../subscription/SubscriptionConfigTest.java | 348 + .../je/rep/subscription/SubscriptionTest.java | 582 + .../subscription/SubscriptionTestBase.java | 523 + .../sleepycat/je/rep/txn/CommitTokenTest.java | 136 + .../sleepycat/je/rep/txn/ExceptionTest.java | 110 + .../je/rep/txn/LockPreemptionTest.java | 785 + .../je/rep/txn/PostLogCommitTest.java | 220 + .../je/rep/txn/RepAutoCommitTest.java | 253 + .../je/rep/txn/ReplayRecoveryTest.java | 746 + .../sleepycat/je/rep/txn/RollbackTest.java | 546 + .../je/rep/txn/RollbackToMatchpointTest.java | 1044 ++ .../je/rep/txn/RollbackWorkload.java | 787 + test/com/sleepycat/je/rep/txn/Utils.java | 97 + .../je/rep/util/DbGroupAdminTest.java | 738 + .../com/sleepycat/je/rep/util/DbPingTest.java | 162 + .../je/rep/util/EnableRenameTest.java | 156 + .../sleepycat/je/rep/util/EnvConvertTest.java | 617 + .../sleepycat/je/rep/util/RepEnvWrapper.java | 220 + .../je/rep/util/RepSequenceTest.java | 293 + .../je/rep/util/ResetRepGroupTest.java | 328 + .../je/rep/util/ServiceDispatcherTest.java | 302 + .../rep/util/ServiceDispatcherTestBase.java | 51 + .../sleepycat/je/rep/util/TestChannel.java | 46 + .../sleepycat/je/rep/util/TestLogItem.java | 28 + .../je/rep/util/ldiff/BlockBagTest.java | 600 + .../je/rep/util/ldiff/LDiffServiceTest.java | 388 + .../je/rep/util/ldiff/LDiffTest.java | 493 + .../je/rep/util/ldiff/LDiffTestUtils.java | 173 + .../je/rep/util/ldiff/LDiffUtilTest.java | 56 + .../je/rep/util/ldiff/ProtocolTest.java | 100 + .../rep/util/ldiff/RemoteProcessingTest.java | 89 + .../je/rep/util/ldiff/WindowTest.java | 151 + .../je/rep/utilint/HandshakeTest.java | 317 + .../je/rep/utilint/LocalAliasNameService.java | 238 + .../je/rep/utilint/RepTestUtils.java | 2155 +++ .../je/rep/utilint/SimpleTxnMapTest.java | 172 + .../je/rep/utilint/SizeAwaitMapTest.java | 215 + .../utilint/TestPasswordAuthentication.java | 217 + .../je/rep/utilint/ValidStateListener.java | 35 + .../rep/utilint/WaitForDetachedListener.java | 39 + .../je/rep/utilint/WaitForListener.java | 87 + .../je/rep/utilint/WaitForMasterListener.java | 45 + .../rep/utilint/WaitForReplicaListener.java | 43 + .../je/rep/utilint/net/SSLChannelTest.java | 1175 ++ .../rep/utilint/net/SSLMultiThreadTest.java | 633 + test/com/sleepycat/je/rep/vlsn/MergeTest.java | 432 + .../je/rep/vlsn/SyncupWithGapsTest.java | 451 + test/com/sleepycat/je/rep/vlsn/VLPair.java | 40 + .../je/rep/vlsn/VLSNAwaitConsistencyTest.java | 146 + .../sleepycat/je/rep/vlsn/VLSNBucketTest.java | 378 + .../sleepycat/je/rep/vlsn/VLSNCacheTest.java | 781 + .../je/rep/vlsn/VLSNCleanerTest.java | 151 + .../je/rep/vlsn/VLSNConsistencyTest.java | 418 + .../sleepycat/je/rep/vlsn/VLSNIndexTest.java | 1461 ++ .../je/rep/vlsn/VLSNIndexTruncateTest.java | 508 + .../4.0.106/com.sleepycat.je.BtreeStats.out | Bin 0 -> 475 bytes .../4.0.106/com.sleepycat.je.CommitToken.out | Bin 0 -> 172 bytes ...m.sleepycat.je.DatabaseExistsException.out | Bin 0 -> 842 bytes ...sleepycat.je.DatabaseNotFoundException.out | Bin 0 -> 844 bytes .../com.sleepycat.je.DeadlockException.out | Bin 0 -> 954 bytes ...sleepycat.je.DeleteConstraintException.out | Bin 0 -> 1167 bytes ...om.sleepycat.je.DuplicateDataException.out | Bin 0 -> 841 bytes ...eepycat.je.EnvironmentFailureException.out | Bin 0 -> 1122 bytes ...leepycat.je.EnvironmentLockedException.out | Bin 0 -> 1185 bytes ...epycat.je.EnvironmentNotFoundException.out | Bin 0 -> 1297 bytes .../com.sleepycat.je.EnvironmentStats.out | Bin 0 -> 1102 bytes ...leepycat.je.ForeignConstraintException.out | Bin 0 -> 1168 bytes ...sleepycat.je.LockNotAvailableException.out | Bin 0 -> 962 bytes ...m.sleepycat.je.LockNotGrantedException.out | Bin 0 -> 1009 bytes .../4.0.106/com.sleepycat.je.LockStats.out | Bin 0 -> 388 bytes .../com.sleepycat.je.LockTimeoutException.out | Bin 0 -> 957 bytes .../com.sleepycat.je.LogWriteException.out | Bin 0 -> 1228 bytes .../4.0.106/com.sleepycat.je.PreloadStats.out | Bin 0 -> 299 bytes .../com.sleepycat.je.PreloadStatus.out | Bin 0 -> 92 bytes ...eepycat.je.SecondaryIntegrityException.out | Bin 0 -> 1109 bytes ...m.sleepycat.je.SequenceExistsException.out | Bin 0 -> 842 bytes ...leepycat.je.SequenceIntegrityException.out | Bin 0 -> 845 bytes ...sleepycat.je.SequenceNotFoundException.out | Bin 0 -> 844 bytes ...sleepycat.je.SequenceOverflowException.out | Bin 0 -> 844 bytes .../com.sleepycat.je.SequenceStats.out | Bin 0 -> 341 bytes ...leepycat.je.ThreadInterruptedException.out | Bin 0 -> 1396 bytes ...m.sleepycat.je.TransactionStats$Active.out | Bin 0 -> 131 bytes .../com.sleepycat.je.TransactionStats.out | Bin 0 -> 344 bytes ...eepycat.je.TransactionTimeoutException.out | Bin 0 -> 964 bytes ...sleepycat.je.UniqueConstraintException.out | Bin 0 -> 1167 bytes ....sleepycat.je.VersionMismatchException.out | Bin 0 -> 1321 bytes .../com.sleepycat.je.XAFailureException.out | Bin 0 -> 884 bytes ...ycat.je.rep.DatabasePreemptedException.out | Bin 0 -> 912 bytes ...leepycat.je.rep.GroupShutdownException.out | Bin 0 -> 1491 bytes ...pycat.je.rep.InsufficientAcksException.out | Bin 0 -> 1104 bytes ...epycat.je.rep.InsufficientLogException.out | Bin 0 -> 1380 bytes ...t.je.rep.InsufficientReplicasException.out | Bin 0 -> 1198 bytes ...leepycat.je.rep.LockPreemptedException.out | Bin 0 -> 1121 bytes ...sleepycat.je.rep.LogOverwriteException.out | Bin 0 -> 844 bytes ....sleepycat.je.rep.MasterStateException.out | Bin 0 -> 961 bytes ...eepycat.je.rep.MemberNotFoundException.out | Bin 0 -> 842 bytes ...cat.je.rep.ReplicaConsistencyException.out | Bin 0 -> 917 bytes ...sleepycat.je.rep.ReplicaWriteException.out | Bin 0 -> 996 bytes ...ycat.je.rep.ReplicatedEnvironmentStats.out | Bin 0 -> 3696 bytes ...com.sleepycat.je.rep.RollbackException.out | Bin 0 -> 1564 bytes ...cat.je.rep.RollbackProhibitedException.out | Bin 0 -> 1645 bytes ...leepycat.je.rep.UnknownMasterException.out | Bin 0 -> 963 bytes ...leepycat.je.tree.CursorsExistException.out | Bin 0 -> 665 bytes ...leepycat.je.tree.NodeNotEmptyException.out | Bin 0 -> 665 bytes ...pycat.je.util.LogVerificationException.out | Bin 0 -> 708 bytes ...sleepycat.je.utilint.InternalException.out | Bin 0 -> 705 bytes ...cat.persist.IndexNotAvailableException.out | Bin 0 -> 850 bytes ...sleepycat.persist.StoreExistsException.out | Bin 0 -> 844 bytes ...eepycat.persist.StoreNotFoundException.out | Bin 0 -> 846 bytes ...t.persist.evolve.DeletedClassException.out | Bin 0 -> 852 bytes ...sist.evolve.IncompatibleClassException.out | Bin 0 -> 857 bytes .../com.sleepycat.util.IOExceptionWrapper.out | Bin 0 -> 800 bytes ...sleepycat.util.RuntimeExceptionWrapper.out | Bin 0 -> 819 bytes ...epycat.util.keyrange.KeyRangeException.out | Bin 0 -> 763 bytes .../4.1.6/com.sleepycat.je.BtreeStats.out | Bin 0 -> 475 bytes .../4.1.6/com.sleepycat.je.CommitToken.out | Bin 0 -> 172 bytes ...m.sleepycat.je.DatabaseExistsException.out | Bin 0 -> 840 bytes ...sleepycat.je.DatabaseNotFoundException.out | Bin 0 -> 842 bytes .../com.sleepycat.je.DeadlockException.out | Bin 0 -> 952 bytes ...sleepycat.je.DeleteConstraintException.out | Bin 0 -> 1165 bytes ...om.sleepycat.je.DuplicateDataException.out | Bin 0 -> 839 bytes ...eepycat.je.EnvironmentFailureException.out | Bin 0 -> 1107 bytes ...leepycat.je.EnvironmentLockedException.out | Bin 0 -> 1170 bytes ...epycat.je.EnvironmentNotFoundException.out | Bin 0 -> 1282 bytes .../com.sleepycat.je.EnvironmentStats.out | Bin 0 -> 1102 bytes ...leepycat.je.ForeignConstraintException.out | Bin 0 -> 1166 bytes ...sleepycat.je.LockNotAvailableException.out | Bin 0 -> 960 bytes ...m.sleepycat.je.LockNotGrantedException.out | Bin 0 -> 1007 bytes .../4.1.6/com.sleepycat.je.LockStats.out | Bin 0 -> 388 bytes .../com.sleepycat.je.LockTimeoutException.out | Bin 0 -> 955 bytes .../com.sleepycat.je.LogWriteException.out | Bin 0 -> 1213 bytes .../4.1.6/com.sleepycat.je.PreloadStats.out | Bin 0 -> 299 bytes .../4.1.6/com.sleepycat.je.PreloadStatus.out | Bin 0 -> 92 bytes ...eepycat.je.SecondaryIntegrityException.out | Bin 0 -> 1107 bytes ...m.sleepycat.je.SequenceExistsException.out | Bin 0 -> 840 bytes ...leepycat.je.SequenceIntegrityException.out | Bin 0 -> 843 bytes ...sleepycat.je.SequenceNotFoundException.out | Bin 0 -> 842 bytes ...sleepycat.je.SequenceOverflowException.out | Bin 0 -> 842 bytes .../4.1.6/com.sleepycat.je.SequenceStats.out | Bin 0 -> 341 bytes ...leepycat.je.ThreadInterruptedException.out | Bin 0 -> 1381 bytes ...m.sleepycat.je.TransactionStats$Active.out | Bin 0 -> 131 bytes .../com.sleepycat.je.TransactionStats.out | Bin 0 -> 344 bytes ...eepycat.je.TransactionTimeoutException.out | Bin 0 -> 962 bytes ...sleepycat.je.UniqueConstraintException.out | Bin 0 -> 1165 bytes ....sleepycat.je.VersionMismatchException.out | Bin 0 -> 1306 bytes .../com.sleepycat.je.XAFailureException.out | Bin 0 -> 882 bytes ...com.sleepycat.je.log.ChecksumException.out | Bin 0 -> 666 bytes ...ycat.je.rep.DatabasePreemptedException.out | Bin 0 -> 910 bytes ...leepycat.je.rep.GroupShutdownException.out | Bin 0 -> 1476 bytes ...pycat.je.rep.InsufficientAcksException.out | Bin 0 -> 1102 bytes ...epycat.je.rep.InsufficientLogException.out | Bin 0 -> 1365 bytes ...t.je.rep.InsufficientReplicasException.out | Bin 0 -> 1196 bytes ...leepycat.je.rep.LockPreemptedException.out | Bin 0 -> 1119 bytes ...sleepycat.je.rep.LogOverwriteException.out | Bin 0 -> 842 bytes ...e.rep.MasterReplicaTransitionException.out | Bin 0 -> 1538 bytes ....sleepycat.je.rep.MasterStateException.out | Bin 0 -> 959 bytes ...eepycat.je.rep.MemberNotFoundException.out | Bin 0 -> 840 bytes ...cat.je.rep.ReplicaConsistencyException.out | Bin 0 -> 915 bytes ...sleepycat.je.rep.ReplicaWriteException.out | Bin 0 -> 994 bytes ...ycat.je.rep.ReplicatedEnvironmentStats.out | Bin 0 -> 3696 bytes ...com.sleepycat.je.rep.RollbackException.out | Bin 0 -> 1536 bytes ...cat.je.rep.RollbackProhibitedException.out | Bin 0 -> 1617 bytes ...leepycat.je.rep.UnknownMasterException.out | Bin 0 -> 961 bytes .../com.sleepycat.je.rep.util.ldiff.Block.out | Bin 0 -> 164 bytes ...util.ldiff.LDiffRecordRequestException.out | Bin 0 -> 859 bytes ...leepycat.je.tree.CursorsExistException.out | Bin 0 -> 665 bytes ...leepycat.je.tree.NodeNotEmptyException.out | Bin 0 -> 665 bytes ...pycat.je.util.LogVerificationException.out | Bin 0 -> 708 bytes ...sleepycat.je.utilint.InternalException.out | Bin 0 -> 705 bytes .../com.sleepycat.je.utilint.Timestamp.out | Bin 0 -> 107 bytes .../4.1.6/com.sleepycat.je.utilint.VLSN.out | Bin 0 -> 69 bytes ...cat.persist.IndexNotAvailableException.out | Bin 0 -> 848 bytes ...sleepycat.persist.StoreExistsException.out | Bin 0 -> 842 bytes ...eepycat.persist.StoreNotFoundException.out | Bin 0 -> 844 bytes ...t.persist.evolve.DeletedClassException.out | Bin 0 -> 850 bytes ...sist.evolve.IncompatibleClassException.out | Bin 0 -> 855 bytes .../com.sleepycat.util.IOExceptionWrapper.out | Bin 0 -> 800 bytes ...sleepycat.util.RuntimeExceptionWrapper.out | Bin 0 -> 819 bytes ...epycat.util.keyrange.KeyRangeException.out | Bin 0 -> 763 bytes .../SerializeReadObjectsTest.java | 124 + .../SerializeUtils.java | 362 + .../SerializeWriteObjects.java | 93 + test/com/sleepycat/je/statcap/StatFile.java | 210 + test/com/sleepycat/je/test/AtomicPutTest.java | 325 + .../sleepycat/je/test/DeferredWriteTest.java | 1718 +++ .../com/sleepycat/je/test/ForeignKeyTest.java | 449 + .../sleepycat/je/test/InternalCursorTest.java | 152 + test/com/sleepycat/je/test/JoinTest.java | 489 + test/com/sleepycat/je/test/KeyScanTest.java | 201 + .../je/test/LogFileDeletionCrashEnvTest.java | 379 + .../je/test/MultiEnvOpenCloseTest.java | 99 + .../je/test/MultiKeyTxnTestCase.java | 58 + test/com/sleepycat/je/test/OpStatsTest.java | 628 + .../sleepycat/je/test/PhantomRestartTest.java | 528 + test/com/sleepycat/je/test/PhantomTest.java | 3192 ++++ test/com/sleepycat/je/test/SR11297Test.java | 189 + .../je/test/SecondaryAssociationTest.java | 941 ++ .../je/test/SecondaryDirtyReadTest.java | 558 + .../je/test/SecondaryMultiComplexTest.java | 529 + .../sleepycat/je/test/SecondaryMultiTest.java | 1221 ++ .../je/test/SecondarySplitTestMain.java | 224 + test/com/sleepycat/je/test/SecondaryTest.java | 2212 +++ test/com/sleepycat/je/test/SequenceTest.java | 520 + test/com/sleepycat/je/test/SkipTest.java | 365 + test/com/sleepycat/je/test/SpeedyTTLTime.java | 79 + test/com/sleepycat/je/test/TTLTest.java | 1933 +++ test/com/sleepycat/je/test/ToManyTest.java | 392 + test/com/sleepycat/je/tree/BinDeltaTest.java | 322 + .../sleepycat/je/tree/CountEstimatorTest.java | 243 + .../je/tree/CreateOldVersionLogs.java | 486 + .../com/sleepycat/je/tree/DupConvertTest.java | 340 + .../je/tree/FetchWithNoLatchTest.java | 545 + .../sleepycat/je/tree/GetParentNodeTest.java | 374 + .../sleepycat/je/tree/INEntryTestBase.java | 170 + test/com/sleepycat/je/tree/INKeyRepTest.java | 612 + .../sleepycat/je/tree/INTargetRepTest.java | 302 + test/com/sleepycat/je/tree/INTest.java | 431 + test/com/sleepycat/je/tree/KeyPrefixTest.java | 601 + test/com/sleepycat/je/tree/KeyTest.java | 191 + test/com/sleepycat/je/tree/LSNArrayTest.java | 90 + .../com/sleepycat/je/tree/MemorySizeTest.java | 519 + .../sleepycat/je/tree/ReleaseLatchesTest.java | 538 + test/com/sleepycat/je/tree/SR13034Test.java | 164 + test/com/sleepycat/je/tree/SR13126Test.java | 229 + .../je/tree/SplitRace_SR11144Test.java | 306 + test/com/sleepycat/je/tree/SplitTest.java | 310 + test/com/sleepycat/je/tree/TreeTest.java | 422 + test/com/sleepycat/je/tree/TreeTestBase.java | 232 + .../je/tree/ValidateSubtreeDeleteTest.java | 172 + .../sleepycat/je/tree/je-4.1.7_logWithDIN.jdb | Bin 0 -> 14183 bytes .../tree/je-4.1.7_logWithDeletedLNCommit.jdb | Bin 0 -> 17689 bytes .../je-4.1.7_logWithDeletedLNNoCommit.jdb | Bin 0 -> 21993 bytes .../je/tree/je-4.1.7_logWithMixIN.jdb | Bin 0 -> 23335 bytes .../je/tree/je-4.1.7_logWithSingletonLN.jdb | Bin 0 -> 17039 bytes .../je/tree/je-4.1.7_noPreUpgrade_deltas | Bin 0 -> 26328 bytes .../je/tree/je-4.1.7_noPreUpgrade_dups | Bin 0 -> 12937 bytes test/com/sleepycat/je/trigger/ConfigTest.java | 75 + test/com/sleepycat/je/trigger/InvokeTest.java | 660 + test/com/sleepycat/je/trigger/TestBase.java | 223 + test/com/sleepycat/je/txn/CursorTxnTest.java | 239 + test/com/sleepycat/je/txn/DeadlockTest.java | 2062 +++ .../com/sleepycat/je/txn/LockManagerTest.java | 1313 ++ test/com/sleepycat/je/txn/LockTest.java | 982 ++ .../je/txn/ReadCommitLockersTest.java | 306 + test/com/sleepycat/je/txn/TwoPCTest.java | 227 + test/com/sleepycat/je/txn/TxnEndTest.java | 808 ++ test/com/sleepycat/je/txn/TxnFSyncTest.java | 149 + test/com/sleepycat/je/txn/TxnMemoryTest.java | 305 + test/com/sleepycat/je/txn/TxnTest.java | 1240 ++ test/com/sleepycat/je/txn/TxnTimeoutTest.java | 671 + test/com/sleepycat/je/util/Adler32Test.java | 122 + test/com/sleepycat/je/util/BadFileFilter.java | 52 + .../je/util/BtreeCorruptionTest.java | 1275 ++ .../je/util/CustomDbPrintLogTest.java | 213 + test/com/sleepycat/je/util/DbBackupTest.java | 794 + .../sleepycat/je/util/DbCacheSizeTest.java | 270 + .../je/util/DbDeleteReservedFilesTest.java | 302 + test/com/sleepycat/je/util/DbDumpTest.java | 277 + test/com/sleepycat/je/util/DbLsnTest.java | 274 + .../sleepycat/je/util/DbScavengerTest.java | 570 + .../sleepycat/je/util/DebugRecordTest.java | 230 + test/com/sleepycat/je/util/DualTestCase.java | 151 + .../com/sleepycat/je/util/EnvTestWrapper.java | 143 + .../sleepycat/je/util/HexFormatterTest.java | 37 + .../com/sleepycat/je/util/InfoFileFilter.java | 49 + .../je/util/LogFileCorruptionTest.java | 457 + test/com/sleepycat/je/util/MiniPerf.java | 177 + test/com/sleepycat/je/util/PropUtilTest.java | 219 + test/com/sleepycat/je/util/RecordSearch.java | 161 + .../sleepycat/je/util/SimpleClassLoader.java | 54 + test/com/sleepycat/je/util/StringDbt.java | 43 + test/com/sleepycat/je/util/TestDumper.java | 102 + test/com/sleepycat/je/util/TestUtils.java | 982 ++ test/com/sleepycat/je/util/VerifyLogTest.java | 385 + .../util/dbfilterstats/DbFilterStatsTest.java | 372 + .../je/util/dbfilterstats/allcols.csv | 1 + .../je/util/dbfilterstats/je.config.csv | 2 + .../je/util/dbfilterstats/je.stat.0.csv | 7 + .../je/util/dbfilterstats/je.stat.csv | 3 + .../je/util/dbfilterstats/somecols.csv | 1 + .../je/utilint/AtomicLongComponentTest.java | 83 + .../je/utilint/AtomicLongMapStatTest.java | 157 + test/com/sleepycat/je/utilint/BitMapTest.java | 77 + .../je/utilint/CronScheduleParserTest.java | 243 + .../je/utilint/DoubleExpMovingAvgTest.java | 117 + .../je/utilint/DummyFileStoreInfo.java | 70 + .../je/utilint/ExceptionListenerTest.java | 129 + .../je/utilint/FileStoreInfoTest.java | 106 + .../sleepycat/je/utilint/LoggerUtilsTest.java | 640 + .../je/utilint/LongAvgRateMapStatTest.java | 272 + .../je/utilint/LongAvgRateStatTest.java | 94 + .../sleepycat/je/utilint/LongAvgRateTest.java | 241 + .../je/utilint/LongDiffStatTest.java | 101 + .../je/utilint/StoppableThreadTest.java | 102 + test/com/sleepycat/je/utilint/TestAction.java | 108 + .../sleepycat/je/utilint/WaitTestHook.java | 91 + .../test/AddNewSecKeyToAbstractClassTest.java | 215 + .../sleepycat/persist/test/BindingTest.java | 2599 ++++ .../persist/test/ConvertAndAddTest.java | 182 + .../persist/test/ConvertAndAddTest.jdb | Bin 0 -> 18107 bytes .../persist/test/CreateAbstractClassData.java | 118 + .../test/CreateOldVersionBigDecimalDb.java | 122 + .../test/CreateSecDupsWithoutComparator.java | 243 + .../CreateSecDupsWithoutComparatorEvolve.java | 277 + .../persist/test/CreateStringDataDB.java | 162 + .../persist/test/DevolutionTest.java | 185 + .../sleepycat/persist/test/DevolutionTest.jdb | Bin 0 -> 25595 bytes .../sleepycat/persist/test/Enhanced0.ASMified | 82 + .../com/sleepycat/persist/test/Enhanced0.java | 41 + .../sleepycat/persist/test/Enhanced1.ASMified | 607 + .../com/sleepycat/persist/test/Enhanced1.java | 282 + .../sleepycat/persist/test/Enhanced2.ASMified | 218 + .../com/sleepycat/persist/test/Enhanced2.java | 132 + .../sleepycat/persist/test/Enhanced3.ASMified | 541 + .../com/sleepycat/persist/test/Enhanced3.java | 188 + .../sleepycat/persist/test/EvolveCase.java | 233 + .../sleepycat/persist/test/EvolveClasses.java | 8066 ++++++++++ .../persist/test/EvolveClasses.java.original | 3176 ++++ .../persist/test/EvolveProxyClassTest.java | 502 + .../sleepycat/persist/test/EvolveTest.java | 278 + .../persist/test/EvolveTestBase.java | 473 + .../persist/test/EvolveTestInit.java | 62 + .../persist/test/ForeignKeyTest.java | 360 + .../persist/test/GetLastRestartTest.java | 533 + .../com/sleepycat/persist/test/IndexTest.java | 893 ++ test/com/sleepycat/persist/test/JoinTest.java | 194 + .../sleepycat/persist/test/NegativeTest.java | 738 + .../sleepycat/persist/test/OperationTest.java | 1860 +++ .../persist/test/PersistTestUtils.java | 54 + .../persist/test/ProxyToSimpleTypeTest.java | 294 + .../SecDupsWithoutComparatorEvolve_je_4_0.jdb | Bin 0 -> 24116 bytes .../test/SecDupsWithoutComparator_je_4_0.jdb | Bin 0 -> 24009 bytes .../test/SecondaryDupOrderEvolveTest.java | 894 ++ .../persist/test/SecondaryDupOrderTest.java | 544 + .../sleepycat/persist/test/SequenceTest.java | 478 + .../test/StringFormatCompatibilityTest.java | 310 + .../persist/test/SubclassIndexTest.java | 264 + .../test/TestVersionCompatibility.java | 78 + .../test/TestVersionCompatibilitySuite.java | 63 + .../test/je-4.0.103_AbstractClassData.jdb | Bin 0 -> 40565 bytes .../persist/test/je-4.0.103_BigDecimal.jdb | Bin 0 -> 17090 bytes .../test/je-4.0.103_EvolveProxyClass.jdb | Bin 0 -> 17112 bytes .../persist/test/je-4.0.103_StringData.jdb | Bin 0 -> 20240 bytes .../util/test/ExceptionWrapperTest.java | 118 + .../util/test/FastOutputStreamTest.java | 45 + test/com/sleepycat/util/test/GreaterThan.java | 64 + .../util/test/PackedIntegerTest.java | 243 + .../sleepycat/util/test/SharedTestUtils.java | 322 + test/com/sleepycat/util/test/TestBase.java | 112 + test/com/sleepycat/util/test/TestEnv.java | 147 + test/com/sleepycat/util/test/TxnTestCase.java | 243 + test/com/sleepycat/util/test/UtfTest.java | 142 + .../sleepycat/utilint/LatencyStatTest.java | 417 + .../com/sleepycat/utilint/StatLoggerTest.java | 236 + .../sleepycat/utilint/StatsTrackerTest.java | 81 + test/com/sleepycat/utilint/latency-5-0-69 | Bin 0 -> 175 bytes test/je.properties | 86 + test/jenkins/JE_test_deploy.xlsx | Bin 0 -> 21927 bytes test/jenkins/README | 17 + test/jenkins/coverage/README | 10 + test/jenkins/coverage/je_cover.sh | 179 + test/jenkins/dbsim/README | 42 + test/jenkins/dbsim/abortstress.conf | 137 + test/jenkins/dbsim/je_dbsim.sh | 244 + test/jenkins/dbsim/recovery.conf | 146 + test/jenkins/standalone/README | 47 + test/jenkins/standalone/error_extract_je.sh | 79 + test/jenkins/standalone/gen_xml.sh | 39 + test/jenkins/standalone/je_standalone.sh | 460 + test/jenkins/unittest/README | 101 + test/jenkins/unittest/je_unit.sh | 175 + test/ssl/keys.store | Bin 0 -> 6161 bytes test/ssl/make-ks.sh | 42 + test/ssl/trust.store | Bin 0 -> 1536 bytes test/standalone/BigDW.java | 444 + test/standalone/BigRandom.java | 624 + test/standalone/CleanWithSmallCache.java | 528 + test/standalone/ClosedDbEviction.java | 789 + test/standalone/DeadlockStress.java | 1455 ++ test/standalone/DiskLimitStress.java | 718 + test/standalone/EnvSharedCache.java | 978 ++ test/standalone/FailoverTest.java | 561 + test/standalone/IOErrorStress.java | 498 + test/standalone/MasterTransferExercise.java | 1530 ++ test/standalone/MeasureDiskOrderedScan.java | 366 + test/standalone/MeasureDiskOrderedScan.sh | 28 + test/standalone/MemoryStress.java | 461 + test/standalone/MixedLifetimeQueue.java | 624 + test/standalone/OpenEnvStress.java | 327 + test/standalone/RemoveDbStress.java | 296 + test/standalone/RepTestData.java | 157 + test/standalone/ReplicaDbOps.java | 500 + test/standalone/ReplicaReading.java | 661 + test/standalone/ReplicationCleaning.java | 274 + test/standalone/TTLStress.java | 829 ++ test/standalone/TemporaryDbStress.java | 275 + test/standalone/TxnInMultiThreadsStress.java | 583 + test/standalone/UtilizationChecker.java | 109 + test/standalone/Utils.java | 264 + 2932 files changed, 905002 insertions(+) create mode 100644 FindBugsExclude.xml create mode 100644 LICENSE create mode 100644 README create mode 100644 ant/PrintBootClassPath.java create mode 100644 ant/compile.xml create mode 100644 ant/internal.xml create mode 100644 build-common.xml create mode 100644 build.xml create mode 100644 dist/build.properties create mode 100644 docs/GettingStartedGuide/BerkeleyDB-JE-GSG.pdf create mode 100644 docs/GettingStartedGuide/Cursors.html create mode 100644 docs/GettingStartedGuide/DBAdmin.html create mode 100644 docs/GettingStartedGuide/DBEntry.html create mode 100644 docs/GettingStartedGuide/DeleteEntryWCursor.html create mode 100644 docs/GettingStartedGuide/EnvProps.html create mode 100644 docs/GettingStartedGuide/Positioning.html create mode 100644 docs/GettingStartedGuide/PutEntryWCursor.html create mode 100644 docs/GettingStartedGuide/ReplacingEntryWCursor.html create mode 100644 docs/GettingStartedGuide/admin.html create mode 100644 docs/GettingStartedGuide/administration.html create mode 100644 docs/GettingStartedGuide/applicationoverview.html create mode 100644 docs/GettingStartedGuide/backgroundthreads.html create mode 100644 docs/GettingStartedGuide/backup.html create mode 100644 docs/GettingStartedGuide/backuprestore.html create mode 100644 docs/GettingStartedGuide/baseapi.html create mode 100644 docs/GettingStartedGuide/bindAPI.html create mode 100644 docs/GettingStartedGuide/cachesize.html create mode 100644 docs/GettingStartedGuide/catastrophicrecovery.html create mode 100644 docs/GettingStartedGuide/commandlinetools.html create mode 100644 docs/GettingStartedGuide/comparator.html create mode 100644 docs/GettingStartedGuide/concurrentProcessing.html create mode 100644 docs/GettingStartedGuide/cursorUsage.html create mode 100644 docs/GettingStartedGuide/dataaccessorclass.html create mode 100644 docs/GettingStartedGuide/databases.html create mode 100644 docs/GettingStartedGuide/dbUsage.html create mode 100644 docs/GettingStartedGuide/dbenvUsageExample.html create mode 100644 docs/GettingStartedGuide/dbprops.html create mode 100644 docs/GettingStartedGuide/dbtUsage.html create mode 100644 docs/GettingStartedGuide/diskthreshold.html create mode 100644 docs/GettingStartedGuide/dpl.html create mode 100644 docs/GettingStartedGuide/dpl_delete.html create mode 100644 docs/GettingStartedGuide/dpl_entityjoin.html create mode 100644 docs/GettingStartedGuide/dpl_example.html create mode 100644 docs/GettingStartedGuide/dpl_exampledatabaseput.html create mode 100644 docs/GettingStartedGuide/dpl_exampleinventoryread.html create mode 100644 docs/GettingStartedGuide/dpl_replace.html create mode 100644 docs/GettingStartedGuide/dplindexcreate.html create mode 100644 docs/GettingStartedGuide/env.html create mode 100644 docs/GettingStartedGuide/envStats.html create mode 100644 docs/GettingStartedGuide/envclose.html create mode 100644 docs/GettingStartedGuide/getmultiple.html create mode 100644 docs/GettingStartedGuide/gettingStarted.css create mode 100644 docs/GettingStartedGuide/gettingit.html create mode 100644 docs/GettingStartedGuide/hotfailover.html create mode 100644 docs/GettingStartedGuide/index.html create mode 100644 docs/GettingStartedGuide/indexes.html create mode 100644 docs/GettingStartedGuide/indexusage.html create mode 100644 docs/GettingStartedGuide/introduction.html create mode 100644 docs/GettingStartedGuide/inventoryclass.html create mode 100644 docs/GettingStartedGuide/jca.html create mode 100644 docs/GettingStartedGuide/jeexceptions.html create mode 100644 docs/GettingStartedGuide/jmx.html create mode 100644 docs/GettingStartedGuide/joins.html create mode 100644 docs/GettingStartedGuide/keyCreator.html create mode 100644 docs/GettingStartedGuide/logfilesrevealed.html create mode 100644 docs/GettingStartedGuide/managelogging.html create mode 100644 docs/GettingStartedGuide/moreinfo.html create mode 100644 docs/GettingStartedGuide/multiprocess.html create mode 100644 docs/GettingStartedGuide/mydbenv-persist.html create mode 100644 docs/GettingStartedGuide/persist_access.html create mode 100644 docs/GettingStartedGuide/persist_first.html create mode 100644 docs/GettingStartedGuide/persist_index.html create mode 100644 docs/GettingStartedGuide/persistobject.html create mode 100644 docs/GettingStartedGuide/preface.html create mode 100644 docs/GettingStartedGuide/readSecondary.html create mode 100644 docs/GettingStartedGuide/restore.html create mode 100644 docs/GettingStartedGuide/saveret.html create mode 100644 docs/GettingStartedGuide/secondaryCursor.html create mode 100644 docs/GettingStartedGuide/secondaryDelete.html create mode 100644 docs/GettingStartedGuide/secondaryProps.html create mode 100644 docs/GettingStartedGuide/simpleda.html create mode 100644 docs/GettingStartedGuide/simpleget.html create mode 100644 docs/GettingStartedGuide/simpleput.html create mode 100644 docs/GettingStartedGuide/timetolive.html create mode 100644 docs/GettingStartedGuide/usingDbt.html create mode 100644 docs/LICENSE.txt create mode 100644 docs/ReplicationGuide/BerkeleyDB-JE-Replication.pdf create mode 100644 docs/ReplicationGuide/addremovenodes.html create mode 100644 docs/ReplicationGuide/administration.html create mode 100644 docs/ReplicationGuide/admintimesync.html create mode 100644 docs/ReplicationGuide/availability.html create mode 100644 docs/ReplicationGuide/backups.html create mode 100644 docs/ReplicationGuide/cons_and_dur.html create mode 100644 docs/ReplicationGuide/consistency.html create mode 100644 docs/ReplicationGuide/datamanagement.html create mode 100644 docs/ReplicationGuide/dbbackup.html create mode 100644 docs/ReplicationGuide/election-override.html create mode 100644 docs/ReplicationGuide/enablerep.html create mode 100644 docs/ReplicationGuide/events.html create mode 100644 docs/ReplicationGuide/exceptions.html create mode 100644 docs/ReplicationGuide/gettingStarted.css create mode 100644 docs/ReplicationGuide/groupreset.html create mode 100644 docs/ReplicationGuide/hotupgrade.html create mode 100644 docs/ReplicationGuide/index.html create mode 100644 docs/ReplicationGuide/introduction.html create mode 100644 docs/ReplicationGuide/lifecycle.html create mode 100644 docs/ReplicationGuide/logfile-restore.html create mode 100644 docs/ReplicationGuide/monitors.html create mode 100644 docs/ReplicationGuide/nodeconfig.html create mode 100644 docs/ReplicationGuide/preface.html create mode 100644 docs/ReplicationGuide/progoverview.html create mode 100644 docs/ReplicationGuide/repenvironmentopen.html create mode 100644 docs/ReplicationGuide/repexample.html create mode 100644 docs/ReplicationGuide/replicawrites.html create mode 100644 docs/ReplicationGuide/runtransaction.html create mode 100644 docs/ReplicationGuide/secondary.html create mode 100644 docs/ReplicationGuide/timesync.html create mode 100644 docs/ReplicationGuide/two-node.html create mode 100644 docs/ReplicationGuide/txn-management.html create mode 100644 docs/ReplicationGuide/txnrollback.html create mode 100644 docs/ReplicationGuide/utilities.html create mode 100644 docs/TransactionGettingStarted/BerkeleyDB-JE-Txn.pdf create mode 100644 docs/TransactionGettingStarted/abortresults.html create mode 100644 docs/TransactionGettingStarted/apireq.html create mode 100644 docs/TransactionGettingStarted/autocommit.html create mode 100644 docs/TransactionGettingStarted/backup.html create mode 100644 docs/TransactionGettingStarted/blocking_deadlocks.html create mode 100644 docs/TransactionGettingStarted/chkpoint.html create mode 100644 docs/TransactionGettingStarted/deadlock.jpg create mode 100644 docs/TransactionGettingStarted/enabletxn.html create mode 100644 docs/TransactionGettingStarted/gettingStarted.css create mode 100644 docs/TransactionGettingStarted/index.html create mode 100644 docs/TransactionGettingStarted/introduction.html create mode 100644 docs/TransactionGettingStarted/isolation.html create mode 100644 docs/TransactionGettingStarted/jebackuprestore.html create mode 100644 docs/TransactionGettingStarted/jecatastrophicrecovery.html create mode 100644 docs/TransactionGettingStarted/jehotfailover.html create mode 100644 docs/TransactionGettingStarted/jelock.html create mode 100644 docs/TransactionGettingStarted/maxtxns.html create mode 100644 docs/TransactionGettingStarted/moreinfo.html create mode 100644 docs/TransactionGettingStarted/multithread-intro.html create mode 100644 docs/TransactionGettingStarted/nodurabletxn.html create mode 100644 docs/TransactionGettingStarted/perftune-intro.html create mode 100644 docs/TransactionGettingStarted/preface.html create mode 100644 docs/TransactionGettingStarted/readblock.jpg create mode 100644 docs/TransactionGettingStarted/readmodifywrite.html create mode 100644 docs/TransactionGettingStarted/recovery-intro.html create mode 100644 docs/TransactionGettingStarted/rwlocks1.jpg create mode 100644 docs/TransactionGettingStarted/simplelock.jpg create mode 100644 docs/TransactionGettingStarted/sysfailure.html create mode 100644 docs/TransactionGettingStarted/txn_ccursor.html create mode 100644 docs/TransactionGettingStarted/txnconcurrency.html create mode 100644 docs/TransactionGettingStarted/txncursor.html create mode 100644 docs/TransactionGettingStarted/txnexample_dpl.html create mode 100644 docs/TransactionGettingStarted/txnexample_java.html create mode 100644 docs/TransactionGettingStarted/txnindices.html create mode 100644 docs/TransactionGettingStarted/usingtxns.html create mode 100644 docs/TransactionGettingStarted/wrapup.html create mode 100644 docs/TransactionGettingStarted/writeblock.jpg create mode 100644 docs/changelog.html create mode 100644 docs/collections/tutorial/BasicProgram.html create mode 100644 docs/collections/tutorial/BerkeleyDB-JE-Collections.pdf create mode 100644 docs/collections/tutorial/Entity.html create mode 100644 docs/collections/tutorial/SerializableEntity.html create mode 100644 docs/collections/tutorial/SerializedObjectStorage.html create mode 100644 docs/collections/tutorial/Summary.html create mode 100644 docs/collections/tutorial/Tuple.html create mode 100644 docs/collections/tutorial/UsingCollectionsAPI.html create mode 100644 docs/collections/tutorial/UsingSecondaries.html create mode 100644 docs/collections/tutorial/UsingStoredCollections.html create mode 100644 docs/collections/tutorial/addingdatabaseitems.html create mode 100644 docs/collections/tutorial/collectionOverview.html create mode 100644 docs/collections/tutorial/collectionswithentities.html create mode 100644 docs/collections/tutorial/createbindingscollections.html create mode 100644 docs/collections/tutorial/creatingentitybindings.html create mode 100644 docs/collections/tutorial/developing.html create mode 100644 docs/collections/tutorial/entitieswithcollections.html create mode 100644 docs/collections/tutorial/gettingStarted.css create mode 100644 docs/collections/tutorial/handlingexceptions.html create mode 100644 docs/collections/tutorial/implementingmain.html create mode 100644 docs/collections/tutorial/index.html create mode 100644 docs/collections/tutorial/indexedcollections.html create mode 100644 docs/collections/tutorial/intro.html create mode 100644 docs/collections/tutorial/moreinfo.html create mode 100644 docs/collections/tutorial/openclasscatalog.html create mode 100644 docs/collections/tutorial/opendatabases.html create mode 100644 docs/collections/tutorial/opendbenvironment.html create mode 100644 docs/collections/tutorial/openingforeignkeys.html create mode 100644 docs/collections/tutorial/preface.html create mode 100644 docs/collections/tutorial/removingredundantvalueclasses.html create mode 100644 docs/collections/tutorial/retrievingbyindexkey.html create mode 100644 docs/collections/tutorial/retrievingdatabaseitems.html create mode 100644 docs/collections/tutorial/sortedcollections.html create mode 100644 docs/collections/tutorial/transientfieldsinbinding.html create mode 100644 docs/collections/tutorial/tuple-serialentitybindings.html create mode 100644 docs/collections/tutorial/tuplekeybindings.html create mode 100644 docs/collections/tutorial/tupleswithkeycreators.html create mode 100644 docs/collections/tutorial/tutorialintroduction.html create mode 100644 docs/collections/tutorial/usingtransactions.html create mode 100644 docs/doclet/Debug.java create mode 100644 docs/doclet/HidingAnnotatedTypeWrapper.java create mode 100644 docs/doclet/HidingAnnotationDescWrapper.java create mode 100644 docs/doclet/HidingAnnotationTypeDocWrapper.java create mode 100644 docs/doclet/HidingAnnotationTypeElementDocWrapper.java create mode 100644 docs/doclet/HidingAnnotationValueWrapper.java create mode 100644 docs/doclet/HidingClassDocWrapper.java create mode 100644 docs/doclet/HidingConstructorDocWrapper.java create mode 100644 docs/doclet/HidingDocWrapper.java create mode 100644 docs/doclet/HidingDoclet.java create mode 100644 docs/doclet/HidingExecutableMemberDocWrapper.java create mode 100644 docs/doclet/HidingFieldDocWrapper.java create mode 100644 docs/doclet/HidingMemberDocWrapper.java create mode 100644 docs/doclet/HidingMethodDocWrapper.java create mode 100644 docs/doclet/HidingPackageDocWrapper.java create mode 100644 docs/doclet/HidingParamTagWrapper.java create mode 100644 docs/doclet/HidingParameterWrapper.java create mode 100644 docs/doclet/HidingParameterizedTypeWrapper.java create mode 100644 docs/doclet/HidingProgramElementDocWrapper.java create mode 100644 docs/doclet/HidingRootDocWrapper.java create mode 100644 docs/doclet/HidingSeeTagWrapper.java create mode 100644 docs/doclet/HidingSerialFieldTagWrapper.java create mode 100644 docs/doclet/HidingSourcePositionWrapper.java create mode 100644 docs/doclet/HidingTagWrapper.java create mode 100644 docs/doclet/HidingThrowsTagWrapper.java create mode 100644 docs/doclet/HidingTypeVariableWrapper.java create mode 100644 docs/doclet/HidingTypeWrapper.java create mode 100644 docs/doclet/HidingWildcardTypeWrapper.java create mode 100644 docs/doclet/HidingWrapper.java create mode 100644 docs/examples.html create mode 100644 docs/examples/allclasses-frame.html create mode 100644 docs/examples/allclasses-noframe.html create mode 100644 docs/examples/constant-values.html create mode 100644 docs/examples/deprecated-list.html create mode 100644 docs/examples/help-doc.html create mode 100644 docs/examples/index-all.html create mode 100644 docs/examples/index.html create mode 100644 docs/examples/je/rep/quote/HARouter.html create mode 100644 docs/examples/je/rep/quote/RouterDrivenStockQuotes.html create mode 100644 docs/examples/je/rep/quote/RunTransaction.html create mode 100644 docs/examples/je/rep/quote/SimpleRouter.html create mode 100644 docs/examples/je/rep/quote/StockQuotes.html create mode 100644 docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServices.html create mode 100644 docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServicesImpl.html create mode 100644 docs/examples/je/rep/quote/StockQuotesRMIForwarding.html create mode 100644 docs/examples/je/rep/quote/UpdateForwardingStockQuotes.html create mode 100644 docs/examples/je/rep/quote/package-frame.html create mode 100644 docs/examples/je/rep/quote/package-summary.html create mode 100644 docs/examples/je/rep/quote/package-tree.html create mode 100644 docs/examples/overview-tree.html create mode 100644 docs/examples/package-list create mode 100644 docs/examples/script.js create mode 100644 docs/examples/standard-stylesheet.css create mode 100644 docs/examples/style.css create mode 100644 docs/images/Oracle_BerkeleyDB_small.png create mode 100644 docs/index.html create mode 100644 docs/installation.html create mode 100644 docs/java/allclasses-frame.html create mode 100644 docs/java/allclasses-noframe.html create mode 100644 docs/java/com/sleepycat/bind/ByteArrayBinding.html create mode 100644 docs/java/com/sleepycat/bind/EntityBinding.html create mode 100644 docs/java/com/sleepycat/bind/EntryBinding.html create mode 100644 docs/java/com/sleepycat/bind/class-use/ByteArrayBinding.html create mode 100644 docs/java/com/sleepycat/bind/class-use/EntityBinding.html create mode 100644 docs/java/com/sleepycat/bind/class-use/EntryBinding.html create mode 100644 docs/java/com/sleepycat/bind/package-frame.html create mode 100644 docs/java/com/sleepycat/bind/package-summary.html create mode 100644 docs/java/com/sleepycat/bind/package-tree.html create mode 100644 docs/java/com/sleepycat/bind/package-use.html create mode 100644 docs/java/com/sleepycat/bind/serial/ClassCatalog.html create mode 100644 docs/java/com/sleepycat/bind/serial/SerialBase.html create mode 100644 docs/java/com/sleepycat/bind/serial/SerialBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/SerialInput.html create mode 100644 docs/java/com/sleepycat/bind/serial/SerialOutput.html create mode 100644 docs/java/com/sleepycat/bind/serial/SerialSerialBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/SerialSerialKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/serial/StoredClassCatalog.html create mode 100644 docs/java/com/sleepycat/bind/serial/TupleSerialBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/TupleSerialKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/ClassCatalog.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/SerialBase.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/SerialBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/SerialInput.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/SerialOutput.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/SerialSerialBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/SerialSerialKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/StoredClassCatalog.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/TupleSerialBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/TupleSerialKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledBinding.html create mode 100644 docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/serial/package-frame.html create mode 100644 docs/java/com/sleepycat/bind/serial/package-summary.html create mode 100644 docs/java/com/sleepycat/bind/serial/package-tree.html create mode 100644 docs/java/com/sleepycat/bind/serial/package-use.html create mode 100644 docs/java/com/sleepycat/bind/tuple/BigDecimalBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/BigIntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/BooleanBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/ByteBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/CharacterBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/DoubleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/FloatBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/IntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/LongBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/MarshalledTupleEntry.html create mode 100644 docs/java/com/sleepycat/bind/tuple/MarshalledTupleKeyEntity.html create mode 100644 docs/java/com/sleepycat/bind/tuple/PackedIntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/PackedLongBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/ShortBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/SortedBigDecimalBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/SortedDoubleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/SortedFloatBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/SortedPackedIntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/SortedPackedLongBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/StringBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleBase.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleInput.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleInputBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleMarshalledBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleOutput.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleTupleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleTupleKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/BigDecimalBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/BigIntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/BooleanBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/ByteBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/CharacterBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/DoubleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/FloatBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/IntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/LongBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleEntry.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleKeyEntity.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/PackedIntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/PackedLongBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/ShortBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/SortedBigDecimalBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/SortedDoubleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/SortedFloatBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedIntegerBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedLongBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/StringBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleBase.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleInput.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleInputBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleMarshalledBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleOutput.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledBinding.html create mode 100644 docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledKeyCreator.html create mode 100644 docs/java/com/sleepycat/bind/tuple/package-frame.html create mode 100644 docs/java/com/sleepycat/bind/tuple/package-summary.html create mode 100644 docs/java/com/sleepycat/bind/tuple/package-tree.html create mode 100644 docs/java/com/sleepycat/bind/tuple/package-use.html create mode 100644 docs/java/com/sleepycat/collections/CurrentTransaction.html create mode 100644 docs/java/com/sleepycat/collections/MapEntryParameter.html create mode 100644 docs/java/com/sleepycat/collections/PrimaryKeyAssigner.html create mode 100644 docs/java/com/sleepycat/collections/StoredCollection.html create mode 100644 docs/java/com/sleepycat/collections/StoredCollections.html create mode 100644 docs/java/com/sleepycat/collections/StoredContainer.html create mode 100644 docs/java/com/sleepycat/collections/StoredEntrySet.html create mode 100644 docs/java/com/sleepycat/collections/StoredIterator.html create mode 100644 docs/java/com/sleepycat/collections/StoredKeySet.html create mode 100644 docs/java/com/sleepycat/collections/StoredMap.html create mode 100644 docs/java/com/sleepycat/collections/StoredSortedEntrySet.html create mode 100644 docs/java/com/sleepycat/collections/StoredSortedKeySet.html create mode 100644 docs/java/com/sleepycat/collections/StoredSortedMap.html create mode 100644 docs/java/com/sleepycat/collections/StoredSortedValueSet.html create mode 100644 docs/java/com/sleepycat/collections/StoredValueSet.html create mode 100644 docs/java/com/sleepycat/collections/TransactionRunner.html create mode 100644 docs/java/com/sleepycat/collections/TransactionWorker.html create mode 100644 docs/java/com/sleepycat/collections/TupleSerialFactory.html create mode 100644 docs/java/com/sleepycat/collections/class-use/CurrentTransaction.html create mode 100644 docs/java/com/sleepycat/collections/class-use/MapEntryParameter.html create mode 100644 docs/java/com/sleepycat/collections/class-use/PrimaryKeyAssigner.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredCollection.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredCollections.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredContainer.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredEntrySet.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredIterator.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredKeySet.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredMap.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredSortedEntrySet.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredSortedKeySet.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredSortedMap.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredSortedValueSet.html create mode 100644 docs/java/com/sleepycat/collections/class-use/StoredValueSet.html create mode 100644 docs/java/com/sleepycat/collections/class-use/TransactionRunner.html create mode 100644 docs/java/com/sleepycat/collections/class-use/TransactionWorker.html create mode 100644 docs/java/com/sleepycat/collections/class-use/TupleSerialFactory.html create mode 100644 docs/java/com/sleepycat/collections/package-frame.html create mode 100644 docs/java/com/sleepycat/collections/package-summary.html create mode 100644 docs/java/com/sleepycat/collections/package-tree.html create mode 100644 docs/java/com/sleepycat/collections/package-use.html create mode 100644 docs/java/com/sleepycat/je/BinaryEqualityComparator.html create mode 100644 docs/java/com/sleepycat/je/BtreeStats.html create mode 100644 docs/java/com/sleepycat/je/CacheMode.html create mode 100644 docs/java/com/sleepycat/je/CheckpointConfig.html create mode 100644 docs/java/com/sleepycat/je/CommitToken.html create mode 100644 docs/java/com/sleepycat/je/Cursor.html create mode 100644 docs/java/com/sleepycat/je/CursorConfig.html create mode 100644 docs/java/com/sleepycat/je/CustomStats.html create mode 100644 docs/java/com/sleepycat/je/Database.html create mode 100644 docs/java/com/sleepycat/je/DatabaseComparator.html create mode 100644 docs/java/com/sleepycat/je/DatabaseConfig.html create mode 100644 docs/java/com/sleepycat/je/DatabaseEntry.html create mode 100644 docs/java/com/sleepycat/je/DatabaseException.html create mode 100644 docs/java/com/sleepycat/je/DatabaseExistsException.html create mode 100644 docs/java/com/sleepycat/je/DatabaseNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/DatabaseStats.html create mode 100644 docs/java/com/sleepycat/je/DeadlockException.html create mode 100644 docs/java/com/sleepycat/je/DeleteConstraintException.html create mode 100644 docs/java/com/sleepycat/je/DiskLimitException.html create mode 100644 docs/java/com/sleepycat/je/DiskOrderedCursor.html create mode 100644 docs/java/com/sleepycat/je/DiskOrderedCursorConfig.html create mode 100644 docs/java/com/sleepycat/je/DiskOrderedCursorProducerException.html create mode 100644 docs/java/com/sleepycat/je/DuplicateDataException.html create mode 100644 docs/java/com/sleepycat/je/Durability.ReplicaAckPolicy.html create mode 100644 docs/java/com/sleepycat/je/Durability.SyncPolicy.html create mode 100644 docs/java/com/sleepycat/je/Durability.html create mode 100644 docs/java/com/sleepycat/je/Environment.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentConfig.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentFailureException.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentLockedException.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentMutableConfig.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentStats.html create mode 100644 docs/java/com/sleepycat/je/EnvironmentWedgedException.html create mode 100644 docs/java/com/sleepycat/je/ExceptionEvent.html create mode 100644 docs/java/com/sleepycat/je/ExceptionListener.html create mode 100644 docs/java/com/sleepycat/je/ForeignConstraintException.html create mode 100644 docs/java/com/sleepycat/je/ForeignKeyDeleteAction.html create mode 100644 docs/java/com/sleepycat/je/ForeignKeyNullifier.html create mode 100644 docs/java/com/sleepycat/je/ForeignMultiKeyNullifier.html create mode 100644 docs/java/com/sleepycat/je/ForwardCursor.html create mode 100644 docs/java/com/sleepycat/je/Get.html create mode 100644 docs/java/com/sleepycat/je/JEVersion.html create mode 100644 docs/java/com/sleepycat/je/JoinConfig.html create mode 100644 docs/java/com/sleepycat/je/JoinCursor.html create mode 100644 docs/java/com/sleepycat/je/LockConflictException.html create mode 100644 docs/java/com/sleepycat/je/LockMode.html create mode 100644 docs/java/com/sleepycat/je/LockNotAvailableException.html create mode 100644 docs/java/com/sleepycat/je/LockNotGrantedException.html create mode 100644 docs/java/com/sleepycat/je/LockStats.html create mode 100644 docs/java/com/sleepycat/je/LockTimeoutException.html create mode 100644 docs/java/com/sleepycat/je/LogWriteException.html create mode 100644 docs/java/com/sleepycat/je/OperationFailureException.html create mode 100644 docs/java/com/sleepycat/je/OperationResult.html create mode 100644 docs/java/com/sleepycat/je/OperationStatus.html create mode 100644 docs/java/com/sleepycat/je/PartialComparator.html create mode 100644 docs/java/com/sleepycat/je/PreloadConfig.Phases.html create mode 100644 docs/java/com/sleepycat/je/PreloadConfig.html create mode 100644 docs/java/com/sleepycat/je/PreloadStats.html create mode 100644 docs/java/com/sleepycat/je/PreloadStatus.html create mode 100644 docs/java/com/sleepycat/je/ProgressListener.html create mode 100644 docs/java/com/sleepycat/je/Put.html create mode 100644 docs/java/com/sleepycat/je/ReadOptions.html create mode 100644 docs/java/com/sleepycat/je/RecoveryProgress.html create mode 100644 docs/java/com/sleepycat/je/ReplicaConsistencyPolicy.html create mode 100644 docs/java/com/sleepycat/je/RunRecoveryException.html create mode 100644 docs/java/com/sleepycat/je/SecondaryConfig.html create mode 100644 docs/java/com/sleepycat/je/SecondaryConstraintException.html create mode 100644 docs/java/com/sleepycat/je/SecondaryCursor.html create mode 100644 docs/java/com/sleepycat/je/SecondaryDatabase.html create mode 100644 docs/java/com/sleepycat/je/SecondaryIntegrityException.html create mode 100644 docs/java/com/sleepycat/je/SecondaryKeyCreator.html create mode 100644 docs/java/com/sleepycat/je/SecondaryMultiKeyCreator.html create mode 100644 docs/java/com/sleepycat/je/SecondaryReferenceException.html create mode 100644 docs/java/com/sleepycat/je/Sequence.html create mode 100644 docs/java/com/sleepycat/je/SequenceConfig.html create mode 100644 docs/java/com/sleepycat/je/SequenceExistsException.html create mode 100644 docs/java/com/sleepycat/je/SequenceIntegrityException.html create mode 100644 docs/java/com/sleepycat/je/SequenceNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/SequenceOverflowException.html create mode 100644 docs/java/com/sleepycat/je/SequenceStats.html create mode 100644 docs/java/com/sleepycat/je/StatsConfig.html create mode 100644 docs/java/com/sleepycat/je/ThreadInterruptedException.html create mode 100644 docs/java/com/sleepycat/je/Transaction.State.html create mode 100644 docs/java/com/sleepycat/je/Transaction.html create mode 100644 docs/java/com/sleepycat/je/TransactionConfig.html create mode 100644 docs/java/com/sleepycat/je/TransactionStats.Active.html create mode 100644 docs/java/com/sleepycat/je/TransactionStats.html create mode 100644 docs/java/com/sleepycat/je/TransactionTimeoutException.html create mode 100644 docs/java/com/sleepycat/je/UniqueConstraintException.html create mode 100644 docs/java/com/sleepycat/je/VerifyConfig.html create mode 100644 docs/java/com/sleepycat/je/VersionMismatchException.html create mode 100644 docs/java/com/sleepycat/je/WriteOptions.html create mode 100644 docs/java/com/sleepycat/je/XAEnvironment.html create mode 100644 docs/java/com/sleepycat/je/XAFailureException.html create mode 100644 docs/java/com/sleepycat/je/class-use/BinaryEqualityComparator.html create mode 100644 docs/java/com/sleepycat/je/class-use/BtreeStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/CacheMode.html create mode 100644 docs/java/com/sleepycat/je/class-use/CheckpointConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/CommitToken.html create mode 100644 docs/java/com/sleepycat/je/class-use/Cursor.html create mode 100644 docs/java/com/sleepycat/je/class-use/CursorConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/CustomStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/Database.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseComparator.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseEntry.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseExistsException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DatabaseStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/DeadlockException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DeleteConstraintException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DiskLimitException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DiskOrderedCursor.html create mode 100644 docs/java/com/sleepycat/je/class-use/DiskOrderedCursorConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/DiskOrderedCursorProducerException.html create mode 100644 docs/java/com/sleepycat/je/class-use/DuplicateDataException.html create mode 100644 docs/java/com/sleepycat/je/class-use/Durability.ReplicaAckPolicy.html create mode 100644 docs/java/com/sleepycat/je/class-use/Durability.SyncPolicy.html create mode 100644 docs/java/com/sleepycat/je/class-use/Durability.html create mode 100644 docs/java/com/sleepycat/je/class-use/Environment.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentFailureException.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentLockedException.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentMutableConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/EnvironmentWedgedException.html create mode 100644 docs/java/com/sleepycat/je/class-use/ExceptionEvent.html create mode 100644 docs/java/com/sleepycat/je/class-use/ExceptionListener.html create mode 100644 docs/java/com/sleepycat/je/class-use/ForeignConstraintException.html create mode 100644 docs/java/com/sleepycat/je/class-use/ForeignKeyDeleteAction.html create mode 100644 docs/java/com/sleepycat/je/class-use/ForeignKeyNullifier.html create mode 100644 docs/java/com/sleepycat/je/class-use/ForeignMultiKeyNullifier.html create mode 100644 docs/java/com/sleepycat/je/class-use/ForwardCursor.html create mode 100644 docs/java/com/sleepycat/je/class-use/Get.html create mode 100644 docs/java/com/sleepycat/je/class-use/JEVersion.html create mode 100644 docs/java/com/sleepycat/je/class-use/JoinConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/JoinCursor.html create mode 100644 docs/java/com/sleepycat/je/class-use/LockConflictException.html create mode 100644 docs/java/com/sleepycat/je/class-use/LockMode.html create mode 100644 docs/java/com/sleepycat/je/class-use/LockNotAvailableException.html create mode 100644 docs/java/com/sleepycat/je/class-use/LockNotGrantedException.html create mode 100644 docs/java/com/sleepycat/je/class-use/LockStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/LockTimeoutException.html create mode 100644 docs/java/com/sleepycat/je/class-use/LogWriteException.html create mode 100644 docs/java/com/sleepycat/je/class-use/OperationFailureException.html create mode 100644 docs/java/com/sleepycat/je/class-use/OperationResult.html create mode 100644 docs/java/com/sleepycat/je/class-use/OperationStatus.html create mode 100644 docs/java/com/sleepycat/je/class-use/PartialComparator.html create mode 100644 docs/java/com/sleepycat/je/class-use/PreloadConfig.Phases.html create mode 100644 docs/java/com/sleepycat/je/class-use/PreloadConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/PreloadStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/PreloadStatus.html create mode 100644 docs/java/com/sleepycat/je/class-use/ProgressListener.html create mode 100644 docs/java/com/sleepycat/je/class-use/Put.html create mode 100644 docs/java/com/sleepycat/je/class-use/ReadOptions.html create mode 100644 docs/java/com/sleepycat/je/class-use/RecoveryProgress.html create mode 100644 docs/java/com/sleepycat/je/class-use/ReplicaConsistencyPolicy.html create mode 100644 docs/java/com/sleepycat/je/class-use/RunRecoveryException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryConstraintException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryCursor.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryDatabase.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryIntegrityException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryKeyCreator.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryMultiKeyCreator.html create mode 100644 docs/java/com/sleepycat/je/class-use/SecondaryReferenceException.html create mode 100644 docs/java/com/sleepycat/je/class-use/Sequence.html create mode 100644 docs/java/com/sleepycat/je/class-use/SequenceConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/SequenceExistsException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SequenceIntegrityException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SequenceNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SequenceOverflowException.html create mode 100644 docs/java/com/sleepycat/je/class-use/SequenceStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/StatsConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/ThreadInterruptedException.html create mode 100644 docs/java/com/sleepycat/je/class-use/Transaction.State.html create mode 100644 docs/java/com/sleepycat/je/class-use/Transaction.html create mode 100644 docs/java/com/sleepycat/je/class-use/TransactionConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/TransactionStats.Active.html create mode 100644 docs/java/com/sleepycat/je/class-use/TransactionStats.html create mode 100644 docs/java/com/sleepycat/je/class-use/TransactionTimeoutException.html create mode 100644 docs/java/com/sleepycat/je/class-use/UniqueConstraintException.html create mode 100644 docs/java/com/sleepycat/je/class-use/VerifyConfig.html create mode 100644 docs/java/com/sleepycat/je/class-use/VersionMismatchException.html create mode 100644 docs/java/com/sleepycat/je/class-use/WriteOptions.html create mode 100644 docs/java/com/sleepycat/je/class-use/XAEnvironment.html create mode 100644 docs/java/com/sleepycat/je/class-use/XAFailureException.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/JEConnection.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/JEConnectionFactory.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/JEException.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/class-use/JEConnection.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/class-use/JEConnectionFactory.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/class-use/JEException.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/package-frame.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/package-summary.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/package-tree.html create mode 100644 docs/java/com/sleepycat/je/jca/ra/package-use.html create mode 100644 docs/java/com/sleepycat/je/jmx/JEDiagnostics.html create mode 100644 docs/java/com/sleepycat/je/jmx/JEMBean.html create mode 100644 docs/java/com/sleepycat/je/jmx/JEMBeanHelper.html create mode 100644 docs/java/com/sleepycat/je/jmx/JEMonitor.html create mode 100644 docs/java/com/sleepycat/je/jmx/class-use/JEDiagnostics.html create mode 100644 docs/java/com/sleepycat/je/jmx/class-use/JEMBean.html create mode 100644 docs/java/com/sleepycat/je/jmx/class-use/JEMBeanHelper.html create mode 100644 docs/java/com/sleepycat/je/jmx/class-use/JEMonitor.html create mode 100644 docs/java/com/sleepycat/je/jmx/package-frame.html create mode 100644 docs/java/com/sleepycat/je/jmx/package-summary.html create mode 100644 docs/java/com/sleepycat/je/jmx/package-tree.html create mode 100644 docs/java/com/sleepycat/je/jmx/package-use.html create mode 100644 docs/java/com/sleepycat/je/package-frame.html create mode 100644 docs/java/com/sleepycat/je/package-summary.html create mode 100644 docs/java/com/sleepycat/je/package-tree.html create mode 100644 docs/java/com/sleepycat/je/package-use.html create mode 100644 docs/java/com/sleepycat/je/rep/AppStateMonitor.html create mode 100644 docs/java/com/sleepycat/je/rep/CommitPointConsistencyPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/DatabasePreemptedException.html create mode 100644 docs/java/com/sleepycat/je/rep/GroupShutdownException.html create mode 100644 docs/java/com/sleepycat/je/rep/InsufficientAcksException.html create mode 100644 docs/java/com/sleepycat/je/rep/InsufficientLogException.html create mode 100644 docs/java/com/sleepycat/je/rep/InsufficientReplicasException.html create mode 100644 docs/java/com/sleepycat/je/rep/LockPreemptedException.html create mode 100644 docs/java/com/sleepycat/je/rep/LogOverwriteException.html create mode 100644 docs/java/com/sleepycat/je/rep/MasterReplicaTransitionException.html create mode 100644 docs/java/com/sleepycat/je/rep/MasterStateException.html create mode 100644 docs/java/com/sleepycat/je/rep/MasterTransferFailureException.html create mode 100644 docs/java/com/sleepycat/je/rep/MemberNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/rep/NetworkRestore.html create mode 100644 docs/java/com/sleepycat/je/rep/NetworkRestoreConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/NoConsistencyRequiredPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/NodeState.html create mode 100644 docs/java/com/sleepycat/je/rep/NodeType.html create mode 100644 docs/java/com/sleepycat/je/rep/QuorumPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicaConsistencyException.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicaStateException.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicaWriteException.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.State.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicatedEnvironmentStats.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicationConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicationGroup.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicationMutableConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/ReplicationNode.html create mode 100644 docs/java/com/sleepycat/je/rep/RestartRequiredException.html create mode 100644 docs/java/com/sleepycat/je/rep/RollbackException.html create mode 100644 docs/java/com/sleepycat/je/rep/RollbackProhibitedException.html create mode 100644 docs/java/com/sleepycat/je/rep/StateChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/StateChangeException.html create mode 100644 docs/java/com/sleepycat/je/rep/StateChangeListener.html create mode 100644 docs/java/com/sleepycat/je/rep/SyncupProgress.html create mode 100644 docs/java/com/sleepycat/je/rep/TimeConsistencyPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/UnknownMasterException.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/Arbiter.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/ArbiterConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/ArbiterMutableConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/ArbiterStats.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/class-use/Arbiter.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterMutableConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterStats.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/package-frame.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/package-summary.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/package-tree.html create mode 100644 docs/java/com/sleepycat/je/rep/arbiter/package-use.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/AppStateMonitor.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/CommitPointConsistencyPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/DatabasePreemptedException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/GroupShutdownException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/InsufficientAcksException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/InsufficientLogException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/InsufficientReplicasException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/LockPreemptedException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/LogOverwriteException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/MasterReplicaTransitionException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/MasterStateException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/MasterTransferFailureException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/MemberNotFoundException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/NetworkRestore.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/NetworkRestoreConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/NoConsistencyRequiredPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/NodeState.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/NodeType.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/QuorumPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicaConsistencyException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicaStateException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicaWriteException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.State.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironmentStats.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicationConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicationGroup.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicationMutableConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/ReplicationNode.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/RestartRequiredException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/RollbackException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/RollbackProhibitedException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/StateChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/StateChangeException.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/StateChangeListener.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/SyncupProgress.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/TimeConsistencyPolicy.html create mode 100644 docs/java/com/sleepycat/je/rep/class-use/UnknownMasterException.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.GroupChangeType.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/JoinGroupEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.LeaveReason.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/MemberChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/Monitor.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/MonitorChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/MonitorChangeListener.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/MonitorConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/MonitorConfigBeanInfo.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/NewMasterEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.GroupChangeType.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/JoinGroupEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.LeaveReason.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/MemberChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/Monitor.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeListener.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfig.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfigBeanInfo.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/class-use/NewMasterEvent.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/package-frame.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/package-summary.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/package-tree.html create mode 100644 docs/java/com/sleepycat/je/rep/monitor/package-use.html create mode 100644 docs/java/com/sleepycat/je/rep/package-frame.html create mode 100644 docs/java/com/sleepycat/je/rep/package-summary.html create mode 100644 docs/java/com/sleepycat/je/rep/package-tree.html create mode 100644 docs/java/com/sleepycat/je/rep/package-use.html create mode 100644 docs/java/com/sleepycat/je/rep/util/AtomicLongMax.html create mode 100644 docs/java/com/sleepycat/je/rep/util/DbEnableReplication.html create mode 100644 docs/java/com/sleepycat/je/rep/util/DbGroupAdmin.html create mode 100644 docs/java/com/sleepycat/je/rep/util/DbPing.html create mode 100644 docs/java/com/sleepycat/je/rep/util/DbResetRepGroup.html create mode 100644 docs/java/com/sleepycat/je/rep/util/ReplicationGroupAdmin.html create mode 100644 docs/java/com/sleepycat/je/rep/util/class-use/AtomicLongMax.html create mode 100644 docs/java/com/sleepycat/je/rep/util/class-use/DbEnableReplication.html create mode 100644 docs/java/com/sleepycat/je/rep/util/class-use/DbGroupAdmin.html create mode 100644 docs/java/com/sleepycat/je/rep/util/class-use/DbPing.html create mode 100644 docs/java/com/sleepycat/je/rep/util/class-use/DbResetRepGroup.html create mode 100644 docs/java/com/sleepycat/je/rep/util/class-use/ReplicationGroupAdmin.html create mode 100644 docs/java/com/sleepycat/je/rep/util/package-frame.html create mode 100644 docs/java/com/sleepycat/je/rep/util/package-summary.html create mode 100644 docs/java/com/sleepycat/je/rep/util/package-tree.html create mode 100644 docs/java/com/sleepycat/je/rep/util/package-use.html create mode 100644 docs/java/com/sleepycat/je/util/ConsoleHandler.html create mode 100644 docs/java/com/sleepycat/je/util/DbBackup.html create mode 100644 docs/java/com/sleepycat/je/util/DbCacheSize.html create mode 100644 docs/java/com/sleepycat/je/util/DbDeleteReservedFiles.html create mode 100644 docs/java/com/sleepycat/je/util/DbDump.html create mode 100644 docs/java/com/sleepycat/je/util/DbFilterStats.html create mode 100644 docs/java/com/sleepycat/je/util/DbLoad.html create mode 100644 docs/java/com/sleepycat/je/util/DbPrintLog.html create mode 100644 docs/java/com/sleepycat/je/util/DbScavenger.html create mode 100644 docs/java/com/sleepycat/je/util/DbSpace.html create mode 100644 docs/java/com/sleepycat/je/util/DbStat.html create mode 100644 docs/java/com/sleepycat/je/util/DbTruncateLog.html create mode 100644 docs/java/com/sleepycat/je/util/DbVerify.html create mode 100644 docs/java/com/sleepycat/je/util/DbVerifyLog.html create mode 100644 docs/java/com/sleepycat/je/util/FileHandler.html create mode 100644 docs/java/com/sleepycat/je/util/LogVerificationException.html create mode 100644 docs/java/com/sleepycat/je/util/LogVerificationInputStream.html create mode 100644 docs/java/com/sleepycat/je/util/LogVerificationReadableByteChannel.html create mode 100644 docs/java/com/sleepycat/je/util/Splitter.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/ConsoleHandler.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbBackup.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbCacheSize.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbDeleteReservedFiles.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbDump.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbFilterStats.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbLoad.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbPrintLog.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbScavenger.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbSpace.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbStat.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbTruncateLog.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbVerify.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/DbVerifyLog.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/FileHandler.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/LogVerificationException.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/LogVerificationInputStream.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/LogVerificationReadableByteChannel.html create mode 100644 docs/java/com/sleepycat/je/util/class-use/Splitter.html create mode 100644 docs/java/com/sleepycat/je/util/package-frame.html create mode 100644 docs/java/com/sleepycat/je/util/package-summary.html create mode 100644 docs/java/com/sleepycat/je/util/package-tree.html create mode 100644 docs/java/com/sleepycat/je/util/package-use.html create mode 100644 docs/java/com/sleepycat/persist/EntityCursor.html create mode 100644 docs/java/com/sleepycat/persist/EntityIndex.html create mode 100644 docs/java/com/sleepycat/persist/EntityJoin.html create mode 100644 docs/java/com/sleepycat/persist/EntityResult.html create mode 100644 docs/java/com/sleepycat/persist/EntityStore.html create mode 100644 docs/java/com/sleepycat/persist/ForwardCursor.html create mode 100644 docs/java/com/sleepycat/persist/IndexNotAvailableException.html create mode 100644 docs/java/com/sleepycat/persist/PrimaryIndex.html create mode 100644 docs/java/com/sleepycat/persist/SecondaryIndex.html create mode 100644 docs/java/com/sleepycat/persist/StoreConfig.html create mode 100644 docs/java/com/sleepycat/persist/StoreConfigBeanInfo.html create mode 100644 docs/java/com/sleepycat/persist/StoreExistsException.html create mode 100644 docs/java/com/sleepycat/persist/StoreNotFoundException.html create mode 100644 docs/java/com/sleepycat/persist/class-use/EntityCursor.html create mode 100644 docs/java/com/sleepycat/persist/class-use/EntityIndex.html create mode 100644 docs/java/com/sleepycat/persist/class-use/EntityJoin.html create mode 100644 docs/java/com/sleepycat/persist/class-use/EntityResult.html create mode 100644 docs/java/com/sleepycat/persist/class-use/EntityStore.html create mode 100644 docs/java/com/sleepycat/persist/class-use/ForwardCursor.html create mode 100644 docs/java/com/sleepycat/persist/class-use/IndexNotAvailableException.html create mode 100644 docs/java/com/sleepycat/persist/class-use/PrimaryIndex.html create mode 100644 docs/java/com/sleepycat/persist/class-use/SecondaryIndex.html create mode 100644 docs/java/com/sleepycat/persist/class-use/StoreConfig.html create mode 100644 docs/java/com/sleepycat/persist/class-use/StoreConfigBeanInfo.html create mode 100644 docs/java/com/sleepycat/persist/class-use/StoreExistsException.html create mode 100644 docs/java/com/sleepycat/persist/class-use/StoreNotFoundException.html create mode 100644 docs/java/com/sleepycat/persist/evolve/Conversion.html create mode 100644 docs/java/com/sleepycat/persist/evolve/Converter.html create mode 100644 docs/java/com/sleepycat/persist/evolve/DeletedClassException.html create mode 100644 docs/java/com/sleepycat/persist/evolve/Deleter.html create mode 100644 docs/java/com/sleepycat/persist/evolve/EntityConverter.html create mode 100644 docs/java/com/sleepycat/persist/evolve/EvolveConfig.html create mode 100644 docs/java/com/sleepycat/persist/evolve/EvolveConfigBeanInfo.html create mode 100644 docs/java/com/sleepycat/persist/evolve/EvolveEvent.html create mode 100644 docs/java/com/sleepycat/persist/evolve/EvolveListener.html create mode 100644 docs/java/com/sleepycat/persist/evolve/EvolveStats.html create mode 100644 docs/java/com/sleepycat/persist/evolve/IncompatibleClassException.html create mode 100644 docs/java/com/sleepycat/persist/evolve/Mutation.html create mode 100644 docs/java/com/sleepycat/persist/evolve/Mutations.html create mode 100644 docs/java/com/sleepycat/persist/evolve/Renamer.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/Conversion.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/Converter.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/DeletedClassException.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/Deleter.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/EntityConverter.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfig.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfigBeanInfo.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/EvolveEvent.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/EvolveListener.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/EvolveStats.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/IncompatibleClassException.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/Mutation.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/Mutations.html create mode 100644 docs/java/com/sleepycat/persist/evolve/class-use/Renamer.html create mode 100644 docs/java/com/sleepycat/persist/evolve/package-frame.html create mode 100644 docs/java/com/sleepycat/persist/evolve/package-summary.html create mode 100644 docs/java/com/sleepycat/persist/evolve/package-tree.html create mode 100644 docs/java/com/sleepycat/persist/evolve/package-use.html create mode 100644 docs/java/com/sleepycat/persist/model/AnnotationModel.html create mode 100644 docs/java/com/sleepycat/persist/model/ClassEnhancer.html create mode 100644 docs/java/com/sleepycat/persist/model/ClassEnhancerTask.html create mode 100644 docs/java/com/sleepycat/persist/model/ClassMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/DeleteAction.html create mode 100644 docs/java/com/sleepycat/persist/model/Entity.html create mode 100644 docs/java/com/sleepycat/persist/model/EntityMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/EntityModel.html create mode 100644 docs/java/com/sleepycat/persist/model/FieldMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/KeyField.html create mode 100644 docs/java/com/sleepycat/persist/model/NotPersistent.html create mode 100644 docs/java/com/sleepycat/persist/model/NotTransient.html create mode 100644 docs/java/com/sleepycat/persist/model/Persistent.html create mode 100644 docs/java/com/sleepycat/persist/model/PersistentProxy.html create mode 100644 docs/java/com/sleepycat/persist/model/PrimaryKey.html create mode 100644 docs/java/com/sleepycat/persist/model/PrimaryKeyMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/Relationship.html create mode 100644 docs/java/com/sleepycat/persist/model/SecondaryKey.html create mode 100644 docs/java/com/sleepycat/persist/model/SecondaryKeyMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/AnnotationModel.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/ClassEnhancer.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/ClassEnhancerTask.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/ClassMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/DeleteAction.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/Entity.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/EntityMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/EntityModel.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/FieldMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/KeyField.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/NotPersistent.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/NotTransient.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/Persistent.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/PersistentProxy.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/PrimaryKey.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/PrimaryKeyMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/Relationship.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/SecondaryKey.html create mode 100644 docs/java/com/sleepycat/persist/model/class-use/SecondaryKeyMetadata.html create mode 100644 docs/java/com/sleepycat/persist/model/package-frame.html create mode 100644 docs/java/com/sleepycat/persist/model/package-summary.html create mode 100644 docs/java/com/sleepycat/persist/model/package-tree.html create mode 100644 docs/java/com/sleepycat/persist/model/package-use.html create mode 100644 docs/java/com/sleepycat/persist/package-frame.html create mode 100644 docs/java/com/sleepycat/persist/package-summary.html create mode 100644 docs/java/com/sleepycat/persist/package-tree.html create mode 100644 docs/java/com/sleepycat/persist/package-use.html create mode 100644 docs/java/com/sleepycat/persist/raw/RawField.html create mode 100644 docs/java/com/sleepycat/persist/raw/RawObject.html create mode 100644 docs/java/com/sleepycat/persist/raw/RawStore.html create mode 100644 docs/java/com/sleepycat/persist/raw/RawType.html create mode 100644 docs/java/com/sleepycat/persist/raw/class-use/RawField.html create mode 100644 docs/java/com/sleepycat/persist/raw/class-use/RawObject.html create mode 100644 docs/java/com/sleepycat/persist/raw/class-use/RawStore.html create mode 100644 docs/java/com/sleepycat/persist/raw/class-use/RawType.html create mode 100644 docs/java/com/sleepycat/persist/raw/package-frame.html create mode 100644 docs/java/com/sleepycat/persist/raw/package-summary.html create mode 100644 docs/java/com/sleepycat/persist/raw/package-tree.html create mode 100644 docs/java/com/sleepycat/persist/raw/package-use.html create mode 100644 docs/java/com/sleepycat/util/ClassResolver.Stream.html create mode 100644 docs/java/com/sleepycat/util/ClassResolver.html create mode 100644 docs/java/com/sleepycat/util/ConfigBeanInfoBase.html create mode 100644 docs/java/com/sleepycat/util/ExceptionUnwrapper.html create mode 100644 docs/java/com/sleepycat/util/ExceptionWrapper.html create mode 100644 docs/java/com/sleepycat/util/FastInputStream.html create mode 100644 docs/java/com/sleepycat/util/FastOutputStream.html create mode 100644 docs/java/com/sleepycat/util/IOExceptionWrapper.html create mode 100644 docs/java/com/sleepycat/util/PackedInteger.html create mode 100644 docs/java/com/sleepycat/util/RuntimeExceptionWrapper.html create mode 100644 docs/java/com/sleepycat/util/UtfOps.html create mode 100644 docs/java/com/sleepycat/util/class-use/ClassResolver.Stream.html create mode 100644 docs/java/com/sleepycat/util/class-use/ClassResolver.html create mode 100644 docs/java/com/sleepycat/util/class-use/ConfigBeanInfoBase.html create mode 100644 docs/java/com/sleepycat/util/class-use/ExceptionUnwrapper.html create mode 100644 docs/java/com/sleepycat/util/class-use/ExceptionWrapper.html create mode 100644 docs/java/com/sleepycat/util/class-use/FastInputStream.html create mode 100644 docs/java/com/sleepycat/util/class-use/FastOutputStream.html create mode 100644 docs/java/com/sleepycat/util/class-use/IOExceptionWrapper.html create mode 100644 docs/java/com/sleepycat/util/class-use/PackedInteger.html create mode 100644 docs/java/com/sleepycat/util/class-use/RuntimeExceptionWrapper.html create mode 100644 docs/java/com/sleepycat/util/class-use/UtfOps.html create mode 100644 docs/java/com/sleepycat/util/package-frame.html create mode 100644 docs/java/com/sleepycat/util/package-summary.html create mode 100644 docs/java/com/sleepycat/util/package-tree.html create mode 100644 docs/java/com/sleepycat/util/package-use.html create mode 100644 docs/java/constant-values.html create mode 100644 docs/java/deprecated-list.html create mode 100644 docs/java/help-doc.html create mode 100644 docs/java/index-all.html create mode 100644 docs/java/index.html create mode 100644 docs/java/overview-frame.html create mode 100644 docs/java/overview-summary.html create mode 100644 docs/java/overview-tree.html create mode 100644 docs/java/package-list create mode 100644 docs/java/script.js create mode 100644 docs/java/serialized-form.html create mode 100644 docs/java/standard-stylesheet.css create mode 100644 docs/java/style.css create mode 100644 docs/jconsole/Choose-MBean.JPG create mode 100644 docs/jconsole/Choose-group.JPG create mode 100644 docs/jconsole/Display-cumulative-stats.JPG create mode 100644 docs/jconsole/Graph-stat.JPG create mode 100644 docs/jconsole/Interval-setting.JPG create mode 100644 docs/jconsole/JConsole-plugin.html create mode 100644 docs/jconsole/JEDiagnostics-attributes.JPG create mode 100644 docs/jconsole/JEDiagnostics-operations.JPG create mode 100644 docs/jconsole/JEMonitor-attributes.JPG create mode 100644 docs/jconsole/JEMonitor-operations.JPG create mode 100644 docs/jconsole/JEStats-plugin.JPG create mode 100644 docs/jconsole/MBean-operations.JPG create mode 100644 docs/jconsole/Mutable-configs.JPG create mode 100644 docs/jconsole/Non-zero.JPG create mode 100644 docs/jconsole/RepJEMonitor-operations.JPG create mode 100644 docs/jconsole/RepJEStats-plugin.JPG create mode 100644 docs/jconsole/Save-log.JPG create mode 100644 docs/jconsole/Show-graph.JPG create mode 100644 docs/jconsole/Show-tips.JPG create mode 100644 docs/jconsole/Start-record.JPG create mode 100644 docs/jconsole/Stop-record.JPG create mode 100644 docs/jconsole/Unlog-stat.JPG create mode 100644 docs/relnotes.html create mode 100644 docs/sleepycat-idoc.css create mode 100644 docs/sleepycat/legal.html create mode 100644 docs/sleepycat/license_je.html create mode 100644 docs/traceLogging.html create mode 100644 examples/collections/access/AccessExample.java create mode 100644 examples/collections/hello/HelloDatabaseWorld.java create mode 100644 examples/collections/ship/basic/PartData.java create mode 100644 examples/collections/ship/basic/PartKey.java create mode 100644 examples/collections/ship/basic/Sample.java create mode 100644 examples/collections/ship/basic/SampleDatabase.java create mode 100644 examples/collections/ship/basic/SampleViews.java create mode 100644 examples/collections/ship/basic/ShipmentData.java create mode 100644 examples/collections/ship/basic/ShipmentKey.java create mode 100644 examples/collections/ship/basic/SupplierData.java create mode 100644 examples/collections/ship/basic/SupplierKey.java create mode 100644 examples/collections/ship/basic/Weight.java create mode 100644 examples/collections/ship/entity/Part.java create mode 100644 examples/collections/ship/entity/PartData.java create mode 100644 examples/collections/ship/entity/PartKey.java create mode 100644 examples/collections/ship/entity/Sample.java create mode 100644 examples/collections/ship/entity/SampleDatabase.java create mode 100644 examples/collections/ship/entity/SampleViews.java create mode 100644 examples/collections/ship/entity/Shipment.java create mode 100644 examples/collections/ship/entity/ShipmentData.java create mode 100644 examples/collections/ship/entity/ShipmentKey.java create mode 100644 examples/collections/ship/entity/Supplier.java create mode 100644 examples/collections/ship/entity/SupplierData.java create mode 100644 examples/collections/ship/entity/SupplierKey.java create mode 100644 examples/collections/ship/entity/Weight.java create mode 100644 examples/collections/ship/factory/Part.java create mode 100644 examples/collections/ship/factory/PartKey.java create mode 100644 examples/collections/ship/factory/Sample.java create mode 100644 examples/collections/ship/factory/SampleDatabase.java create mode 100644 examples/collections/ship/factory/SampleViews.java create mode 100644 examples/collections/ship/factory/Shipment.java create mode 100644 examples/collections/ship/factory/ShipmentKey.java create mode 100644 examples/collections/ship/factory/Supplier.java create mode 100644 examples/collections/ship/factory/SupplierKey.java create mode 100644 examples/collections/ship/factory/Weight.java create mode 100644 examples/collections/ship/index/PartData.java create mode 100644 examples/collections/ship/index/PartKey.java create mode 100644 examples/collections/ship/index/Sample.java create mode 100644 examples/collections/ship/index/SampleDatabase.java create mode 100644 examples/collections/ship/index/SampleViews.java create mode 100644 examples/collections/ship/index/ShipmentData.java create mode 100644 examples/collections/ship/index/ShipmentKey.java create mode 100644 examples/collections/ship/index/SupplierData.java create mode 100644 examples/collections/ship/index/SupplierKey.java create mode 100644 examples/collections/ship/index/Weight.java create mode 100644 examples/collections/ship/marshal/MarshalledEntity.java create mode 100644 examples/collections/ship/marshal/MarshalledKey.java create mode 100644 examples/collections/ship/marshal/Part.java create mode 100644 examples/collections/ship/marshal/PartKey.java create mode 100644 examples/collections/ship/marshal/Sample.java create mode 100644 examples/collections/ship/marshal/SampleDatabase.java create mode 100644 examples/collections/ship/marshal/SampleViews.java create mode 100644 examples/collections/ship/marshal/Shipment.java create mode 100644 examples/collections/ship/marshal/ShipmentKey.java create mode 100644 examples/collections/ship/marshal/Supplier.java create mode 100644 examples/collections/ship/marshal/SupplierKey.java create mode 100644 examples/collections/ship/marshal/Weight.java create mode 100644 examples/collections/ship/sentity/Part.java create mode 100644 examples/collections/ship/sentity/PartKey.java create mode 100644 examples/collections/ship/sentity/Sample.java create mode 100644 examples/collections/ship/sentity/SampleDatabase.java create mode 100644 examples/collections/ship/sentity/SampleViews.java create mode 100644 examples/collections/ship/sentity/Shipment.java create mode 100644 examples/collections/ship/sentity/ShipmentKey.java create mode 100644 examples/collections/ship/sentity/Supplier.java create mode 100644 examples/collections/ship/sentity/SupplierKey.java create mode 100644 examples/collections/ship/sentity/Weight.java create mode 100644 examples/collections/ship/tuple/Part.java create mode 100644 examples/collections/ship/tuple/PartData.java create mode 100644 examples/collections/ship/tuple/PartKey.java create mode 100644 examples/collections/ship/tuple/Sample.java create mode 100644 examples/collections/ship/tuple/SampleDatabase.java create mode 100644 examples/collections/ship/tuple/SampleViews.java create mode 100644 examples/collections/ship/tuple/Shipment.java create mode 100644 examples/collections/ship/tuple/ShipmentData.java create mode 100644 examples/collections/ship/tuple/ShipmentKey.java create mode 100644 examples/collections/ship/tuple/Supplier.java create mode 100644 examples/collections/ship/tuple/SupplierData.java create mode 100644 examples/collections/ship/tuple/SupplierKey.java create mode 100644 examples/collections/ship/tuple/Weight.java create mode 100644 examples/jca/HOWTO-jboss.txt create mode 100644 examples/jca/HOWTO-oc4j.txt create mode 100644 examples/jca/HOWTO-sjsas.txt create mode 100644 examples/jca/jboss/jboss.xml create mode 100644 examples/jca/jboss/je-localtx-ds.xml create mode 100644 examples/jca/jboss/je-no-tx-ds.xml create mode 100644 examples/jca/jboss/je-xa-ds.xml create mode 100644 examples/jca/oc4j/orion-ejb-jar.xml create mode 100644 examples/jca/simple/Simple.java create mode 100644 examples/jca/simple/SimpleBean.java create mode 100644 examples/jca/simple/SimpleClient.java create mode 100644 examples/jca/simple/SimpleHome.java create mode 100644 examples/jca/simple/ejb-jar.xml create mode 100644 examples/jca/sjsas8_1/sun-ejb-jar.xml create mode 100644 examples/je/BindingExample.java create mode 100644 examples/je/MeasureInsertSize.java create mode 100644 examples/je/SecondaryExample.java create mode 100644 examples/je/SequenceExample.java create mode 100644 examples/je/SimpleExample.java create mode 100644 examples/je/ToManyExample.java create mode 100644 examples/je/gettingStarted/ExampleDatabasePut.java create mode 100644 examples/je/gettingStarted/ExampleInventoryRead.java create mode 100644 examples/je/gettingStarted/Inventory.java create mode 100644 examples/je/gettingStarted/InventoryBinding.java create mode 100644 examples/je/gettingStarted/ItemNameKeyCreator.java create mode 100644 examples/je/gettingStarted/MyDbEnv.java create mode 100644 examples/je/gettingStarted/Vendor.java create mode 100644 examples/je/gettingStarted/inventory.txt create mode 100644 examples/je/gettingStarted/vendors.txt create mode 100644 examples/je/rep/quote/Command.java create mode 100644 examples/je/rep/quote/DataAccessor.java create mode 100644 examples/je/rep/quote/HARouter.java create mode 100644 examples/je/rep/quote/Quote.java create mode 100644 examples/je/rep/quote/QuoteUtil.java create mode 100644 examples/je/rep/quote/RouterDrivenStockQuotes.java create mode 100644 examples/je/rep/quote/RunTransaction.java create mode 100644 examples/je/rep/quote/SimpleRouter.java create mode 100644 examples/je/rep/quote/StockQuotes.java create mode 100644 examples/je/rep/quote/StockQuotesRMIForwarding.java create mode 100644 examples/je/rep/quote/UpdateForwardingStockQuotes.java create mode 100644 examples/je/rep/quote/package.html create mode 100644 examples/je/txn/DBWriter.java create mode 100644 examples/je/txn/PayloadData.java create mode 100644 examples/je/txn/TxnGuide.java create mode 100644 examples/jmx/JEApplicationMBean.java create mode 100644 examples/jmx/README.txt create mode 100644 examples/jmx/je-jboss-service.xml create mode 100644 examples/persist/CustomKeyOrderExample.java create mode 100644 examples/persist/DplDump.java create mode 100644 examples/persist/EventExample.java create mode 100644 examples/persist/EventExampleDPL.java create mode 100644 examples/persist/PersonExample.java create mode 100644 examples/persist/ScalaPersonExample.scala create mode 100644 examples/persist/gettingStarted/DataAccessor.java create mode 100644 examples/persist/gettingStarted/ExampleDatabasePut.java create mode 100644 examples/persist/gettingStarted/ExampleInventoryRead.java create mode 100644 examples/persist/gettingStarted/Inventory.java create mode 100644 examples/persist/gettingStarted/MyDbEnv.java create mode 100644 examples/persist/gettingStarted/Vendor.java create mode 100644 examples/persist/gettingStarted/inventory.txt create mode 100644 examples/persist/gettingStarted/vendors.txt create mode 100644 examples/persist/sqlapp/DataAccessor.java create mode 100644 examples/persist/sqlapp/Department.java create mode 100644 examples/persist/sqlapp/Employee.java create mode 100644 examples/persist/sqlapp/SQLApp.java create mode 100644 examples/persist/txn/PayloadDataEntity.java create mode 100644 examples/persist/txn/StoreWriter.java create mode 100644 examples/persist/txn/TxnGuideDPL.java create mode 100644 examples/resources/jboss/jndi.properties create mode 100644 ivy.xml create mode 100644 src/com/sleepycat/asm/AnnotationVisitor.java create mode 100644 src/com/sleepycat/asm/AnnotationWriter.java create mode 100644 src/com/sleepycat/asm/Attribute.java create mode 100644 src/com/sleepycat/asm/ByteVector.java create mode 100644 src/com/sleepycat/asm/ClassReader.java create mode 100644 src/com/sleepycat/asm/ClassVisitor.java create mode 100644 src/com/sleepycat/asm/ClassWriter.java create mode 100644 src/com/sleepycat/asm/Context.java create mode 100644 src/com/sleepycat/asm/Edge.java create mode 100644 src/com/sleepycat/asm/FieldVisitor.java create mode 100644 src/com/sleepycat/asm/FieldWriter.java create mode 100644 src/com/sleepycat/asm/Frame.java create mode 100644 src/com/sleepycat/asm/Handle.java create mode 100644 src/com/sleepycat/asm/Handler.java create mode 100644 src/com/sleepycat/asm/Item.java create mode 100644 src/com/sleepycat/asm/Label.java create mode 100644 src/com/sleepycat/asm/MethodVisitor.java create mode 100644 src/com/sleepycat/asm/MethodWriter.java create mode 100644 src/com/sleepycat/asm/Opcodes.java create mode 100644 src/com/sleepycat/asm/Type.java create mode 100644 src/com/sleepycat/asm/TypePath.java create mode 100644 src/com/sleepycat/asm/package-info.java create mode 100644 src/com/sleepycat/bind/ByteArrayBinding.java create mode 100644 src/com/sleepycat/bind/EntityBinding.java create mode 100644 src/com/sleepycat/bind/EntryBinding.java create mode 100644 src/com/sleepycat/bind/RecordNumberBinding.java create mode 100644 src/com/sleepycat/bind/package.html create mode 100644 src/com/sleepycat/bind/serial/ClassCatalog.java create mode 100644 src/com/sleepycat/bind/serial/SerialBase.java create mode 100644 src/com/sleepycat/bind/serial/SerialBinding.java create mode 100644 src/com/sleepycat/bind/serial/SerialInput.java create mode 100644 src/com/sleepycat/bind/serial/SerialOutput.java create mode 100644 src/com/sleepycat/bind/serial/SerialSerialBinding.java create mode 100644 src/com/sleepycat/bind/serial/SerialSerialKeyCreator.java create mode 100644 src/com/sleepycat/bind/serial/StoredClassCatalog.java create mode 100644 src/com/sleepycat/bind/serial/TupleSerialBinding.java create mode 100644 src/com/sleepycat/bind/serial/TupleSerialKeyCreator.java create mode 100644 src/com/sleepycat/bind/serial/TupleSerialMarshalledBinding.java create mode 100644 src/com/sleepycat/bind/serial/TupleSerialMarshalledKeyCreator.java create mode 100644 src/com/sleepycat/bind/serial/package.html create mode 100644 src/com/sleepycat/bind/tuple/BigDecimalBinding.java create mode 100644 src/com/sleepycat/bind/tuple/BigIntegerBinding.java create mode 100644 src/com/sleepycat/bind/tuple/BooleanBinding.java create mode 100644 src/com/sleepycat/bind/tuple/ByteBinding.java create mode 100644 src/com/sleepycat/bind/tuple/CharacterBinding.java create mode 100644 src/com/sleepycat/bind/tuple/DoubleBinding.java create mode 100644 src/com/sleepycat/bind/tuple/FloatBinding.java create mode 100644 src/com/sleepycat/bind/tuple/IntegerBinding.java create mode 100644 src/com/sleepycat/bind/tuple/LongBinding.java create mode 100644 src/com/sleepycat/bind/tuple/MarshalledTupleEntry.java create mode 100644 src/com/sleepycat/bind/tuple/MarshalledTupleKeyEntity.java create mode 100644 src/com/sleepycat/bind/tuple/PackedIntegerBinding.java create mode 100644 src/com/sleepycat/bind/tuple/PackedLongBinding.java create mode 100644 src/com/sleepycat/bind/tuple/ShortBinding.java create mode 100644 src/com/sleepycat/bind/tuple/SortedBigDecimalBinding.java create mode 100644 src/com/sleepycat/bind/tuple/SortedDoubleBinding.java create mode 100644 src/com/sleepycat/bind/tuple/SortedFloatBinding.java create mode 100644 src/com/sleepycat/bind/tuple/SortedPackedIntegerBinding.java create mode 100644 src/com/sleepycat/bind/tuple/SortedPackedLongBinding.java create mode 100644 src/com/sleepycat/bind/tuple/StringBinding.java create mode 100644 src/com/sleepycat/bind/tuple/TupleBase.java create mode 100644 src/com/sleepycat/bind/tuple/TupleBinding.java create mode 100644 src/com/sleepycat/bind/tuple/TupleInput.java create mode 100644 src/com/sleepycat/bind/tuple/TupleInputBinding.java create mode 100644 src/com/sleepycat/bind/tuple/TupleMarshalledBinding.java create mode 100644 src/com/sleepycat/bind/tuple/TupleOutput.java create mode 100644 src/com/sleepycat/bind/tuple/TupleTupleBinding.java create mode 100644 src/com/sleepycat/bind/tuple/TupleTupleKeyCreator.java create mode 100644 src/com/sleepycat/bind/tuple/TupleTupleMarshalledBinding.java create mode 100644 src/com/sleepycat/bind/tuple/TupleTupleMarshalledKeyCreator.java create mode 100644 src/com/sleepycat/bind/tuple/package.html create mode 100644 src/com/sleepycat/collections/BaseIterator.java create mode 100644 src/com/sleepycat/collections/BlockIterator.java create mode 100644 src/com/sleepycat/collections/CurrentTransaction.java create mode 100644 src/com/sleepycat/collections/DataCursor.java create mode 100644 src/com/sleepycat/collections/DataView.java create mode 100644 src/com/sleepycat/collections/MapEntryParameter.java create mode 100644 src/com/sleepycat/collections/MyRangeCursor.java create mode 100644 src/com/sleepycat/collections/PrimaryKeyAssigner.java create mode 100644 src/com/sleepycat/collections/StoredCollection.java create mode 100644 src/com/sleepycat/collections/StoredCollections.java create mode 100644 src/com/sleepycat/collections/StoredContainer.java create mode 100644 src/com/sleepycat/collections/StoredEntrySet.java create mode 100644 src/com/sleepycat/collections/StoredIterator.java create mode 100644 src/com/sleepycat/collections/StoredKeySet.java create mode 100644 src/com/sleepycat/collections/StoredList.java create mode 100644 src/com/sleepycat/collections/StoredMap.java create mode 100644 src/com/sleepycat/collections/StoredMapEntry.java create mode 100644 src/com/sleepycat/collections/StoredSortedEntrySet.java create mode 100644 src/com/sleepycat/collections/StoredSortedKeySet.java create mode 100644 src/com/sleepycat/collections/StoredSortedMap.java create mode 100644 src/com/sleepycat/collections/StoredSortedValueSet.java create mode 100644 src/com/sleepycat/collections/StoredValueSet.java create mode 100644 src/com/sleepycat/collections/TransactionRunner.java create mode 100644 src/com/sleepycat/collections/TransactionWorker.java create mode 100644 src/com/sleepycat/collections/TupleSerialFactory.java create mode 100644 src/com/sleepycat/collections/package.html create mode 100644 src/com/sleepycat/compat/DbCompat.java create mode 100644 src/com/sleepycat/compat/package-info.java create mode 100644 src/com/sleepycat/je/BinaryEqualityComparator.java create mode 100644 src/com/sleepycat/je/BtreeStats.java create mode 100644 src/com/sleepycat/je/CacheMode.java create mode 100644 src/com/sleepycat/je/CheckpointConfig.java create mode 100644 src/com/sleepycat/je/CheckpointConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/CommitToken.java create mode 100644 src/com/sleepycat/je/Cursor.java create mode 100644 src/com/sleepycat/je/CursorConfig.java create mode 100644 src/com/sleepycat/je/CursorConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/CustomStats.java create mode 100644 src/com/sleepycat/je/Database.java create mode 100644 src/com/sleepycat/je/DatabaseComparator.java create mode 100644 src/com/sleepycat/je/DatabaseConfig.java create mode 100644 src/com/sleepycat/je/DatabaseConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/DatabaseEntry.java create mode 100644 src/com/sleepycat/je/DatabaseException.java create mode 100644 src/com/sleepycat/je/DatabaseExistsException.java create mode 100644 src/com/sleepycat/je/DatabaseNotFoundException.java create mode 100644 src/com/sleepycat/je/DatabaseStats.java create mode 100644 src/com/sleepycat/je/DbInternal.java create mode 100644 src/com/sleepycat/je/DeadlockException.java create mode 100644 src/com/sleepycat/je/DeleteConstraintException.java create mode 100644 src/com/sleepycat/je/DiskLimitException.java create mode 100644 src/com/sleepycat/je/DiskOrderedCursor.java create mode 100644 src/com/sleepycat/je/DiskOrderedCursorConfig.java create mode 100644 src/com/sleepycat/je/DiskOrderedCursorConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/DiskOrderedCursorProducerException.java create mode 100644 src/com/sleepycat/je/DuplicateDataException.java create mode 100644 src/com/sleepycat/je/Durability.java create mode 100644 src/com/sleepycat/je/Environment.java create mode 100644 src/com/sleepycat/je/EnvironmentConfig.java create mode 100644 src/com/sleepycat/je/EnvironmentConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/EnvironmentFailureException.java create mode 100644 src/com/sleepycat/je/EnvironmentLockedException.java create mode 100644 src/com/sleepycat/je/EnvironmentMutableConfig.java create mode 100644 src/com/sleepycat/je/EnvironmentMutableConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/EnvironmentNotFoundException.java create mode 100644 src/com/sleepycat/je/EnvironmentStats.java create mode 100644 src/com/sleepycat/je/EnvironmentWedgedException.java create mode 100644 src/com/sleepycat/je/ExceptionEvent.java create mode 100644 src/com/sleepycat/je/ExceptionListener.java create mode 100644 src/com/sleepycat/je/ForeignConstraintException.java create mode 100644 src/com/sleepycat/je/ForeignKeyDeleteAction.java create mode 100644 src/com/sleepycat/je/ForeignKeyNullifier.java create mode 100644 src/com/sleepycat/je/ForeignMultiKeyNullifier.java create mode 100644 src/com/sleepycat/je/ForwardCursor.java create mode 100644 src/com/sleepycat/je/Get.java create mode 100644 src/com/sleepycat/je/JEVersion.java create mode 100644 src/com/sleepycat/je/JoinConfig.java create mode 100644 src/com/sleepycat/je/JoinConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/JoinCursor.java create mode 100644 src/com/sleepycat/je/LockConflictException.java create mode 100644 src/com/sleepycat/je/LockMode.java create mode 100644 src/com/sleepycat/je/LockNotAvailableException.java create mode 100644 src/com/sleepycat/je/LockNotGrantedException.java create mode 100644 src/com/sleepycat/je/LockStats.java create mode 100644 src/com/sleepycat/je/LockTimeoutException.java create mode 100644 src/com/sleepycat/je/LogWriteException.java create mode 100644 src/com/sleepycat/je/OperationFailureException.java create mode 100644 src/com/sleepycat/je/OperationResult.java create mode 100644 src/com/sleepycat/je/OperationStatus.java create mode 100644 src/com/sleepycat/je/PartialComparator.java create mode 100644 src/com/sleepycat/je/PreloadConfig.java create mode 100644 src/com/sleepycat/je/PreloadConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/PreloadStats.java create mode 100644 src/com/sleepycat/je/PreloadStatus.java create mode 100644 src/com/sleepycat/je/ProgressListener.java create mode 100644 src/com/sleepycat/je/Put.java create mode 100644 src/com/sleepycat/je/ReadOptions.java create mode 100644 src/com/sleepycat/je/RecoveryProgress.java create mode 100644 src/com/sleepycat/je/ReplicaConsistencyPolicy.java create mode 100644 src/com/sleepycat/je/RunRecoveryException.java create mode 100644 src/com/sleepycat/je/SecondaryAssociation.java create mode 100644 src/com/sleepycat/je/SecondaryConfig.java create mode 100644 src/com/sleepycat/je/SecondaryConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/SecondaryConstraintException.java create mode 100644 src/com/sleepycat/je/SecondaryCursor.java create mode 100644 src/com/sleepycat/je/SecondaryDatabase.java create mode 100644 src/com/sleepycat/je/SecondaryIntegrityException.java create mode 100644 src/com/sleepycat/je/SecondaryKeyCreator.java create mode 100644 src/com/sleepycat/je/SecondaryMultiKeyCreator.java create mode 100644 src/com/sleepycat/je/SecondaryReferenceException.java create mode 100644 src/com/sleepycat/je/Sequence.java create mode 100644 src/com/sleepycat/je/SequenceConfig.java create mode 100644 src/com/sleepycat/je/SequenceConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/SequenceExistsException.java create mode 100644 src/com/sleepycat/je/SequenceIntegrityException.java create mode 100644 src/com/sleepycat/je/SequenceNotFoundException.java create mode 100644 src/com/sleepycat/je/SequenceOverflowException.java create mode 100644 src/com/sleepycat/je/SequenceStats.java create mode 100644 src/com/sleepycat/je/StatsConfig.java create mode 100644 src/com/sleepycat/je/StatsConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/ThreadInterruptedException.java create mode 100644 src/com/sleepycat/je/Transaction.java create mode 100644 src/com/sleepycat/je/TransactionConfig.java create mode 100644 src/com/sleepycat/je/TransactionConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/TransactionStats.java create mode 100644 src/com/sleepycat/je/TransactionTimeoutException.java create mode 100644 src/com/sleepycat/je/UniqueConstraintException.java create mode 100644 src/com/sleepycat/je/VerifyConfig.java create mode 100644 src/com/sleepycat/je/VerifyConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/VersionMismatchException.java create mode 100644 src/com/sleepycat/je/WriteOptions.java create mode 100644 src/com/sleepycat/je/XAEnvironment.java create mode 100644 src/com/sleepycat/je/XAFailureException.java create mode 100644 src/com/sleepycat/je/cleaner/BaseLocalUtilizationTracker.java create mode 100644 src/com/sleepycat/je/cleaner/BaseUtilizationTracker.java create mode 100644 src/com/sleepycat/je/cleaner/Cleaner.java create mode 100644 src/com/sleepycat/je/cleaner/CleanerStatDefinition.java create mode 100644 src/com/sleepycat/je/cleaner/DbFileSummary.java create mode 100644 src/com/sleepycat/je/cleaner/DbFileSummaryMap.java create mode 100644 src/com/sleepycat/je/cleaner/ExpirationProfile.java create mode 100644 src/com/sleepycat/je/cleaner/ExpirationTracker.java create mode 100644 src/com/sleepycat/je/cleaner/FileProcessor.java create mode 100644 src/com/sleepycat/je/cleaner/FileProtector.java create mode 100644 src/com/sleepycat/je/cleaner/FileSelector.java create mode 100644 src/com/sleepycat/je/cleaner/FileSummary.java create mode 100644 src/com/sleepycat/je/cleaner/FilesToMigrate.java create mode 100644 src/com/sleepycat/je/cleaner/INSummary.java create mode 100644 src/com/sleepycat/je/cleaner/LNInfo.java create mode 100644 src/com/sleepycat/je/cleaner/LocalUtilizationTracker.java create mode 100644 src/com/sleepycat/je/cleaner/OffsetList.java create mode 100644 src/com/sleepycat/je/cleaner/PackedObsoleteInfo.java create mode 100644 src/com/sleepycat/je/cleaner/PackedOffsets.java create mode 100644 src/com/sleepycat/je/cleaner/RecoveryUtilizationTracker.java create mode 100644 src/com/sleepycat/je/cleaner/ReservedFileInfo.java create mode 100644 src/com/sleepycat/je/cleaner/TrackedFileSummary.java create mode 100644 src/com/sleepycat/je/cleaner/UtilizationCalculator.java create mode 100644 src/com/sleepycat/je/cleaner/UtilizationProfile.java create mode 100644 src/com/sleepycat/je/cleaner/UtilizationTracker.java create mode 100644 src/com/sleepycat/je/cleaner/VerifyUtils.java create mode 100644 src/com/sleepycat/je/cleaner/package-info.java create mode 100644 src/com/sleepycat/je/config/BooleanConfigParam.java create mode 100644 src/com/sleepycat/je/config/ConfigParam.java create mode 100644 src/com/sleepycat/je/config/DurationConfigParam.java create mode 100644 src/com/sleepycat/je/config/EnvironmentParams.java create mode 100644 src/com/sleepycat/je/config/IntConfigParam.java create mode 100644 src/com/sleepycat/je/config/LongConfigParam.java create mode 100644 src/com/sleepycat/je/config/ShortConfigParam.java create mode 100644 src/com/sleepycat/je/config/package-info.java create mode 100644 src/com/sleepycat/je/dbi/BTreeStatDefinition.java create mode 100644 src/com/sleepycat/je/dbi/CompressedOopsDetector.java create mode 100644 src/com/sleepycat/je/dbi/CursorImpl.java create mode 100644 src/com/sleepycat/je/dbi/DatabaseId.java create mode 100644 src/com/sleepycat/je/dbi/DatabaseImpl.java create mode 100644 src/com/sleepycat/je/dbi/DbConfigManager.java create mode 100644 src/com/sleepycat/je/dbi/DbEnvPool.java create mode 100644 src/com/sleepycat/je/dbi/DbEnvState.java create mode 100644 src/com/sleepycat/je/dbi/DbTree.java create mode 100644 src/com/sleepycat/je/dbi/DbType.java create mode 100644 src/com/sleepycat/je/dbi/DbiStatDefinition.java create mode 100644 src/com/sleepycat/je/dbi/DiskOrderedCursorImpl.java create mode 100644 src/com/sleepycat/je/dbi/DiskOrderedScanner.java create mode 100644 src/com/sleepycat/je/dbi/DupKeyData.java create mode 100644 src/com/sleepycat/je/dbi/EnvConfigObserver.java create mode 100644 src/com/sleepycat/je/dbi/EnvironmentFailureReason.java create mode 100644 src/com/sleepycat/je/dbi/EnvironmentImpl.java create mode 100644 src/com/sleepycat/je/dbi/ExpirationInfo.java create mode 100644 src/com/sleepycat/je/dbi/GetMode.java create mode 100644 src/com/sleepycat/je/dbi/INList.java create mode 100644 src/com/sleepycat/je/dbi/LSNAccumulator.java create mode 100644 src/com/sleepycat/je/dbi/MemoryBudget.java create mode 100644 src/com/sleepycat/je/dbi/NodeSequence.java create mode 100644 src/com/sleepycat/je/dbi/Operation.java create mode 100644 src/com/sleepycat/je/dbi/PutMode.java create mode 100644 src/com/sleepycat/je/dbi/RangeConstraint.java create mode 100644 src/com/sleepycat/je/dbi/RangeRestartException.java create mode 100644 src/com/sleepycat/je/dbi/RecordVersion.java create mode 100644 src/com/sleepycat/je/dbi/RepConfigProxy.java create mode 100644 src/com/sleepycat/je/dbi/ReplicatedDatabaseConfig.java create mode 100644 src/com/sleepycat/je/dbi/SearchMode.java create mode 100644 src/com/sleepycat/je/dbi/SequenceStatDefinition.java create mode 100644 src/com/sleepycat/je/dbi/SortedLSNTreeWalker.java create mode 100644 src/com/sleepycat/je/dbi/StartupTracker.java create mode 100644 src/com/sleepycat/je/dbi/TTL.java create mode 100644 src/com/sleepycat/je/dbi/TriggerManager.java create mode 100644 src/com/sleepycat/je/dbi/TriggerUtils.java create mode 100644 src/com/sleepycat/je/dbi/TruncateResult.java create mode 100644 src/com/sleepycat/je/dbi/TxnStatDefinition.java create mode 100644 src/com/sleepycat/je/dbi/VLSNProxy.java create mode 100644 src/com/sleepycat/je/dbi/package-info.java create mode 100644 src/com/sleepycat/je/evictor/Arbiter.java create mode 100644 src/com/sleepycat/je/evictor/CHeapAllocator.java create mode 100644 src/com/sleepycat/je/evictor/DummyAllocator.java create mode 100644 src/com/sleepycat/je/evictor/Evictor.java create mode 100644 src/com/sleepycat/je/evictor/EvictorStatDefinition.java create mode 100644 src/com/sleepycat/je/evictor/OffHeapAllocator.java create mode 100644 src/com/sleepycat/je/evictor/OffHeapAllocatorFactory.java create mode 100644 src/com/sleepycat/je/evictor/OffHeapCache.java create mode 100644 src/com/sleepycat/je/evictor/OffHeapStatDefinition.java create mode 100644 src/com/sleepycat/je/evictor/package-info.java create mode 100644 src/com/sleepycat/je/incomp/INCompStatDefinition.java create mode 100644 src/com/sleepycat/je/incomp/INCompressor.java create mode 100644 src/com/sleepycat/je/incomp/package-info.java create mode 100644 src/com/sleepycat/je/jca/ra/JEConnection.java create mode 100644 src/com/sleepycat/je/jca/ra/JEConnectionFactory.java create mode 100644 src/com/sleepycat/je/jca/ra/JEConnectionFactoryImpl.java create mode 100644 src/com/sleepycat/je/jca/ra/JEConnectionMetaData.java create mode 100644 src/com/sleepycat/je/jca/ra/JEException.java create mode 100644 src/com/sleepycat/je/jca/ra/JELocalTransaction.java create mode 100644 src/com/sleepycat/je/jca/ra/JEManagedConnection.java create mode 100644 src/com/sleepycat/je/jca/ra/JEManagedConnectionFactory.java create mode 100644 src/com/sleepycat/je/jca/ra/JERequestInfo.java create mode 100644 src/com/sleepycat/je/jca/ra/package.html create mode 100644 src/com/sleepycat/je/jca/ra/ra.xml create mode 100644 src/com/sleepycat/je/jmx/JEDiagnostics.java create mode 100644 src/com/sleepycat/je/jmx/JEMBean.java create mode 100644 src/com/sleepycat/je/jmx/JEMBeanHelper.java create mode 100644 src/com/sleepycat/je/jmx/JEMonitor.java create mode 100644 src/com/sleepycat/je/jmx/package.html create mode 100644 src/com/sleepycat/je/jmx/plugin/JEStats.java create mode 100644 src/com/sleepycat/je/jmx/plugin/JEStatsPlugin.java create mode 100644 src/com/sleepycat/je/jmx/plugin/Stats.java create mode 100644 src/com/sleepycat/je/jmx/plugin/StatsPlugin.java create mode 100644 src/com/sleepycat/je/jmx/plugin/StatsSwingWorker.java create mode 100644 src/com/sleepycat/je/jmx/plugin/package-info.java create mode 100644 src/com/sleepycat/je/jmx/plugin/services/com.sun.tools.jconsole.JConsolePlugin create mode 100644 src/com/sleepycat/je/latch/Latch.java create mode 100644 src/com/sleepycat/je/latch/LatchContext.java create mode 100644 src/com/sleepycat/je/latch/LatchFactory.java create mode 100644 src/com/sleepycat/je/latch/LatchImpl.java create mode 100644 src/com/sleepycat/je/latch/LatchStatDefinition.java create mode 100644 src/com/sleepycat/je/latch/LatchSupport.java create mode 100644 src/com/sleepycat/je/latch/LatchTable.java create mode 100644 src/com/sleepycat/je/latch/LatchWithStatsImpl.java create mode 100644 src/com/sleepycat/je/latch/OwnerInfo.java create mode 100644 src/com/sleepycat/je/latch/SharedLatch.java create mode 100644 src/com/sleepycat/je/latch/SharedLatchImpl.java create mode 100644 src/com/sleepycat/je/latch/TimingLatch.java create mode 100644 src/com/sleepycat/je/latch/package-info.java create mode 100644 src/com/sleepycat/je/log/BasicVersionedWriteLoggable.java create mode 100644 src/com/sleepycat/je/log/CheckpointFileReader.java create mode 100644 src/com/sleepycat/je/log/ChecksumException.java create mode 100644 src/com/sleepycat/je/log/ChecksumValidator.java create mode 100644 src/com/sleepycat/je/log/CleanerFileReader.java create mode 100644 src/com/sleepycat/je/log/DbOpReplicationContext.java create mode 100644 src/com/sleepycat/je/log/DumpFileReader.java create mode 100644 src/com/sleepycat/je/log/FSyncManager.java create mode 100644 src/com/sleepycat/je/log/FileCacheWarmer.java create mode 100644 src/com/sleepycat/je/log/FileDeletionDetector.java create mode 100644 src/com/sleepycat/je/log/FileHandle.java create mode 100644 src/com/sleepycat/je/log/FileHandleSource.java create mode 100644 src/com/sleepycat/je/log/FileHeader.java create mode 100644 src/com/sleepycat/je/log/FileManager.java create mode 100644 src/com/sleepycat/je/log/FileReader.java create mode 100644 src/com/sleepycat/je/log/FileSource.java create mode 100644 src/com/sleepycat/je/log/INFileReader.java create mode 100644 src/com/sleepycat/je/log/JEFileFilter.java create mode 100644 src/com/sleepycat/je/log/LNFileReader.java create mode 100644 src/com/sleepycat/je/log/LastFileReader.java create mode 100644 src/com/sleepycat/je/log/LogBuffer.java create mode 100644 src/com/sleepycat/je/log/LogBufferPool.java create mode 100644 src/com/sleepycat/je/log/LogBufferSegment.java create mode 100644 src/com/sleepycat/je/log/LogEntryHeader.java create mode 100644 src/com/sleepycat/je/log/LogEntryType.java create mode 100644 src/com/sleepycat/je/log/LogFlusher.java create mode 100644 src/com/sleepycat/je/log/LogItem.java create mode 100644 src/com/sleepycat/je/log/LogManager.java create mode 100644 src/com/sleepycat/je/log/LogParams.java create mode 100644 src/com/sleepycat/je/log/LogSource.java create mode 100644 src/com/sleepycat/je/log/LogStatDefinition.java create mode 100644 src/com/sleepycat/je/log/LogUtils.java create mode 100644 src/com/sleepycat/je/log/Loggable.java create mode 100644 src/com/sleepycat/je/log/PrintFileReader.java create mode 100644 src/com/sleepycat/je/log/Provisional.java create mode 100644 src/com/sleepycat/je/log/ReplicationContext.java create mode 100644 src/com/sleepycat/je/log/RestoreMarker.java create mode 100644 src/com/sleepycat/je/log/ScavengerFileReader.java create mode 100644 src/com/sleepycat/je/log/SearchFileReader.java create mode 100644 src/com/sleepycat/je/log/StatsFileReader.java create mode 100644 src/com/sleepycat/je/log/Trace.java create mode 100644 src/com/sleepycat/je/log/UtilizationFileReader.java create mode 100644 src/com/sleepycat/je/log/VLSNDistributionReader.java create mode 100644 src/com/sleepycat/je/log/VersionedWriteLoggable.java create mode 100644 src/com/sleepycat/je/log/WholeEntry.java create mode 100644 src/com/sleepycat/je/log/entry/AbortLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/BINDeltaLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/BaseEntry.java create mode 100644 src/com/sleepycat/je/log/entry/BaseReplicableEntry.java create mode 100644 src/com/sleepycat/je/log/entry/CommitLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/DbOperationType.java create mode 100644 src/com/sleepycat/je/log/entry/DeletedDupLNLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/EmptyLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/FileHeaderEntry.java create mode 100644 src/com/sleepycat/je/log/entry/INContainingEntry.java create mode 100644 src/com/sleepycat/je/log/entry/INLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/LNLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/LogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/MatchpointLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/NameLNLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/OldBINDeltaLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/ReplicableLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/RestoreRequired.java create mode 100644 src/com/sleepycat/je/log/entry/SingleItemEntry.java create mode 100644 src/com/sleepycat/je/log/entry/SingleItemReplicableEntry.java create mode 100644 src/com/sleepycat/je/log/entry/TraceLogEntry.java create mode 100644 src/com/sleepycat/je/log/entry/package-info.java create mode 100644 src/com/sleepycat/je/log/package-info.java create mode 100644 src/com/sleepycat/je/package.html create mode 100644 src/com/sleepycat/je/recovery/CheckpointEnd.java create mode 100644 src/com/sleepycat/je/recovery/CheckpointStart.java create mode 100644 src/com/sleepycat/je/recovery/CheckpointStatDefinition.java create mode 100644 src/com/sleepycat/je/recovery/Checkpointer.java create mode 100644 src/com/sleepycat/je/recovery/DirtyINMap.java create mode 100644 src/com/sleepycat/je/recovery/RecoveryInfo.java create mode 100644 src/com/sleepycat/je/recovery/RecoveryManager.java create mode 100644 src/com/sleepycat/je/recovery/RollbackTracker.java create mode 100644 src/com/sleepycat/je/recovery/VLSNRecoveryProxy.java create mode 100644 src/com/sleepycat/je/recovery/package-info.java create mode 100644 src/com/sleepycat/je/rep/AppStateMonitor.java create mode 100644 src/com/sleepycat/je/rep/CommitPointConsistencyPolicy.java create mode 100644 src/com/sleepycat/je/rep/DatabasePreemptedException.java create mode 100644 src/com/sleepycat/je/rep/GroupShutdownException.java create mode 100644 src/com/sleepycat/je/rep/InsufficientAcksException.java create mode 100644 src/com/sleepycat/je/rep/InsufficientLogException.java create mode 100644 src/com/sleepycat/je/rep/InsufficientReplicasException.java create mode 100644 src/com/sleepycat/je/rep/LockPreemptedException.java create mode 100644 src/com/sleepycat/je/rep/LogFileRewriteListener.java create mode 100644 src/com/sleepycat/je/rep/LogOverwriteException.java create mode 100644 src/com/sleepycat/je/rep/MasterReplicaTransitionException.java create mode 100644 src/com/sleepycat/je/rep/MasterStateException.java create mode 100644 src/com/sleepycat/je/rep/MasterTransferFailureException.java create mode 100644 src/com/sleepycat/je/rep/MemberActiveException.java create mode 100644 src/com/sleepycat/je/rep/MemberNotFoundException.java create mode 100644 src/com/sleepycat/je/rep/NetworkRestore.java create mode 100644 src/com/sleepycat/je/rep/NetworkRestoreConfig.java create mode 100644 src/com/sleepycat/je/rep/NetworkRestoreConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/NoConsistencyRequiredPolicy.java create mode 100644 src/com/sleepycat/je/rep/NodeState.java create mode 100644 src/com/sleepycat/je/rep/NodeType.java create mode 100644 src/com/sleepycat/je/rep/QuorumPolicy.java create mode 100644 src/com/sleepycat/je/rep/RepInternal.java create mode 100644 src/com/sleepycat/je/rep/RepStatManager.java create mode 100644 src/com/sleepycat/je/rep/ReplicaConsistencyException.java create mode 100644 src/com/sleepycat/je/rep/ReplicaStateException.java create mode 100644 src/com/sleepycat/je/rep/ReplicaWriteException.java create mode 100644 src/com/sleepycat/je/rep/ReplicatedEnvironment.java create mode 100644 src/com/sleepycat/je/rep/ReplicatedEnvironmentStats.java create mode 100644 src/com/sleepycat/je/rep/ReplicationBasicConfig.java create mode 100644 src/com/sleepycat/je/rep/ReplicationBasicConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/ReplicationConfig.java create mode 100644 src/com/sleepycat/je/rep/ReplicationConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/ReplicationGroup.java create mode 100644 src/com/sleepycat/je/rep/ReplicationMutableConfig.java create mode 100644 src/com/sleepycat/je/rep/ReplicationMutableConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/ReplicationNetworkConfig.java create mode 100644 src/com/sleepycat/je/rep/ReplicationNetworkConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/ReplicationNode.java create mode 100644 src/com/sleepycat/je/rep/ReplicationSSLConfig.java create mode 100644 src/com/sleepycat/je/rep/ReplicationSSLConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/ReplicationSecurityException.java create mode 100644 src/com/sleepycat/je/rep/RestartRequiredException.java create mode 100644 src/com/sleepycat/je/rep/RollbackException.java create mode 100644 src/com/sleepycat/je/rep/RollbackProhibitedException.java create mode 100644 src/com/sleepycat/je/rep/StateChangeEvent.java create mode 100644 src/com/sleepycat/je/rep/StateChangeException.java create mode 100644 src/com/sleepycat/je/rep/StateChangeListener.java create mode 100644 src/com/sleepycat/je/rep/SyncupProgress.java create mode 100644 src/com/sleepycat/je/rep/TimeConsistencyPolicy.java create mode 100644 src/com/sleepycat/je/rep/UnknownMasterException.java create mode 100644 src/com/sleepycat/je/rep/arbiter/Arbiter.java create mode 100644 src/com/sleepycat/je/rep/arbiter/ArbiterConfig.java create mode 100644 src/com/sleepycat/je/rep/arbiter/ArbiterMutableConfig.java create mode 100644 src/com/sleepycat/je/rep/arbiter/ArbiterStats.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbBinaryStateService.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbiterAcker.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbiterImpl.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbiterNodeStateService.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbiterOutputThread.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbiterStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/ArbiterVLSNTracker.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/MonitorEventManager.java create mode 100644 src/com/sleepycat/je/rep/arbiter/impl/package-info.java create mode 100644 src/com/sleepycat/je/rep/arbiter/package.html create mode 100644 src/com/sleepycat/je/rep/arbitration/Arbiter.java create mode 100644 src/com/sleepycat/je/rep/arbitration/ArbiterProvider.java create mode 100644 src/com/sleepycat/je/rep/arbitration/DesignatedPrimaryProvider.java create mode 100644 src/com/sleepycat/je/rep/arbitration/package-info.java create mode 100644 src/com/sleepycat/je/rep/elections/Acceptor.java create mode 100644 src/com/sleepycat/je/rep/elections/ElectionAgentThread.java create mode 100644 src/com/sleepycat/je/rep/elections/Elections.java create mode 100644 src/com/sleepycat/je/rep/elections/ElectionsConfig.java create mode 100644 src/com/sleepycat/je/rep/elections/Learner.java create mode 100644 src/com/sleepycat/je/rep/elections/MasterValue.java create mode 100644 src/com/sleepycat/je/rep/elections/Proposer.java create mode 100644 src/com/sleepycat/je/rep/elections/ProposerStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/elections/Protocol.java create mode 100644 src/com/sleepycat/je/rep/elections/RankingProposer.java create mode 100644 src/com/sleepycat/je/rep/elections/TimebasedProposalGenerator.java create mode 100644 src/com/sleepycat/je/rep/elections/Utils.java create mode 100644 src/com/sleepycat/je/rep/elections/package-info.java create mode 100644 src/com/sleepycat/je/rep/impl/BinaryNodeStateProtocol.java create mode 100644 src/com/sleepycat/je/rep/impl/BinaryNodeStateService.java create mode 100644 src/com/sleepycat/je/rep/impl/EnumConfigParam.java create mode 100644 src/com/sleepycat/je/rep/impl/GroupService.java create mode 100644 src/com/sleepycat/je/rep/impl/MinJEVersionUnsupportedException.java create mode 100644 src/com/sleepycat/je/rep/impl/NodeStateProtocol.java create mode 100644 src/com/sleepycat/je/rep/impl/NodeStateService.java create mode 100644 src/com/sleepycat/je/rep/impl/PointConsistencyPolicy.java create mode 100644 src/com/sleepycat/je/rep/impl/RepConfigManager.java create mode 100644 src/com/sleepycat/je/rep/impl/RepEnvConfigObserver.java create mode 100644 src/com/sleepycat/je/rep/impl/RepGroupDB.java create mode 100644 src/com/sleepycat/je/rep/impl/RepGroupImpl.java create mode 100644 src/com/sleepycat/je/rep/impl/RepGroupProtocol.java create mode 100644 src/com/sleepycat/je/rep/impl/RepImpl.java create mode 100644 src/com/sleepycat/je/rep/impl/RepImplStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/impl/RepNodeImpl.java create mode 100644 src/com/sleepycat/je/rep/impl/RepParams.java create mode 100644 src/com/sleepycat/je/rep/impl/TextProtocol.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/FeederManager.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/LogFileFeeder.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/NetworkBackup.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/NetworkBackupStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/NetworkBackupStats.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/Protocol.java create mode 100644 src/com/sleepycat/je/rep/impl/networkRestore/package-info.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ChannelTimeoutTask.java create mode 100644 src/com/sleepycat/je/rep/impl/node/CommitFreezeLatch.java create mode 100644 src/com/sleepycat/je/rep/impl/node/DbCache.java create mode 100644 src/com/sleepycat/je/rep/impl/node/DurabilityQuorum.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ElectionQuorum.java create mode 100644 src/com/sleepycat/je/rep/impl/node/Feeder.java create mode 100644 src/com/sleepycat/je/rep/impl/node/FeederManager.java create mode 100644 src/com/sleepycat/je/rep/impl/node/FeederManagerStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/impl/node/JoinGroupTimeouts.java create mode 100644 src/com/sleepycat/je/rep/impl/node/MasterTransfer.java create mode 100644 src/com/sleepycat/je/rep/impl/node/MonitorEventManager.java create mode 100644 src/com/sleepycat/je/rep/impl/node/NameIdPair.java create mode 100644 src/com/sleepycat/je/rep/impl/node/NodeState.java create mode 100644 src/com/sleepycat/je/rep/impl/node/RepNode.java create mode 100644 src/com/sleepycat/je/rep/impl/node/Replay.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ReplayStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/impl/node/Replica.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ReplicaFactory.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ReplicaOutputThread.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ReplicaOutputThreadBase.java create mode 100644 src/com/sleepycat/je/rep/impl/node/ReplicaStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/impl/node/cbvlsn/CleanerBarrierState.java create mode 100644 src/com/sleepycat/je/rep/impl/node/cbvlsn/GlobalCBVLSN.java create mode 100644 src/com/sleepycat/je/rep/impl/node/cbvlsn/LocalCBVLSNTracker.java create mode 100644 src/com/sleepycat/je/rep/impl/node/cbvlsn/LocalCBVLSNUpdater.java create mode 100644 src/com/sleepycat/je/rep/impl/node/cbvlsn/package-info.java create mode 100644 src/com/sleepycat/je/rep/impl/node/package-info.java create mode 100644 src/com/sleepycat/je/rep/impl/package-info.java create mode 100644 src/com/sleepycat/je/rep/jmx/RepJEDiagnostics.java create mode 100644 src/com/sleepycat/je/rep/jmx/RepJEMonitor.java create mode 100644 src/com/sleepycat/je/rep/jmx/package-info.java create mode 100644 src/com/sleepycat/je/rep/jmx/plugin/RepJEStats.java create mode 100644 src/com/sleepycat/je/rep/jmx/plugin/RepJEStatsPlugin.java create mode 100644 src/com/sleepycat/je/rep/jmx/plugin/package-info.java create mode 100644 src/com/sleepycat/je/rep/jmx/plugin/services/com.sun.tools.jconsole.JConsolePlugin create mode 100644 src/com/sleepycat/je/rep/monitor/GroupChangeEvent.java create mode 100644 src/com/sleepycat/je/rep/monitor/JoinGroupEvent.java create mode 100644 src/com/sleepycat/je/rep/monitor/LeaveGroupEvent.java create mode 100644 src/com/sleepycat/je/rep/monitor/MemberChangeEvent.java create mode 100644 src/com/sleepycat/je/rep/monitor/Monitor.java create mode 100644 src/com/sleepycat/je/rep/monitor/MonitorChangeEvent.java create mode 100644 src/com/sleepycat/je/rep/monitor/MonitorChangeListener.java create mode 100644 src/com/sleepycat/je/rep/monitor/MonitorConfig.java create mode 100644 src/com/sleepycat/je/rep/monitor/MonitorConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/monitor/MonitorService.java create mode 100644 src/com/sleepycat/je/rep/monitor/NewMasterEvent.java create mode 100644 src/com/sleepycat/je/rep/monitor/Protocol.java create mode 100644 src/com/sleepycat/je/rep/monitor/package.html create mode 100644 src/com/sleepycat/je/rep/net/DataChannel.java create mode 100644 src/com/sleepycat/je/rep/net/DataChannelFactory.java create mode 100644 src/com/sleepycat/je/rep/net/InstanceContext.java create mode 100644 src/com/sleepycat/je/rep/net/InstanceLogger.java create mode 100644 src/com/sleepycat/je/rep/net/InstanceParams.java create mode 100644 src/com/sleepycat/je/rep/net/LoggerFactory.java create mode 100644 src/com/sleepycat/je/rep/net/PasswordSource.java create mode 100644 src/com/sleepycat/je/rep/net/SSLAuthenticator.java create mode 100644 src/com/sleepycat/je/rep/net/package.html create mode 100644 src/com/sleepycat/je/rep/package.html create mode 100644 src/com/sleepycat/je/rep/stream/ArbiterFeederSource.java create mode 100644 src/com/sleepycat/je/rep/stream/ArbiterFeederStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/stream/BaseProtocol.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederFilter.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederReader.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederReplicaHandshake.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederReplicaSyncup.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederSource.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederSyncupReader.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederTxnStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/stream/FeederTxns.java create mode 100644 src/com/sleepycat/je/rep/stream/InputWireRecord.java create mode 100644 src/com/sleepycat/je/rep/stream/MasterChangeListener.java create mode 100644 src/com/sleepycat/je/rep/stream/MasterFeederSource.java create mode 100644 src/com/sleepycat/je/rep/stream/MasterStatus.java create mode 100644 src/com/sleepycat/je/rep/stream/MasterSuggestionGenerator.java create mode 100644 src/com/sleepycat/je/rep/stream/MatchpointSearchResults.java create mode 100644 src/com/sleepycat/je/rep/stream/OutputWireRecord.java create mode 100644 src/com/sleepycat/je/rep/stream/Protocol.java create mode 100644 src/com/sleepycat/je/rep/stream/ReplicaFeederHandshake.java create mode 100644 src/com/sleepycat/je/rep/stream/ReplicaFeederHandshakeConfig.java create mode 100644 src/com/sleepycat/je/rep/stream/ReplicaFeederSyncup.java create mode 100644 src/com/sleepycat/je/rep/stream/ReplicaSyncupReader.java create mode 100644 src/com/sleepycat/je/rep/stream/SubscriberFeederSyncup.java create mode 100644 src/com/sleepycat/je/rep/stream/VLSNReader.java create mode 100644 src/com/sleepycat/je/rep/stream/WireRecord.java create mode 100644 src/com/sleepycat/je/rep/stream/package-info.java create mode 100644 src/com/sleepycat/je/rep/subscription/ClientAuthMethod.java create mode 100644 src/com/sleepycat/je/rep/subscription/ServerAuthMethod.java create mode 100644 src/com/sleepycat/je/rep/subscription/StreamAuthenticator.java create mode 100644 src/com/sleepycat/je/rep/subscription/Subscription.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionAuthHandler.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionCallback.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionConfig.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionOutputThread.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionProcessMessageThread.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionStat.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionStatus.java create mode 100644 src/com/sleepycat/je/rep/subscription/SubscriptionThread.java create mode 100644 src/com/sleepycat/je/rep/subscription/package-info.java create mode 100644 src/com/sleepycat/je/rep/txn/MasterThreadLocker.java create mode 100644 src/com/sleepycat/je/rep/txn/MasterTxn.java create mode 100644 src/com/sleepycat/je/rep/txn/ReadonlyTxn.java create mode 100644 src/com/sleepycat/je/rep/txn/ReplayTxn.java create mode 100644 src/com/sleepycat/je/rep/txn/ReplicaThreadLocker.java create mode 100644 src/com/sleepycat/je/rep/txn/package-info.java create mode 100644 src/com/sleepycat/je/rep/util/AtomicLongMax.java create mode 100644 src/com/sleepycat/je/rep/util/DbEnableReplication.java create mode 100644 src/com/sleepycat/je/rep/util/DbGroupAdmin.java create mode 100644 src/com/sleepycat/je/rep/util/DbPing.java create mode 100644 src/com/sleepycat/je/rep/util/DbResetRepGroup.java create mode 100644 src/com/sleepycat/je/rep/util/ReplicationGroupAdmin.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/Block.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/BlockBag.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/DiffRecordAnalyzer.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/DiffTracker.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/LDiff.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/LDiffConfig.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/LDiffConfigBeanInfo.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/LDiffRecordRequestException.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/LDiffService.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/LDiffUtil.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/MismatchedRegion.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/Protocol.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/Record.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/Window.java create mode 100644 src/com/sleepycat/je/rep/util/ldiff/package-info.java create mode 100644 src/com/sleepycat/je/rep/util/package.html create mode 100644 src/com/sleepycat/je/rep/utilint/BinaryProtocol.java create mode 100644 src/com/sleepycat/je/rep/utilint/BinaryProtocolStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbCacheSizeRepEnv.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbDumpGroup.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbFeederPrintLog.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbNullNode.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbRepRunAction.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbStreamVerify.java create mode 100644 src/com/sleepycat/je/rep/utilint/DbSync.java create mode 100644 src/com/sleepycat/je/rep/utilint/FreePortLocator.java create mode 100644 src/com/sleepycat/je/rep/utilint/HostPortPair.java create mode 100644 src/com/sleepycat/je/rep/utilint/IntRunningTotalStat.java create mode 100644 src/com/sleepycat/je/rep/utilint/LongMinZeroStat.java create mode 100644 src/com/sleepycat/je/rep/utilint/NamedChannel.java create mode 100644 src/com/sleepycat/je/rep/utilint/NamedChannelWithTimeout.java create mode 100644 src/com/sleepycat/je/rep/utilint/RepUtils.java create mode 100644 src/com/sleepycat/je/rep/utilint/ReplicationFormatter.java create mode 100644 src/com/sleepycat/je/rep/utilint/ServiceDispatcher.java create mode 100644 src/com/sleepycat/je/rep/utilint/ServiceHandshake.java create mode 100644 src/com/sleepycat/je/rep/utilint/SimpleTxnMap.java create mode 100644 src/com/sleepycat/je/rep/utilint/SizeAwaitMap.java create mode 100644 src/com/sleepycat/je/rep/utilint/SizeAwaitMapStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/utilint/StatCaptureRepDefinitions.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/AbstractDataChannel.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/AliasKeyManager.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/DataChannelFactoryBuilder.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLChannelFactory.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLDNAuthenticator.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLDNHostVerifier.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLDNMatcher.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLDataChannel.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLMirrorAuthenticator.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLMirrorHostVerifier.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLMirrorMatcher.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SSLStdHostVerifier.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SimpleChannelFactory.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/SimpleDataChannel.java create mode 100644 src/com/sleepycat/je/rep/utilint/net/package-info.java create mode 100644 src/com/sleepycat/je/rep/utilint/package-info.java create mode 100644 src/com/sleepycat/je/rep/vlsn/GhostBucket.java create mode 100644 src/com/sleepycat/je/rep/vlsn/LogItemCache.java create mode 100644 src/com/sleepycat/je/rep/vlsn/VLSNBucket.java create mode 100644 src/com/sleepycat/je/rep/vlsn/VLSNIndex.java create mode 100644 src/com/sleepycat/je/rep/vlsn/VLSNIndexStatDefinition.java create mode 100644 src/com/sleepycat/je/rep/vlsn/VLSNRange.java create mode 100644 src/com/sleepycat/je/rep/vlsn/VLSNRecoveryTracker.java create mode 100644 src/com/sleepycat/je/rep/vlsn/VLSNTracker.java create mode 100644 src/com/sleepycat/je/rep/vlsn/package-info.java create mode 100644 src/com/sleepycat/je/statcap/EnvStatsLogger.java create mode 100644 src/com/sleepycat/je/statcap/JvmStats.java create mode 100644 src/com/sleepycat/je/statcap/StatCapture.java create mode 100644 src/com/sleepycat/je/statcap/StatCaptureDefinitions.java create mode 100644 src/com/sleepycat/je/statcap/StatManager.java create mode 100644 src/com/sleepycat/je/statcap/StatUtils.java create mode 100644 src/com/sleepycat/je/statcap/package-info.java create mode 100644 src/com/sleepycat/je/tree/BIN.java create mode 100644 src/com/sleepycat/je/tree/BINBoundary.java create mode 100644 src/com/sleepycat/je/tree/BINDeltaBloomFilter.java create mode 100644 src/com/sleepycat/je/tree/BINReference.java create mode 100644 src/com/sleepycat/je/tree/ChildReference.java create mode 100644 src/com/sleepycat/je/tree/CountEstimator.java create mode 100644 src/com/sleepycat/je/tree/CursorsExistException.java create mode 100644 src/com/sleepycat/je/tree/DeltaInfo.java create mode 100644 src/com/sleepycat/je/tree/EntryStates.java create mode 100644 src/com/sleepycat/je/tree/FileSummaryLN.java create mode 100644 src/com/sleepycat/je/tree/IN.java create mode 100644 src/com/sleepycat/je/tree/INArrayRep.java create mode 100644 src/com/sleepycat/je/tree/INKeyRep.java create mode 100644 src/com/sleepycat/je/tree/INLongRep.java create mode 100644 src/com/sleepycat/je/tree/INTargetRep.java create mode 100644 src/com/sleepycat/je/tree/Key.java create mode 100644 src/com/sleepycat/je/tree/LN.java create mode 100644 src/com/sleepycat/je/tree/MapLN.java create mode 100644 src/com/sleepycat/je/tree/NameLN.java create mode 100644 src/com/sleepycat/je/tree/Node.java create mode 100644 src/com/sleepycat/je/tree/NodeNotEmptyException.java create mode 100644 src/com/sleepycat/je/tree/OldBINDelta.java create mode 100644 src/com/sleepycat/je/tree/SearchResult.java create mode 100644 src/com/sleepycat/je/tree/SplitRequiredException.java create mode 100644 src/com/sleepycat/je/tree/StorageSize.java create mode 100644 src/com/sleepycat/je/tree/TrackingInfo.java create mode 100644 src/com/sleepycat/je/tree/Tree.java create mode 100644 src/com/sleepycat/je/tree/TreeLocation.java create mode 100644 src/com/sleepycat/je/tree/TreeUtils.java create mode 100644 src/com/sleepycat/je/tree/TreeWalkerStatsAccumulator.java create mode 100644 src/com/sleepycat/je/tree/VersionedLN.java create mode 100644 src/com/sleepycat/je/tree/WithRootLatched.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/DBIN.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/DIN.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/DupConvert.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/DupCountLN.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/INDeleteInfo.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/INDupDeleteInfo.java create mode 100644 src/com/sleepycat/je/tree/dupConvert/package-info.java create mode 100644 src/com/sleepycat/je/tree/package-info.java create mode 100644 src/com/sleepycat/je/trigger/PersistentTrigger.java create mode 100644 src/com/sleepycat/je/trigger/ReplicatedDatabaseTrigger.java create mode 100644 src/com/sleepycat/je/trigger/TransactionTrigger.java create mode 100644 src/com/sleepycat/je/trigger/Trigger.java create mode 100644 src/com/sleepycat/je/trigger/package.html create mode 100644 src/com/sleepycat/je/txn/BasicLocker.java create mode 100644 src/com/sleepycat/je/txn/BuddyLocker.java create mode 100644 src/com/sleepycat/je/txn/DummyLockManager.java create mode 100644 src/com/sleepycat/je/txn/HandleLocker.java create mode 100644 src/com/sleepycat/je/txn/Lock.java create mode 100644 src/com/sleepycat/je/txn/LockAttemptResult.java create mode 100644 src/com/sleepycat/je/txn/LockConflict.java create mode 100644 src/com/sleepycat/je/txn/LockGrantType.java create mode 100644 src/com/sleepycat/je/txn/LockImpl.java create mode 100644 src/com/sleepycat/je/txn/LockInfo.java create mode 100644 src/com/sleepycat/je/txn/LockManager.java create mode 100644 src/com/sleepycat/je/txn/LockResult.java create mode 100644 src/com/sleepycat/je/txn/LockStatDefinition.java create mode 100644 src/com/sleepycat/je/txn/LockType.java create mode 100644 src/com/sleepycat/je/txn/LockUpgrade.java create mode 100644 src/com/sleepycat/je/txn/Locker.java create mode 100644 src/com/sleepycat/je/txn/LockerFactory.java create mode 100644 src/com/sleepycat/je/txn/PreparedTxn.java create mode 100644 src/com/sleepycat/je/txn/ReadCommittedLocker.java create mode 100644 src/com/sleepycat/je/txn/RollbackEnd.java create mode 100644 src/com/sleepycat/je/txn/RollbackStart.java create mode 100644 src/com/sleepycat/je/txn/SyncedLockManager.java create mode 100644 src/com/sleepycat/je/txn/ThinLockImpl.java create mode 100644 src/com/sleepycat/je/txn/ThreadLocker.java create mode 100644 src/com/sleepycat/je/txn/Txn.java create mode 100644 src/com/sleepycat/je/txn/TxnAbort.java create mode 100644 src/com/sleepycat/je/txn/TxnChain.java create mode 100644 src/com/sleepycat/je/txn/TxnCommit.java create mode 100644 src/com/sleepycat/je/txn/TxnEnd.java create mode 100644 src/com/sleepycat/je/txn/TxnManager.java create mode 100644 src/com/sleepycat/je/txn/TxnPrepare.java create mode 100644 src/com/sleepycat/je/txn/UndoReader.java create mode 100644 src/com/sleepycat/je/txn/VersionedWriteTxnEnd.java create mode 100644 src/com/sleepycat/je/txn/WriteLockInfo.java create mode 100644 src/com/sleepycat/je/txn/package-info.java create mode 100644 src/com/sleepycat/je/util/ConsoleHandler.java create mode 100644 src/com/sleepycat/je/util/DbBackup.java create mode 100644 src/com/sleepycat/je/util/DbCacheSize.java create mode 100644 src/com/sleepycat/je/util/DbDeleteReservedFiles.java create mode 100644 src/com/sleepycat/je/util/DbDump.java create mode 100644 src/com/sleepycat/je/util/DbFilterStats.java create mode 100644 src/com/sleepycat/je/util/DbLoad.java create mode 100644 src/com/sleepycat/je/util/DbPrintLog.java create mode 100644 src/com/sleepycat/je/util/DbRunAction.java create mode 100644 src/com/sleepycat/je/util/DbScavenger.java create mode 100644 src/com/sleepycat/je/util/DbSpace.java create mode 100644 src/com/sleepycat/je/util/DbStat.java create mode 100644 src/com/sleepycat/je/util/DbTruncateLog.java create mode 100644 src/com/sleepycat/je/util/DbVerify.java create mode 100644 src/com/sleepycat/je/util/DbVerifyLog.java create mode 100644 src/com/sleepycat/je/util/FileHandler.java create mode 100644 src/com/sleepycat/je/util/LogVerificationException.java create mode 100644 src/com/sleepycat/je/util/LogVerificationInputStream.java create mode 100644 src/com/sleepycat/je/util/LogVerificationReadableByteChannel.java create mode 100644 src/com/sleepycat/je/util/Splitter.java create mode 100644 src/com/sleepycat/je/util/package.html create mode 100644 src/com/sleepycat/je/util/verify/BtreeVerifier.java create mode 100644 src/com/sleepycat/je/util/verify/DataVerifier.java create mode 100644 src/com/sleepycat/je/util/verify/VerifierUtils.java create mode 100644 src/com/sleepycat/je/util/verify/package-info.java create mode 100644 src/com/sleepycat/je/utilint/ActiveTxnArrayStat.java create mode 100644 src/com/sleepycat/je/utilint/Adler32.java create mode 100644 src/com/sleepycat/je/utilint/AtomicIntStat.java create mode 100644 src/com/sleepycat/je/utilint/AtomicLongComponent.java create mode 100644 src/com/sleepycat/je/utilint/AtomicLongMapStat.java create mode 100644 src/com/sleepycat/je/utilint/AtomicLongStat.java create mode 100644 src/com/sleepycat/je/utilint/BaseStat.java create mode 100644 src/com/sleepycat/je/utilint/BitMap.java create mode 100644 src/com/sleepycat/je/utilint/BooleanStat.java create mode 100644 src/com/sleepycat/je/utilint/CmdUtil.java create mode 100644 src/com/sleepycat/je/utilint/CollectionUtils.java create mode 100644 src/com/sleepycat/je/utilint/ConfiguredRedirectHandler.java create mode 100644 src/com/sleepycat/je/utilint/ConsoleRedirectHandler.java create mode 100644 src/com/sleepycat/je/utilint/CronScheduleParser.java create mode 100644 src/com/sleepycat/je/utilint/DaemonRunner.java create mode 100644 src/com/sleepycat/je/utilint/DaemonThread.java create mode 100644 src/com/sleepycat/je/utilint/DatabaseUtil.java create mode 100644 src/com/sleepycat/je/utilint/DbCacheSizeRepEnv.java create mode 100644 src/com/sleepycat/je/utilint/DbLsn.java create mode 100644 src/com/sleepycat/je/utilint/DoubleExpMovingAvg.java create mode 100644 src/com/sleepycat/je/utilint/EventTrace.java create mode 100644 src/com/sleepycat/je/utilint/FileRedirectHandler.java create mode 100644 src/com/sleepycat/je/utilint/FileStoreInfo.java create mode 100644 src/com/sleepycat/je/utilint/FloatStat.java create mode 100644 src/com/sleepycat/je/utilint/FormatUtil.java create mode 100644 src/com/sleepycat/je/utilint/FormatterRedirectHandler.java create mode 100644 src/com/sleepycat/je/utilint/HexFormatter.java create mode 100644 src/com/sleepycat/je/utilint/IntStat.java create mode 100644 src/com/sleepycat/je/utilint/IntegralLongAvg.java create mode 100644 src/com/sleepycat/je/utilint/IntegralLongAvgStat.java create mode 100644 src/com/sleepycat/je/utilint/IntegralRateStat.java create mode 100644 src/com/sleepycat/je/utilint/InternalException.java create mode 100644 src/com/sleepycat/je/utilint/JVMSystemUtils.java create mode 100644 src/com/sleepycat/je/utilint/JarMain.java create mode 100644 src/com/sleepycat/je/utilint/Java7FileStoreInfo.java create mode 100644 src/com/sleepycat/je/utilint/LSNStat.java create mode 100644 src/com/sleepycat/je/utilint/LogVerifier.java create mode 100644 src/com/sleepycat/je/utilint/LoggerUtils.java create mode 100644 src/com/sleepycat/je/utilint/LongArrayStat.java create mode 100644 src/com/sleepycat/je/utilint/LongAvgRate.java create mode 100644 src/com/sleepycat/je/utilint/LongAvgRateMapStat.java create mode 100644 src/com/sleepycat/je/utilint/LongAvgRateStat.java create mode 100644 src/com/sleepycat/je/utilint/LongDiffMapStat.java create mode 100644 src/com/sleepycat/je/utilint/LongDiffStat.java create mode 100644 src/com/sleepycat/je/utilint/LongMaxStat.java create mode 100644 src/com/sleepycat/je/utilint/LongMaxZeroStat.java create mode 100644 src/com/sleepycat/je/utilint/LongMinStat.java create mode 100644 src/com/sleepycat/je/utilint/LongStat.java create mode 100644 src/com/sleepycat/je/utilint/MapStat.java create mode 100644 src/com/sleepycat/je/utilint/MapStatComponent.java create mode 100644 src/com/sleepycat/je/utilint/Matchpoint.java create mode 100644 src/com/sleepycat/je/utilint/NanoTimeUtil.java create mode 100644 src/com/sleepycat/je/utilint/NoClearAtomicLongStat.java create mode 100644 src/com/sleepycat/je/utilint/Pair.java create mode 100644 src/com/sleepycat/je/utilint/PollCondition.java create mode 100644 src/com/sleepycat/je/utilint/PropUtil.java create mode 100644 src/com/sleepycat/je/utilint/RelatchRequiredException.java create mode 100644 src/com/sleepycat/je/utilint/SizeofMarker.java create mode 100644 src/com/sleepycat/je/utilint/Stat.java create mode 100644 src/com/sleepycat/je/utilint/StatDefinition.java create mode 100644 src/com/sleepycat/je/utilint/StatGroup.java create mode 100644 src/com/sleepycat/je/utilint/StatsAccumulator.java create mode 100644 src/com/sleepycat/je/utilint/StoppableThread.java create mode 100644 src/com/sleepycat/je/utilint/StoppableThreadFactory.java create mode 100644 src/com/sleepycat/je/utilint/StringStat.java create mode 100644 src/com/sleepycat/je/utilint/TestHook.java create mode 100644 src/com/sleepycat/je/utilint/TestHookAdapter.java create mode 100644 src/com/sleepycat/je/utilint/TestHookExecute.java create mode 100644 src/com/sleepycat/je/utilint/Timestamp.java create mode 100644 src/com/sleepycat/je/utilint/TinyHashSet.java create mode 100644 src/com/sleepycat/je/utilint/TracerFormatter.java create mode 100644 src/com/sleepycat/je/utilint/VLSN.java create mode 100644 src/com/sleepycat/je/utilint/package-info.java create mode 100644 src/com/sleepycat/persist/BasicCursor.java create mode 100644 src/com/sleepycat/persist/BasicIndex.java create mode 100644 src/com/sleepycat/persist/BasicIterator.java create mode 100644 src/com/sleepycat/persist/DataValueAdapter.java create mode 100644 src/com/sleepycat/persist/DatabaseNamer.java create mode 100644 src/com/sleepycat/persist/EntityCursor.java create mode 100644 src/com/sleepycat/persist/EntityIndex.java create mode 100644 src/com/sleepycat/persist/EntityJoin.java create mode 100644 src/com/sleepycat/persist/EntityResult.java create mode 100644 src/com/sleepycat/persist/EntityStore.java create mode 100644 src/com/sleepycat/persist/EntityValueAdapter.java create mode 100644 src/com/sleepycat/persist/ForwardCursor.java create mode 100644 src/com/sleepycat/persist/IndexNotAvailableException.java create mode 100644 src/com/sleepycat/persist/KeySelector.java create mode 100644 src/com/sleepycat/persist/KeyValueAdapter.java create mode 100644 src/com/sleepycat/persist/KeysIndex.java create mode 100644 src/com/sleepycat/persist/PrimaryIndex.java create mode 100644 src/com/sleepycat/persist/PrimaryKeyValueAdapter.java create mode 100644 src/com/sleepycat/persist/SecondaryIndex.java create mode 100644 src/com/sleepycat/persist/StoreConfig.java create mode 100644 src/com/sleepycat/persist/StoreConfigBeanInfo.java create mode 100644 src/com/sleepycat/persist/StoreExistsException.java create mode 100644 src/com/sleepycat/persist/StoreNotFoundException.java create mode 100644 src/com/sleepycat/persist/SubIndex.java create mode 100644 src/com/sleepycat/persist/SubIndexCursor.java create mode 100644 src/com/sleepycat/persist/ValueAdapter.java create mode 100644 src/com/sleepycat/persist/evolve/Conversion.java create mode 100644 src/com/sleepycat/persist/evolve/Converter.java create mode 100644 src/com/sleepycat/persist/evolve/DeletedClassException.java create mode 100644 src/com/sleepycat/persist/evolve/Deleter.java create mode 100644 src/com/sleepycat/persist/evolve/EntityConverter.java create mode 100644 src/com/sleepycat/persist/evolve/EvolveConfig.java create mode 100644 src/com/sleepycat/persist/evolve/EvolveConfigBeanInfo.java create mode 100644 src/com/sleepycat/persist/evolve/EvolveEvent.java create mode 100644 src/com/sleepycat/persist/evolve/EvolveInternal.java create mode 100644 src/com/sleepycat/persist/evolve/EvolveListener.java create mode 100644 src/com/sleepycat/persist/evolve/EvolveStats.java create mode 100644 src/com/sleepycat/persist/evolve/IncompatibleClassException.java create mode 100644 src/com/sleepycat/persist/evolve/Mutation.java create mode 100644 src/com/sleepycat/persist/evolve/Mutations.java create mode 100644 src/com/sleepycat/persist/evolve/Renamer.java create mode 100644 src/com/sleepycat/persist/evolve/package.html create mode 100644 src/com/sleepycat/persist/impl/AbstractInput.java create mode 100644 src/com/sleepycat/persist/impl/Accessor.java create mode 100644 src/com/sleepycat/persist/impl/Catalog.java create mode 100644 src/com/sleepycat/persist/impl/CollectionProxy.java create mode 100644 src/com/sleepycat/persist/impl/ComparatorCatalog.java create mode 100644 src/com/sleepycat/persist/impl/ComplexFormat.java create mode 100644 src/com/sleepycat/persist/impl/CompositeKeyFormat.java create mode 100644 src/com/sleepycat/persist/impl/ConverterReader.java create mode 100644 src/com/sleepycat/persist/impl/Enhanced.java create mode 100644 src/com/sleepycat/persist/impl/EnhancedAccessor.java create mode 100644 src/com/sleepycat/persist/impl/EntityInput.java create mode 100644 src/com/sleepycat/persist/impl/EntityOutput.java create mode 100644 src/com/sleepycat/persist/impl/EnumFormat.java create mode 100644 src/com/sleepycat/persist/impl/Evolver.java create mode 100644 src/com/sleepycat/persist/impl/FieldInfo.java create mode 100644 src/com/sleepycat/persist/impl/Format.java create mode 100644 src/com/sleepycat/persist/impl/KeyLocation.java create mode 100644 src/com/sleepycat/persist/impl/MapProxy.java create mode 100644 src/com/sleepycat/persist/impl/NonPersistentFormat.java create mode 100644 src/com/sleepycat/persist/impl/ObjectArrayFormat.java create mode 100644 src/com/sleepycat/persist/impl/PersistCatalog.java create mode 100644 src/com/sleepycat/persist/impl/PersistComparator.java create mode 100644 src/com/sleepycat/persist/impl/PersistEntityBinding.java create mode 100644 src/com/sleepycat/persist/impl/PersistKeyAssigner.java create mode 100644 src/com/sleepycat/persist/impl/PersistKeyBinding.java create mode 100644 src/com/sleepycat/persist/impl/PersistKeyCreator.java create mode 100644 src/com/sleepycat/persist/impl/PrimitiveArrayFormat.java create mode 100644 src/com/sleepycat/persist/impl/ProxiedFormat.java create mode 100644 src/com/sleepycat/persist/impl/RawAbstractInput.java create mode 100644 src/com/sleepycat/persist/impl/RawAccessor.java create mode 100644 src/com/sleepycat/persist/impl/RawArrayInput.java create mode 100644 src/com/sleepycat/persist/impl/RawComplexInput.java create mode 100644 src/com/sleepycat/persist/impl/RawSingleInput.java create mode 100644 src/com/sleepycat/persist/impl/ReadOnlyCatalog.java create mode 100644 src/com/sleepycat/persist/impl/Reader.java create mode 100644 src/com/sleepycat/persist/impl/RecordInput.java create mode 100644 src/com/sleepycat/persist/impl/RecordOutput.java create mode 100644 src/com/sleepycat/persist/impl/ReflectionAccessor.java create mode 100644 src/com/sleepycat/persist/impl/RefreshException.java create mode 100644 src/com/sleepycat/persist/impl/SimpleCatalog.java create mode 100644 src/com/sleepycat/persist/impl/SimpleFormat.java create mode 100644 src/com/sleepycat/persist/impl/Store.java create mode 100644 src/com/sleepycat/persist/impl/StoredModel.java create mode 100644 src/com/sleepycat/persist/impl/WidenerInput.java create mode 100644 src/com/sleepycat/persist/impl/package-info.java create mode 100644 src/com/sleepycat/persist/model/AnnotationModel.java create mode 100644 src/com/sleepycat/persist/model/BytecodeEnhancer.java create mode 100644 src/com/sleepycat/persist/model/ClassEnhancer.java create mode 100644 src/com/sleepycat/persist/model/ClassEnhancerTask.java create mode 100644 src/com/sleepycat/persist/model/ClassMetadata.java create mode 100644 src/com/sleepycat/persist/model/DeleteAction.java create mode 100644 src/com/sleepycat/persist/model/Entity.java create mode 100644 src/com/sleepycat/persist/model/EntityMetadata.java create mode 100644 src/com/sleepycat/persist/model/EntityModel.java create mode 100644 src/com/sleepycat/persist/model/FieldMetadata.java create mode 100644 src/com/sleepycat/persist/model/KeyField.java create mode 100644 src/com/sleepycat/persist/model/ModelInternal.java create mode 100644 src/com/sleepycat/persist/model/NotPersistent.java create mode 100644 src/com/sleepycat/persist/model/NotTransient.java create mode 100644 src/com/sleepycat/persist/model/Persistent.java create mode 100644 src/com/sleepycat/persist/model/PersistentProxy.java create mode 100644 src/com/sleepycat/persist/model/PrimaryKey.java create mode 100644 src/com/sleepycat/persist/model/PrimaryKeyMetadata.java create mode 100644 src/com/sleepycat/persist/model/Relationship.java create mode 100644 src/com/sleepycat/persist/model/SecondaryKey.java create mode 100644 src/com/sleepycat/persist/model/SecondaryKeyMetadata.java create mode 100644 src/com/sleepycat/persist/model/package.html create mode 100644 src/com/sleepycat/persist/package.html create mode 100644 src/com/sleepycat/persist/raw/RawField.java create mode 100644 src/com/sleepycat/persist/raw/RawObject.java create mode 100644 src/com/sleepycat/persist/raw/RawStore.java create mode 100644 src/com/sleepycat/persist/raw/RawType.java create mode 100644 src/com/sleepycat/persist/raw/package.html create mode 100644 src/com/sleepycat/util/ClassResolver.java create mode 100644 src/com/sleepycat/util/ConfigBeanInfoBase.java create mode 100644 src/com/sleepycat/util/ExceptionUnwrapper.java create mode 100644 src/com/sleepycat/util/ExceptionWrapper.java create mode 100644 src/com/sleepycat/util/FastInputStream.java create mode 100644 src/com/sleepycat/util/FastOutputStream.java create mode 100644 src/com/sleepycat/util/IOExceptionWrapper.java create mode 100644 src/com/sleepycat/util/PackedInteger.java create mode 100644 src/com/sleepycat/util/RuntimeExceptionWrapper.java create mode 100644 src/com/sleepycat/util/UtfOps.java create mode 100644 src/com/sleepycat/util/keyrange/KeyRange.java create mode 100644 src/com/sleepycat/util/keyrange/KeyRangeException.java create mode 100644 src/com/sleepycat/util/keyrange/RangeCursor.java create mode 100644 src/com/sleepycat/util/keyrange/package-info.java create mode 100644 src/com/sleepycat/util/package.html create mode 100644 src/com/sleepycat/utilint/ActivityCounter.java create mode 100644 src/com/sleepycat/utilint/Latency.java create mode 100644 src/com/sleepycat/utilint/LatencyStat.java create mode 100644 src/com/sleepycat/utilint/StatLogger.java create mode 100644 src/com/sleepycat/utilint/StatsTracker.java create mode 100644 src/com/sleepycat/utilint/StringUtils.java create mode 100644 src/com/sleepycat/utilint/package-info.java create mode 100644 test/com/sleepycat/bind/serial/test/MarshalledObject.java create mode 100644 test/com/sleepycat/bind/serial/test/NullClassCatalog.java create mode 100644 test/com/sleepycat/bind/serial/test/SerialBindingTest.java create mode 100644 test/com/sleepycat/bind/serial/test/TestClassCatalog.java create mode 100644 test/com/sleepycat/bind/test/BindingSpeedTest.java create mode 100644 test/com/sleepycat/bind/tuple/test/MarshalledObject.java create mode 100644 test/com/sleepycat/bind/tuple/test/TupleBindingTest.java create mode 100644 test/com/sleepycat/bind/tuple/test/TupleFormatTest.java create mode 100644 test/com/sleepycat/bind/tuple/test/TupleOrderingTest.java create mode 100644 test/com/sleepycat/collections/KeyRangeTest.java create mode 100644 test/com/sleepycat/collections/test/CollectionTest.java create mode 100644 test/com/sleepycat/collections/test/ForeignKeyTest.java create mode 100644 test/com/sleepycat/collections/test/IterDeadlockTest.java create mode 100644 test/com/sleepycat/collections/test/IterRepositionTest.java create mode 100644 test/com/sleepycat/collections/test/JoinTest.java create mode 100644 test/com/sleepycat/collections/test/NullTransactionRunner.java create mode 100644 test/com/sleepycat/collections/test/NullValueTest.java create mode 100644 test/com/sleepycat/collections/test/SecondaryDeadlockTest.java create mode 100644 test/com/sleepycat/collections/test/TestDataBinding.java create mode 100644 test/com/sleepycat/collections/test/TestEntity.java create mode 100644 test/com/sleepycat/collections/test/TestEntityBinding.java create mode 100644 test/com/sleepycat/collections/test/TestKeyAssigner.java create mode 100644 test/com/sleepycat/collections/test/TestKeyCreator.java create mode 100644 test/com/sleepycat/collections/test/TestSR15721.java create mode 100644 test/com/sleepycat/collections/test/TestStore.java create mode 100644 test/com/sleepycat/collections/test/TransactionTest.java create mode 100644 test/com/sleepycat/collections/test/XACollectionTest.java create mode 100644 test/com/sleepycat/collections/test/serial/CatalogCornerCaseTest.java create mode 100644 test/com/sleepycat/collections/test/serial/StoredClassCatalogTest.java create mode 100644 test/com/sleepycat/collections/test/serial/StoredClassCatalogTestInit.java create mode 100644 test/com/sleepycat/collections/test/serial/TestSerial.java create mode 100644 test/com/sleepycat/collections/test/serial/TestSerial.java.original create mode 100644 test/com/sleepycat/collections/test/serial/TupleSerialFactoryTest.java create mode 100644 test/com/sleepycat/je/ApiTest.java create mode 100644 test/com/sleepycat/je/ClassLoaderTest.java create mode 100644 test/com/sleepycat/je/ConfigBeanInfoTest.java create mode 100644 test/com/sleepycat/je/CursorEdgeTest.java create mode 100644 test/com/sleepycat/je/CursorTest.java create mode 100644 test/com/sleepycat/je/DatabaseComparatorsTest.java create mode 100644 test/com/sleepycat/je/DatabaseConfigTest.java create mode 100644 test/com/sleepycat/je/DatabaseEntryTest.java create mode 100644 test/com/sleepycat/je/DatabaseTest.java create mode 100644 test/com/sleepycat/je/DbHandleLockTest.java create mode 100644 test/com/sleepycat/je/DbTestProxy.java create mode 100644 test/com/sleepycat/je/DirtyReadTest.java create mode 100644 test/com/sleepycat/je/DupSlotReuseTest.java create mode 100644 test/com/sleepycat/je/EnvMultiSubDirTest.java create mode 100644 test/com/sleepycat/je/EnvironmentConfigTest.java create mode 100644 test/com/sleepycat/je/EnvironmentStatTest.java create mode 100644 test/com/sleepycat/je/EnvironmentTest.java create mode 100644 test/com/sleepycat/je/GetSearchBothRangeTest.java create mode 100644 test/com/sleepycat/je/InterruptTest.java create mode 100644 test/com/sleepycat/je/LoadedClassImpl.java.original create mode 100644 test/com/sleepycat/je/MultiProcessWriteTest.java create mode 100644 test/com/sleepycat/je/ReadCommittedTest.java create mode 100644 test/com/sleepycat/je/RunRecoveryFailureTest.java create mode 100644 test/com/sleepycat/je/StatCaptureTest.java create mode 100644 test/com/sleepycat/je/TruncateTest.java create mode 100644 test/com/sleepycat/je/cleaner/BackgroundIOTest.java create mode 100644 test/com/sleepycat/je/cleaner/CleanerTest.java create mode 100644 test/com/sleepycat/je/cleaner/CleanerTestBase.java create mode 100644 test/com/sleepycat/je/cleaner/CleanerTestUtils.java create mode 100644 test/com/sleepycat/je/cleaner/DiskLimitTest.java create mode 100644 test/com/sleepycat/je/cleaner/FileProtectorTest.java create mode 100644 test/com/sleepycat/je/cleaner/FileSelectionTest.java create mode 100644 test/com/sleepycat/je/cleaner/INUtilizationTest.java create mode 100644 test/com/sleepycat/je/cleaner/MakeMigrationLogFiles.java create mode 100644 test/com/sleepycat/je/cleaner/OffsetTest.java create mode 100644 test/com/sleepycat/je/cleaner/RMWLockingTest.java create mode 100644 test/com/sleepycat/je/cleaner/ReadOnlyLockingTest.java create mode 100644 test/com/sleepycat/je/cleaner/ReadOnlyProcess.java create mode 100644 test/com/sleepycat/je/cleaner/SR10553Test.java create mode 100644 test/com/sleepycat/je/cleaner/SR10597Test.java create mode 100644 test/com/sleepycat/je/cleaner/SR12885Test.java create mode 100644 test/com/sleepycat/je/cleaner/SR12978Test.java create mode 100644 test/com/sleepycat/je/cleaner/SR13061Test.java create mode 100644 test/com/sleepycat/je/cleaner/SR18567Test.java create mode 100644 test/com/sleepycat/je/cleaner/TTLCleaningTest.java create mode 100644 test/com/sleepycat/je/cleaner/TruncateAndRemoveTest.java create mode 100644 test/com/sleepycat/je/cleaner/UtilizationTest.java create mode 100644 test/com/sleepycat/je/cleaner/WakeupTest.java create mode 100644 test/com/sleepycat/je/cleaner/migrate_f0.jdb create mode 100644 test/com/sleepycat/je/cleaner/migrate_f1.jdb create mode 100644 test/com/sleepycat/je/cleaner/rmw_bad_offsets.jdb create mode 100644 test/com/sleepycat/je/config/EnvironmentParamsTest.java create mode 100644 test/com/sleepycat/je/dbi/BINDeltaOperationTest.java create mode 100644 test/com/sleepycat/je/dbi/BINDeltaOpsTest.java create mode 100644 test/com/sleepycat/je/dbi/CodeCoverageTest.java create mode 100644 test/com/sleepycat/je/dbi/CompressedOopsDetectorTest.java create mode 100644 test/com/sleepycat/je/dbi/DbConfigManagerTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorDeleteTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorDupTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorDuplicateDeleteTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorDuplicateTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorDuplicateValidationTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorSearchTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorTest.java create mode 100644 test/com/sleepycat/je/dbi/DbCursorTestBase.java create mode 100644 test/com/sleepycat/je/dbi/DbEnvPoolTest.java create mode 100644 test/com/sleepycat/je/dbi/DbTreeTest.java create mode 100644 test/com/sleepycat/je/dbi/DeleteUpdateWithoutReadTest.java create mode 100644 test/com/sleepycat/je/dbi/DiskOrderedScanTest.java create mode 100644 test/com/sleepycat/je/dbi/DuplicateEntryException.java create mode 100644 test/com/sleepycat/je/dbi/EmbeddedOpsTest.java create mode 100644 test/com/sleepycat/je/dbi/INListTest.java create mode 100644 test/com/sleepycat/je/dbi/MemoryBudgetTest.java create mode 100644 test/com/sleepycat/je/dbi/NullCursor.java create mode 100644 test/com/sleepycat/je/dbi/SR12641.java create mode 100644 test/com/sleepycat/je/dbi/SortedLSNTreeWalkerTest.java create mode 100644 test/com/sleepycat/je/dbi/StartupTrackerTest.java create mode 100644 test/com/sleepycat/je/dbi/UncontendedLockTest.java create mode 100644 test/com/sleepycat/je/evictor/BackgroundEvictionTest.java create mode 100644 test/com/sleepycat/je/evictor/CacheModeTest.java create mode 100644 test/com/sleepycat/je/evictor/EvictActionTest.java create mode 100644 test/com/sleepycat/je/evictor/EvictNNodesStatsTest.java create mode 100644 test/com/sleepycat/je/evictor/EvictSelectionTest.java create mode 100644 test/com/sleepycat/je/evictor/EvictionThreadPoolTest.java create mode 100644 test/com/sleepycat/je/evictor/LRUTest.java create mode 100644 test/com/sleepycat/je/evictor/MeasureOffHeapMemory.java create mode 100644 test/com/sleepycat/je/evictor/OffHeapAllocatorTest.java create mode 100644 test/com/sleepycat/je/evictor/OffHeapCacheTest.java create mode 100644 test/com/sleepycat/je/evictor/SharedCacheTest.java create mode 100644 test/com/sleepycat/je/incomp/EmptyBINTest.java create mode 100644 test/com/sleepycat/je/incomp/INCompressorTest.java create mode 100644 test/com/sleepycat/je/je.properties create mode 100644 test/com/sleepycat/je/jmx/JEApplicationMBean.java create mode 100644 test/com/sleepycat/je/jmx/JEDiagnosticsTest.java create mode 100644 test/com/sleepycat/je/jmx/JEMonitorTest.java create mode 100644 test/com/sleepycat/je/jmx/MBeanTest.java create mode 100644 test/com/sleepycat/je/jmx/MBeanTestUtils.java create mode 100644 test/com/sleepycat/je/junit/JUnitMethodThread.java create mode 100644 test/com/sleepycat/je/junit/JUnitProcessThread.java create mode 100644 test/com/sleepycat/je/junit/JUnitThread.java create mode 100644 test/com/sleepycat/je/latch/LatchTest.java create mode 100644 test/com/sleepycat/je/log/BufferPoolReadLatchTest.java create mode 100644 test/com/sleepycat/je/log/FSyncManagerTest.java create mode 100644 test/com/sleepycat/je/log/FileEdgeCaseTest.java create mode 100644 test/com/sleepycat/je/log/FileManagerMultiDataDirTest.java create mode 100644 test/com/sleepycat/je/log/FileManagerTest.java create mode 100644 test/com/sleepycat/je/log/FileManagerTestUtils.java create mode 100644 test/com/sleepycat/je/log/FileReaderBufferingTest.java create mode 100644 test/com/sleepycat/je/log/FileReaderTest.java create mode 100644 test/com/sleepycat/je/log/INFileReaderTest.java create mode 100644 test/com/sleepycat/je/log/IOExceptionTest.java create mode 100644 test/com/sleepycat/je/log/InvisibleTest.java create mode 100644 test/com/sleepycat/je/log/LNFileReaderTest.java create mode 100644 test/com/sleepycat/je/log/LastFileReaderTest.java create mode 100644 test/com/sleepycat/je/log/LogBufferPoolTest.java create mode 100644 test/com/sleepycat/je/log/LogEntryTest.java create mode 100644 test/com/sleepycat/je/log/LogFileGapTest.java create mode 100644 test/com/sleepycat/je/log/LogFlusherTest.java create mode 100644 test/com/sleepycat/je/log/LogManagerTest.java create mode 100644 test/com/sleepycat/je/log/LogUtilsTest.java create mode 100644 test/com/sleepycat/je/log/LoggableTest.java create mode 100644 test/com/sleepycat/je/log/TestUtilLogReader.java create mode 100644 test/com/sleepycat/je/log/WriteQueueTest.java create mode 100644 test/com/sleepycat/je/logversion/LogEntryVersionTest.java create mode 100644 test/com/sleepycat/je/logversion/LogHeaderVersionTest.java create mode 100644 test/com/sleepycat/je/logversion/MakeLogEntryVersionData.java create mode 100644 test/com/sleepycat/je/logversion/MakeLogHeaderVersionData.java create mode 100644 test/com/sleepycat/je/logversion/Utils.java create mode 100644 test/com/sleepycat/je/logversion/je-1.5.4.jdb create mode 100644 test/com/sleepycat/je/logversion/je-1.5.4.txt create mode 100644 test/com/sleepycat/je/logversion/je-1.7.0.jdb create mode 100644 test/com/sleepycat/je/logversion/je-1.7.0.txt create mode 100644 test/com/sleepycat/je/logversion/je-2.0.0.jdb create mode 100644 test/com/sleepycat/je/logversion/je-2.0.0.txt create mode 100644 test/com/sleepycat/je/logversion/je-3.1.25.jdb create mode 100644 test/com/sleepycat/je/logversion/je-3.1.25.txt create mode 100644 test/com/sleepycat/je/logversion/je-3.2.22.jdb create mode 100644 test/com/sleepycat/je/logversion/je-3.2.22.txt create mode 100644 test/com/sleepycat/je/logversion/je-3.2.79.jdb create mode 100644 test/com/sleepycat/je/logversion/je-3.2.79.txt create mode 100644 test/com/sleepycat/je/logversion/je-3.3.78.jdb create mode 100644 test/com/sleepycat/je/logversion/je-3.3.78.txt create mode 100644 test/com/sleepycat/je/logversion/je-4.0.51.jdb create mode 100644 test/com/sleepycat/je/logversion/je-4.0.51.txt create mode 100644 test/com/sleepycat/je/logversion/je-5.0.39.jdb create mode 100644 test/com/sleepycat/je/logversion/je-5.0.39.txt create mode 100644 test/com/sleepycat/je/logversion/je-6.0.13.jdb create mode 100644 test/com/sleepycat/je/logversion/je-6.0.13.txt create mode 100644 test/com/sleepycat/je/logversion/je-6.2.12.jdb create mode 100644 test/com/sleepycat/je/logversion/je-6.2.12.txt create mode 100644 test/com/sleepycat/je/logversion/je-6.4.14.jdb create mode 100644 test/com/sleepycat/je/logversion/je-6.4.14.txt create mode 100644 test/com/sleepycat/je/logversion/je-7.0.6.jdb create mode 100644 test/com/sleepycat/je/logversion/je-7.0.6.txt create mode 100644 test/com/sleepycat/je/logversion/je-7.1.9.jdb create mode 100644 test/com/sleepycat/je/logversion/je-7.1.9.txt create mode 100644 test/com/sleepycat/je/logversion/maxversion.jdb create mode 100644 test/com/sleepycat/je/logversion/minversion.jdb create mode 100644 test/com/sleepycat/je/recovery/CheckBINDeltaTest.java create mode 100644 test/com/sleepycat/je/recovery/CheckBase.java create mode 100644 test/com/sleepycat/je/recovery/CheckNewRootTest.java create mode 100644 test/com/sleepycat/je/recovery/CheckReverseSplitsTest.java create mode 100644 test/com/sleepycat/je/recovery/CheckSplitAuntTest.java create mode 100644 test/com/sleepycat/je/recovery/CheckSplitsTest.java create mode 100644 test/com/sleepycat/je/recovery/CheckpointActivationTest.java create mode 100644 test/com/sleepycat/je/recovery/DbConfigUpdateRecoveryTest.java create mode 100644 test/com/sleepycat/je/recovery/LNSlotReuseTest.java create mode 100644 test/com/sleepycat/je/recovery/Level2SplitBugTest.java create mode 100644 test/com/sleepycat/je/recovery/MultiEnvTest.java create mode 100644 test/com/sleepycat/je/recovery/Recovery2PCTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryAbortTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryCheckpointTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryDeleteTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryDeltaTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryDuplicatesTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryEdgeTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryTest.java create mode 100644 test/com/sleepycat/je/recovery/RecoveryTestBase.java create mode 100644 test/com/sleepycat/je/recovery/Rollback2PCTest.java create mode 100644 test/com/sleepycat/je/recovery/RollbackTrackerTest.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/CommitEntry.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/EntryTrackerReader.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/LogEntryInfo.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/NonTxnalDeletedEntry.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/NonTxnalEntry.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/TestData.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/TxnalDeletedEntry.java create mode 100644 test/com/sleepycat/je/recovery/stepwise/TxnalEntry.java create mode 100644 test/com/sleepycat/je/rep.properties create mode 100644 test/com/sleepycat/je/rep/CheckAccessTest.java create mode 100644 test/com/sleepycat/je/rep/CheckConfigTest.java create mode 100644 test/com/sleepycat/je/rep/CommitPointConsistencyPolicyTest.java create mode 100644 test/com/sleepycat/je/rep/ConversionTest.java create mode 100644 test/com/sleepycat/je/rep/DatabaseOperationTest.java create mode 100644 test/com/sleepycat/je/rep/ElectableGroupSizeOverrideTest.java create mode 100644 test/com/sleepycat/je/rep/ExceptionIdiomsTest.java create mode 100644 test/com/sleepycat/je/rep/ExternalNodeTypeTest.java create mode 100644 test/com/sleepycat/je/rep/GroupCommitTest.java create mode 100644 test/com/sleepycat/je/rep/HandshakeTest.java create mode 100644 test/com/sleepycat/je/rep/HardRecoveryTest.java create mode 100644 test/com/sleepycat/je/rep/JoinGroupTest.java create mode 100644 test/com/sleepycat/je/rep/JoinGroupTimeoutsTest.java create mode 100644 test/com/sleepycat/je/rep/LocalWriteTxnTest.java create mode 100644 test/com/sleepycat/je/rep/LogRewriteWarningTest.java create mode 100644 test/com/sleepycat/je/rep/MasterChangeTest.java create mode 100644 test/com/sleepycat/je/rep/MockClientNode.java create mode 100644 test/com/sleepycat/je/rep/MultiProcessOpenEnvTest.java create mode 100644 test/com/sleepycat/je/rep/NodePriorityTest.java create mode 100644 test/com/sleepycat/je/rep/ParamTest.java create mode 100644 test/com/sleepycat/je/rep/PerDbReplicationTest.java create mode 100644 test/com/sleepycat/je/rep/RecoveryUtilizationTest.java create mode 100644 test/com/sleepycat/je/rep/RepEnvMultiSubDirTest.java create mode 100644 test/com/sleepycat/je/rep/RepGroupAdminTest.java create mode 100644 test/com/sleepycat/je/rep/RepIDSequenceTest.java create mode 100644 test/com/sleepycat/je/rep/RepPreloadTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicatedEnvironmentStatsTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicatedEnvironmentTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicatedTransactionTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicationConfigTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicationGroupTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicationNetworkConfigTest.java create mode 100644 test/com/sleepycat/je/rep/ReplicationRateStatsTest.java create mode 100644 test/com/sleepycat/je/rep/SecondaryNodeTest.java create mode 100644 test/com/sleepycat/je/rep/SerializationTest.java create mode 100644 test/com/sleepycat/je/rep/StateChangeListenerTest.java create mode 100644 test/com/sleepycat/je/rep/StoredClassCatalogTest.java create mode 100644 test/com/sleepycat/je/rep/UnknownStateReplicaTest.java create mode 100644 test/com/sleepycat/je/rep/UnresolvedHelperHostTest.java create mode 100644 test/com/sleepycat/je/rep/arb/ArbiterTest.java create mode 100644 test/com/sleepycat/je/rep/dual/ClassLoaderTest.java create mode 100644 test/com/sleepycat/je/rep/dual/CursorEdgeTest.java create mode 100644 test/com/sleepycat/je/rep/dual/CursorTest.java create mode 100644 test/com/sleepycat/je/rep/dual/DatabaseComparatorsTest.java create mode 100644 test/com/sleepycat/je/rep/dual/DatabaseConfigTest.java create mode 100644 test/com/sleepycat/je/rep/dual/DatabaseEntryTest.java create mode 100644 test/com/sleepycat/je/rep/dual/DatabaseTest.java create mode 100644 test/com/sleepycat/je/rep/dual/DbHandleLockTest.java create mode 100644 test/com/sleepycat/je/rep/dual/DirtyReadTest.java create mode 100644 test/com/sleepycat/je/rep/dual/EnvironmentTest.java create mode 100644 test/com/sleepycat/je/rep/dual/GetSearchBothRangeTest.java create mode 100644 test/com/sleepycat/je/rep/dual/ReadCommittedTest.java create mode 100644 test/com/sleepycat/je/rep/dual/SecondaryTest.java create mode 100644 test/com/sleepycat/je/rep/dual/TruncateTest.java create mode 100644 test/com/sleepycat/je/rep/dual/dbi/DbTreeTest.java create mode 100644 test/com/sleepycat/je/rep/dual/dbi/EmbeddedOpsTest.java create mode 100644 test/com/sleepycat/je/rep/dual/dbi/SortedLSNTreeWalkerTest.java create mode 100644 test/com/sleepycat/je/rep/dual/incomp/INCompressorTest.java create mode 100644 test/com/sleepycat/je/rep/dual/log/FileReaderTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/ForeignKeyTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/IndexTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/JoinTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/NegativeTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/OperationTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/SequenceTest.java create mode 100644 test/com/sleepycat/je/rep/dual/persist/test/SubclassIndexTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/AtomicPutTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/ForeignKeyTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/InternalCursorTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/JoinTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/PhantomRestartTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/PhantomTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/SecondaryDirtyReadTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/SequenceTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/TTLTest.java create mode 100644 test/com/sleepycat/je/rep/dual/test/ToManyTest.java create mode 100644 test/com/sleepycat/je/rep/dual/tree/KeyPrefixTest.java create mode 100644 test/com/sleepycat/je/rep/dual/tree/MemorySizeTest.java create mode 100644 test/com/sleepycat/je/rep/dual/tree/SR13034Test.java create mode 100644 test/com/sleepycat/je/rep/dual/tree/SplitRace_SR11144Test.java create mode 100644 test/com/sleepycat/je/rep/dual/tree/SplitTest.java create mode 100644 test/com/sleepycat/je/rep/dual/trigger/ConfigTest.java create mode 100644 test/com/sleepycat/je/rep/dual/trigger/InvokeTest.java create mode 100644 test/com/sleepycat/je/rep/dual/txn/LockManagerTest.java create mode 100644 test/com/sleepycat/je/rep/dual/txn/LockTest.java create mode 100644 test/com/sleepycat/je/rep/dual/txn/TxnFSyncTest.java create mode 100644 test/com/sleepycat/je/rep/dual/txn/TxnMemoryTest.java create mode 100644 test/com/sleepycat/je/rep/dual/txn/TxnTest.java create mode 100644 test/com/sleepycat/je/rep/dual/txn/TxnTimeoutTest.java create mode 100644 test/com/sleepycat/je/rep/dual/util/VerifyLogTest.java create mode 100644 test/com/sleepycat/je/rep/dupconvert/RepDupConvertTest.java create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_deletedLNCommit_0.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_deletedLNCommit_1.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_deletedLNCommit_2.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_deletedLNNoCommit_0.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_deletedLNNoCommit_1.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_deletedLNNoCommit_2.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_din_0.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_din_1.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_din_2.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_mixIN_0.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_mixIN_1.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_mixIN_2.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_singletonLN_0.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_singletonLN_1.jdb create mode 100644 test/com/sleepycat/je/rep/dupconvert/je-4.1.7_singletonLN_2.jdb create mode 100644 test/com/sleepycat/je/rep/elections/AcceptorTest.java create mode 100644 test/com/sleepycat/je/rep/elections/ElectionWithLogVersionTest.java create mode 100644 test/com/sleepycat/je/rep/elections/ElectionsTest.java create mode 100644 test/com/sleepycat/je/rep/elections/JoinerElectionTest.java create mode 100644 test/com/sleepycat/je/rep/elections/ProtocolFailureTest.java create mode 100644 test/com/sleepycat/je/rep/elections/ProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/elections/RankingProposerTest.java create mode 100644 test/com/sleepycat/je/rep/elections/VLSNFreezeLatchTest.java create mode 100644 test/com/sleepycat/je/rep/impl/DTVLSNTest.java create mode 100644 test/com/sleepycat/je/rep/impl/DynamicGroupTest.java create mode 100644 test/com/sleepycat/je/rep/impl/GroupDbAckFailureTest.java create mode 100644 test/com/sleepycat/je/rep/impl/GroupServiceTest.java create mode 100644 test/com/sleepycat/je/rep/impl/NetworkPartitionHealingTest.java create mode 100644 test/com/sleepycat/je/rep/impl/NodeStateProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/impl/RepGroupDBTest.java create mode 100644 test/com/sleepycat/je/rep/impl/RepGroupImplCompatibilityTest.java create mode 100644 test/com/sleepycat/je/rep/impl/RepGroupImplTest.java create mode 100644 test/com/sleepycat/je/rep/impl/RepGroupProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/impl/RepTestBase.java create mode 100644 test/com/sleepycat/je/rep/impl/ReplayWithBinDeltaInsertionsTest.java create mode 100644 test/com/sleepycat/je/rep/impl/RoundRobinTest.java create mode 100644 test/com/sleepycat/je/rep/impl/TextProtocolTestBase.java create mode 100644 test/com/sleepycat/je/rep/impl/networkRestore/InterruptedNetworkRestoreTest.java create mode 100644 test/com/sleepycat/je/rep/impl/networkRestore/NetworkBackupTest.java create mode 100644 test/com/sleepycat/je/rep/impl/networkRestore/NetworkRestoreNoMasterTest.java create mode 100644 test/com/sleepycat/je/rep/impl/networkRestore/NetworkRestoreTest.java create mode 100644 test/com/sleepycat/je/rep/impl/networkRestore/OneNodeRestoreTest.java create mode 100644 test/com/sleepycat/je/rep/impl/networkRestore/ProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/CBVLSNTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/DbCacheTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/FeederRecordBatchTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/GroupShutdownTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/MasterBounceTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/MasterTransferTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/MinRetainedVLSNsTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/MinorityTransferTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/PrimaryNodeTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/RepNodeTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/ReplicaMasterStateTransitionsTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/ReplicaOutputThreadTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/ReplicaTimeoutTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/UpdateJEVersionTest.java create mode 100644 test/com/sleepycat/je/rep/impl/node/UpdateNodeAddressTest.java create mode 100644 test/com/sleepycat/je/rep/jmx/RepJEDiagnosticsTest.java create mode 100644 test/com/sleepycat/je/rep/jmx/RepJEMonitorTest.java create mode 100644 test/com/sleepycat/je/rep/monitor/MonitorChangeListenerNoEventsTest.java create mode 100644 test/com/sleepycat/je/rep/monitor/MonitorChangeListenerTest.java create mode 100644 test/com/sleepycat/je/rep/monitor/MonitorTest.java create mode 100644 test/com/sleepycat/je/rep/monitor/MonitorTestBase.java create mode 100644 test/com/sleepycat/je/rep/monitor/PingCommandTest.java create mode 100644 test/com/sleepycat/je/rep/monitor/ProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/node/replica/ReplayTest.java create mode 100644 test/com/sleepycat/je/rep/persist/test/AppBaseImpl.java create mode 100644 test/com/sleepycat/je/rep/persist/test/AppImpl.java.0 create mode 100644 test/com/sleepycat/je/rep/persist/test/AppImpl.java.1 create mode 100644 test/com/sleepycat/je/rep/persist/test/AppInterface.java create mode 100644 test/com/sleepycat/je/rep/persist/test/SimpleTest.java create mode 100644 test/com/sleepycat/je/rep/persist/test/UpgradeTest.java create mode 100644 test/com/sleepycat/je/rep/secure.properties create mode 100644 test/com/sleepycat/je/rep/stream/FeederFilterTest.java create mode 100644 test/com/sleepycat/je/rep/stream/FeederReaderTest.java create mode 100644 test/com/sleepycat/je/rep/stream/FeederWriteQueueTest.java create mode 100644 test/com/sleepycat/je/rep/stream/ProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/stream/ReplicaSyncupReaderTest.java create mode 100644 test/com/sleepycat/je/rep/stream/VLSNTestUtils.java create mode 100644 test/com/sleepycat/je/rep/subscription/EntryRequestTypeTest.java create mode 100644 test/com/sleepycat/je/rep/subscription/SubscriptionAuthTestHelper.java create mode 100644 test/com/sleepycat/je/rep/subscription/SubscriptionConfigTest.java create mode 100644 test/com/sleepycat/je/rep/subscription/SubscriptionTest.java create mode 100644 test/com/sleepycat/je/rep/subscription/SubscriptionTestBase.java create mode 100644 test/com/sleepycat/je/rep/txn/CommitTokenTest.java create mode 100644 test/com/sleepycat/je/rep/txn/ExceptionTest.java create mode 100644 test/com/sleepycat/je/rep/txn/LockPreemptionTest.java create mode 100644 test/com/sleepycat/je/rep/txn/PostLogCommitTest.java create mode 100644 test/com/sleepycat/je/rep/txn/RepAutoCommitTest.java create mode 100644 test/com/sleepycat/je/rep/txn/ReplayRecoveryTest.java create mode 100644 test/com/sleepycat/je/rep/txn/RollbackTest.java create mode 100644 test/com/sleepycat/je/rep/txn/RollbackToMatchpointTest.java create mode 100644 test/com/sleepycat/je/rep/txn/RollbackWorkload.java create mode 100644 test/com/sleepycat/je/rep/txn/Utils.java create mode 100644 test/com/sleepycat/je/rep/util/DbGroupAdminTest.java create mode 100644 test/com/sleepycat/je/rep/util/DbPingTest.java create mode 100644 test/com/sleepycat/je/rep/util/EnableRenameTest.java create mode 100644 test/com/sleepycat/je/rep/util/EnvConvertTest.java create mode 100644 test/com/sleepycat/je/rep/util/RepEnvWrapper.java create mode 100644 test/com/sleepycat/je/rep/util/RepSequenceTest.java create mode 100644 test/com/sleepycat/je/rep/util/ResetRepGroupTest.java create mode 100644 test/com/sleepycat/je/rep/util/ServiceDispatcherTest.java create mode 100644 test/com/sleepycat/je/rep/util/ServiceDispatcherTestBase.java create mode 100644 test/com/sleepycat/je/rep/util/TestChannel.java create mode 100644 test/com/sleepycat/je/rep/util/TestLogItem.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/BlockBagTest.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/LDiffServiceTest.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/LDiffTest.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/LDiffTestUtils.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/LDiffUtilTest.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/ProtocolTest.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/RemoteProcessingTest.java create mode 100644 test/com/sleepycat/je/rep/util/ldiff/WindowTest.java create mode 100644 test/com/sleepycat/je/rep/utilint/HandshakeTest.java create mode 100644 test/com/sleepycat/je/rep/utilint/LocalAliasNameService.java create mode 100644 test/com/sleepycat/je/rep/utilint/RepTestUtils.java create mode 100644 test/com/sleepycat/je/rep/utilint/SimpleTxnMapTest.java create mode 100644 test/com/sleepycat/je/rep/utilint/SizeAwaitMapTest.java create mode 100644 test/com/sleepycat/je/rep/utilint/TestPasswordAuthentication.java create mode 100644 test/com/sleepycat/je/rep/utilint/ValidStateListener.java create mode 100644 test/com/sleepycat/je/rep/utilint/WaitForDetachedListener.java create mode 100644 test/com/sleepycat/je/rep/utilint/WaitForListener.java create mode 100644 test/com/sleepycat/je/rep/utilint/WaitForMasterListener.java create mode 100644 test/com/sleepycat/je/rep/utilint/WaitForReplicaListener.java create mode 100644 test/com/sleepycat/je/rep/utilint/net/SSLChannelTest.java create mode 100644 test/com/sleepycat/je/rep/utilint/net/SSLMultiThreadTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/MergeTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/SyncupWithGapsTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLPair.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNAwaitConsistencyTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNBucketTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNCacheTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNCleanerTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNConsistencyTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNIndexTest.java create mode 100644 test/com/sleepycat/je/rep/vlsn/VLSNIndexTruncateTest.java create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.BtreeStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.CommitToken.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.DatabaseExistsException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.DatabaseNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.DeadlockException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.DeleteConstraintException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.DuplicateDataException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.EnvironmentFailureException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.EnvironmentLockedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.EnvironmentNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.EnvironmentStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.ForeignConstraintException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.LockNotAvailableException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.LockNotGrantedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.LockStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.LockTimeoutException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.LogWriteException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.PreloadStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.PreloadStatus.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.SecondaryIntegrityException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.SequenceExistsException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.SequenceIntegrityException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.SequenceNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.SequenceOverflowException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.SequenceStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.ThreadInterruptedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.TransactionStats$Active.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.TransactionStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.TransactionTimeoutException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.UniqueConstraintException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.VersionMismatchException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.XAFailureException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.DatabasePreemptedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.GroupShutdownException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.InsufficientAcksException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.InsufficientLogException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.InsufficientReplicasException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.LockPreemptedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.LogOverwriteException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.MasterStateException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.MemberNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.ReplicaConsistencyException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.ReplicaWriteException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.ReplicatedEnvironmentStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.RollbackException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.RollbackProhibitedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.rep.UnknownMasterException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.tree.CursorsExistException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.tree.NodeNotEmptyException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.util.LogVerificationException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.je.utilint.InternalException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.persist.IndexNotAvailableException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.persist.StoreExistsException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.persist.StoreNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.persist.evolve.DeletedClassException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.persist.evolve.IncompatibleClassException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.util.IOExceptionWrapper.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.util.RuntimeExceptionWrapper.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.0.106/com.sleepycat.util.keyrange.KeyRangeException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.BtreeStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.CommitToken.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.DatabaseExistsException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.DatabaseNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.DeadlockException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.DeleteConstraintException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.DuplicateDataException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.EnvironmentFailureException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.EnvironmentLockedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.EnvironmentNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.EnvironmentStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.ForeignConstraintException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.LockNotAvailableException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.LockNotGrantedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.LockStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.LockTimeoutException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.LogWriteException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.PreloadStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.PreloadStatus.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.SecondaryIntegrityException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.SequenceExistsException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.SequenceIntegrityException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.SequenceNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.SequenceOverflowException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.SequenceStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.ThreadInterruptedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.TransactionStats$Active.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.TransactionStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.TransactionTimeoutException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.UniqueConstraintException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.VersionMismatchException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.XAFailureException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.log.ChecksumException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.DatabasePreemptedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.GroupShutdownException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.InsufficientAcksException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.InsufficientLogException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.InsufficientReplicasException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.LockPreemptedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.LogOverwriteException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.MasterReplicaTransitionException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.MasterStateException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.MemberNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.ReplicaConsistencyException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.ReplicaWriteException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.ReplicatedEnvironmentStats.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.RollbackException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.RollbackProhibitedException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.UnknownMasterException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.util.ldiff.Block.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.rep.util.ldiff.LDiffRecordRequestException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.tree.CursorsExistException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.tree.NodeNotEmptyException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.util.LogVerificationException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.utilint.InternalException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.utilint.Timestamp.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.je.utilint.VLSN.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.persist.IndexNotAvailableException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.persist.StoreExistsException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.persist.StoreNotFoundException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.persist.evolve.DeletedClassException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.persist.evolve.IncompatibleClassException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.util.IOExceptionWrapper.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.util.RuntimeExceptionWrapper.out create mode 100644 test/com/sleepycat/je/serializecompatibility/4.1.6/com.sleepycat.util.keyrange.KeyRangeException.out create mode 100644 test/com/sleepycat/je/serializecompatibility/SerializeReadObjectsTest.java create mode 100644 test/com/sleepycat/je/serializecompatibility/SerializeUtils.java create mode 100644 test/com/sleepycat/je/serializecompatibility/SerializeWriteObjects.java create mode 100644 test/com/sleepycat/je/statcap/StatFile.java create mode 100644 test/com/sleepycat/je/test/AtomicPutTest.java create mode 100644 test/com/sleepycat/je/test/DeferredWriteTest.java create mode 100644 test/com/sleepycat/je/test/ForeignKeyTest.java create mode 100644 test/com/sleepycat/je/test/InternalCursorTest.java create mode 100644 test/com/sleepycat/je/test/JoinTest.java create mode 100644 test/com/sleepycat/je/test/KeyScanTest.java create mode 100644 test/com/sleepycat/je/test/LogFileDeletionCrashEnvTest.java create mode 100644 test/com/sleepycat/je/test/MultiEnvOpenCloseTest.java create mode 100644 test/com/sleepycat/je/test/MultiKeyTxnTestCase.java create mode 100644 test/com/sleepycat/je/test/OpStatsTest.java create mode 100644 test/com/sleepycat/je/test/PhantomRestartTest.java create mode 100644 test/com/sleepycat/je/test/PhantomTest.java create mode 100644 test/com/sleepycat/je/test/SR11297Test.java create mode 100644 test/com/sleepycat/je/test/SecondaryAssociationTest.java create mode 100644 test/com/sleepycat/je/test/SecondaryDirtyReadTest.java create mode 100644 test/com/sleepycat/je/test/SecondaryMultiComplexTest.java create mode 100644 test/com/sleepycat/je/test/SecondaryMultiTest.java create mode 100644 test/com/sleepycat/je/test/SecondarySplitTestMain.java create mode 100644 test/com/sleepycat/je/test/SecondaryTest.java create mode 100644 test/com/sleepycat/je/test/SequenceTest.java create mode 100644 test/com/sleepycat/je/test/SkipTest.java create mode 100644 test/com/sleepycat/je/test/SpeedyTTLTime.java create mode 100644 test/com/sleepycat/je/test/TTLTest.java create mode 100644 test/com/sleepycat/je/test/ToManyTest.java create mode 100644 test/com/sleepycat/je/tree/BinDeltaTest.java create mode 100644 test/com/sleepycat/je/tree/CountEstimatorTest.java create mode 100644 test/com/sleepycat/je/tree/CreateOldVersionLogs.java create mode 100644 test/com/sleepycat/je/tree/DupConvertTest.java create mode 100644 test/com/sleepycat/je/tree/FetchWithNoLatchTest.java create mode 100644 test/com/sleepycat/je/tree/GetParentNodeTest.java create mode 100644 test/com/sleepycat/je/tree/INEntryTestBase.java create mode 100644 test/com/sleepycat/je/tree/INKeyRepTest.java create mode 100644 test/com/sleepycat/je/tree/INTargetRepTest.java create mode 100644 test/com/sleepycat/je/tree/INTest.java create mode 100644 test/com/sleepycat/je/tree/KeyPrefixTest.java create mode 100644 test/com/sleepycat/je/tree/KeyTest.java create mode 100644 test/com/sleepycat/je/tree/LSNArrayTest.java create mode 100644 test/com/sleepycat/je/tree/MemorySizeTest.java create mode 100644 test/com/sleepycat/je/tree/ReleaseLatchesTest.java create mode 100644 test/com/sleepycat/je/tree/SR13034Test.java create mode 100644 test/com/sleepycat/je/tree/SR13126Test.java create mode 100644 test/com/sleepycat/je/tree/SplitRace_SR11144Test.java create mode 100644 test/com/sleepycat/je/tree/SplitTest.java create mode 100644 test/com/sleepycat/je/tree/TreeTest.java create mode 100644 test/com/sleepycat/je/tree/TreeTestBase.java create mode 100644 test/com/sleepycat/je/tree/ValidateSubtreeDeleteTest.java create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_logWithDIN.jdb create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_logWithDeletedLNCommit.jdb create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_logWithDeletedLNNoCommit.jdb create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_logWithMixIN.jdb create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_logWithSingletonLN.jdb create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_noPreUpgrade_deltas create mode 100644 test/com/sleepycat/je/tree/je-4.1.7_noPreUpgrade_dups create mode 100644 test/com/sleepycat/je/trigger/ConfigTest.java create mode 100644 test/com/sleepycat/je/trigger/InvokeTest.java create mode 100644 test/com/sleepycat/je/trigger/TestBase.java create mode 100644 test/com/sleepycat/je/txn/CursorTxnTest.java create mode 100644 test/com/sleepycat/je/txn/DeadlockTest.java create mode 100644 test/com/sleepycat/je/txn/LockManagerTest.java create mode 100644 test/com/sleepycat/je/txn/LockTest.java create mode 100644 test/com/sleepycat/je/txn/ReadCommitLockersTest.java create mode 100644 test/com/sleepycat/je/txn/TwoPCTest.java create mode 100644 test/com/sleepycat/je/txn/TxnEndTest.java create mode 100644 test/com/sleepycat/je/txn/TxnFSyncTest.java create mode 100644 test/com/sleepycat/je/txn/TxnMemoryTest.java create mode 100644 test/com/sleepycat/je/txn/TxnTest.java create mode 100644 test/com/sleepycat/je/txn/TxnTimeoutTest.java create mode 100644 test/com/sleepycat/je/util/Adler32Test.java create mode 100644 test/com/sleepycat/je/util/BadFileFilter.java create mode 100644 test/com/sleepycat/je/util/BtreeCorruptionTest.java create mode 100644 test/com/sleepycat/je/util/CustomDbPrintLogTest.java create mode 100644 test/com/sleepycat/je/util/DbBackupTest.java create mode 100644 test/com/sleepycat/je/util/DbCacheSizeTest.java create mode 100644 test/com/sleepycat/je/util/DbDeleteReservedFilesTest.java create mode 100644 test/com/sleepycat/je/util/DbDumpTest.java create mode 100644 test/com/sleepycat/je/util/DbLsnTest.java create mode 100644 test/com/sleepycat/je/util/DbScavengerTest.java create mode 100644 test/com/sleepycat/je/util/DebugRecordTest.java create mode 100644 test/com/sleepycat/je/util/DualTestCase.java create mode 100644 test/com/sleepycat/je/util/EnvTestWrapper.java create mode 100644 test/com/sleepycat/je/util/HexFormatterTest.java create mode 100644 test/com/sleepycat/je/util/InfoFileFilter.java create mode 100644 test/com/sleepycat/je/util/LogFileCorruptionTest.java create mode 100644 test/com/sleepycat/je/util/MiniPerf.java create mode 100644 test/com/sleepycat/je/util/PropUtilTest.java create mode 100644 test/com/sleepycat/je/util/RecordSearch.java create mode 100644 test/com/sleepycat/je/util/SimpleClassLoader.java create mode 100644 test/com/sleepycat/je/util/StringDbt.java create mode 100644 test/com/sleepycat/je/util/TestDumper.java create mode 100644 test/com/sleepycat/je/util/TestUtils.java create mode 100644 test/com/sleepycat/je/util/VerifyLogTest.java create mode 100644 test/com/sleepycat/je/util/dbfilterstats/DbFilterStatsTest.java create mode 100644 test/com/sleepycat/je/util/dbfilterstats/allcols.csv create mode 100644 test/com/sleepycat/je/util/dbfilterstats/je.config.csv create mode 100644 test/com/sleepycat/je/util/dbfilterstats/je.stat.0.csv create mode 100644 test/com/sleepycat/je/util/dbfilterstats/je.stat.csv create mode 100644 test/com/sleepycat/je/util/dbfilterstats/somecols.csv create mode 100644 test/com/sleepycat/je/utilint/AtomicLongComponentTest.java create mode 100644 test/com/sleepycat/je/utilint/AtomicLongMapStatTest.java create mode 100644 test/com/sleepycat/je/utilint/BitMapTest.java create mode 100644 test/com/sleepycat/je/utilint/CronScheduleParserTest.java create mode 100644 test/com/sleepycat/je/utilint/DoubleExpMovingAvgTest.java create mode 100644 test/com/sleepycat/je/utilint/DummyFileStoreInfo.java create mode 100644 test/com/sleepycat/je/utilint/ExceptionListenerTest.java create mode 100644 test/com/sleepycat/je/utilint/FileStoreInfoTest.java create mode 100644 test/com/sleepycat/je/utilint/LoggerUtilsTest.java create mode 100644 test/com/sleepycat/je/utilint/LongAvgRateMapStatTest.java create mode 100644 test/com/sleepycat/je/utilint/LongAvgRateStatTest.java create mode 100644 test/com/sleepycat/je/utilint/LongAvgRateTest.java create mode 100644 test/com/sleepycat/je/utilint/LongDiffStatTest.java create mode 100644 test/com/sleepycat/je/utilint/StoppableThreadTest.java create mode 100644 test/com/sleepycat/je/utilint/TestAction.java create mode 100644 test/com/sleepycat/je/utilint/WaitTestHook.java create mode 100644 test/com/sleepycat/persist/test/AddNewSecKeyToAbstractClassTest.java create mode 100644 test/com/sleepycat/persist/test/BindingTest.java create mode 100644 test/com/sleepycat/persist/test/ConvertAndAddTest.java create mode 100644 test/com/sleepycat/persist/test/ConvertAndAddTest.jdb create mode 100644 test/com/sleepycat/persist/test/CreateAbstractClassData.java create mode 100644 test/com/sleepycat/persist/test/CreateOldVersionBigDecimalDb.java create mode 100644 test/com/sleepycat/persist/test/CreateSecDupsWithoutComparator.java create mode 100644 test/com/sleepycat/persist/test/CreateSecDupsWithoutComparatorEvolve.java create mode 100644 test/com/sleepycat/persist/test/CreateStringDataDB.java create mode 100644 test/com/sleepycat/persist/test/DevolutionTest.java create mode 100644 test/com/sleepycat/persist/test/DevolutionTest.jdb create mode 100644 test/com/sleepycat/persist/test/Enhanced0.ASMified create mode 100644 test/com/sleepycat/persist/test/Enhanced0.java create mode 100644 test/com/sleepycat/persist/test/Enhanced1.ASMified create mode 100644 test/com/sleepycat/persist/test/Enhanced1.java create mode 100644 test/com/sleepycat/persist/test/Enhanced2.ASMified create mode 100644 test/com/sleepycat/persist/test/Enhanced2.java create mode 100644 test/com/sleepycat/persist/test/Enhanced3.ASMified create mode 100644 test/com/sleepycat/persist/test/Enhanced3.java create mode 100644 test/com/sleepycat/persist/test/EvolveCase.java create mode 100644 test/com/sleepycat/persist/test/EvolveClasses.java create mode 100644 test/com/sleepycat/persist/test/EvolveClasses.java.original create mode 100644 test/com/sleepycat/persist/test/EvolveProxyClassTest.java create mode 100644 test/com/sleepycat/persist/test/EvolveTest.java create mode 100644 test/com/sleepycat/persist/test/EvolveTestBase.java create mode 100644 test/com/sleepycat/persist/test/EvolveTestInit.java create mode 100644 test/com/sleepycat/persist/test/ForeignKeyTest.java create mode 100644 test/com/sleepycat/persist/test/GetLastRestartTest.java create mode 100644 test/com/sleepycat/persist/test/IndexTest.java create mode 100644 test/com/sleepycat/persist/test/JoinTest.java create mode 100644 test/com/sleepycat/persist/test/NegativeTest.java create mode 100644 test/com/sleepycat/persist/test/OperationTest.java create mode 100644 test/com/sleepycat/persist/test/PersistTestUtils.java create mode 100644 test/com/sleepycat/persist/test/ProxyToSimpleTypeTest.java create mode 100644 test/com/sleepycat/persist/test/SecDupsWithoutComparatorEvolve_je_4_0.jdb create mode 100644 test/com/sleepycat/persist/test/SecDupsWithoutComparator_je_4_0.jdb create mode 100644 test/com/sleepycat/persist/test/SecondaryDupOrderEvolveTest.java create mode 100644 test/com/sleepycat/persist/test/SecondaryDupOrderTest.java create mode 100644 test/com/sleepycat/persist/test/SequenceTest.java create mode 100644 test/com/sleepycat/persist/test/StringFormatCompatibilityTest.java create mode 100644 test/com/sleepycat/persist/test/SubclassIndexTest.java create mode 100644 test/com/sleepycat/persist/test/TestVersionCompatibility.java create mode 100644 test/com/sleepycat/persist/test/TestVersionCompatibilitySuite.java create mode 100644 test/com/sleepycat/persist/test/je-4.0.103_AbstractClassData.jdb create mode 100644 test/com/sleepycat/persist/test/je-4.0.103_BigDecimal.jdb create mode 100644 test/com/sleepycat/persist/test/je-4.0.103_EvolveProxyClass.jdb create mode 100644 test/com/sleepycat/persist/test/je-4.0.103_StringData.jdb create mode 100644 test/com/sleepycat/util/test/ExceptionWrapperTest.java create mode 100644 test/com/sleepycat/util/test/FastOutputStreamTest.java create mode 100644 test/com/sleepycat/util/test/GreaterThan.java create mode 100644 test/com/sleepycat/util/test/PackedIntegerTest.java create mode 100644 test/com/sleepycat/util/test/SharedTestUtils.java create mode 100644 test/com/sleepycat/util/test/TestBase.java create mode 100644 test/com/sleepycat/util/test/TestEnv.java create mode 100644 test/com/sleepycat/util/test/TxnTestCase.java create mode 100644 test/com/sleepycat/util/test/UtfTest.java create mode 100644 test/com/sleepycat/utilint/LatencyStatTest.java create mode 100644 test/com/sleepycat/utilint/StatLoggerTest.java create mode 100644 test/com/sleepycat/utilint/StatsTrackerTest.java create mode 100644 test/com/sleepycat/utilint/latency-5-0-69 create mode 100644 test/je.properties create mode 100644 test/jenkins/JE_test_deploy.xlsx create mode 100644 test/jenkins/README create mode 100644 test/jenkins/coverage/README create mode 100644 test/jenkins/coverage/je_cover.sh create mode 100644 test/jenkins/dbsim/README create mode 100644 test/jenkins/dbsim/abortstress.conf create mode 100644 test/jenkins/dbsim/je_dbsim.sh create mode 100644 test/jenkins/dbsim/recovery.conf create mode 100644 test/jenkins/standalone/README create mode 100644 test/jenkins/standalone/error_extract_je.sh create mode 100644 test/jenkins/standalone/gen_xml.sh create mode 100644 test/jenkins/standalone/je_standalone.sh create mode 100644 test/jenkins/unittest/README create mode 100644 test/jenkins/unittest/je_unit.sh create mode 100644 test/ssl/keys.store create mode 100644 test/ssl/make-ks.sh create mode 100644 test/ssl/trust.store create mode 100644 test/standalone/BigDW.java create mode 100644 test/standalone/BigRandom.java create mode 100644 test/standalone/CleanWithSmallCache.java create mode 100644 test/standalone/ClosedDbEviction.java create mode 100644 test/standalone/DeadlockStress.java create mode 100644 test/standalone/DiskLimitStress.java create mode 100644 test/standalone/EnvSharedCache.java create mode 100644 test/standalone/FailoverTest.java create mode 100644 test/standalone/IOErrorStress.java create mode 100644 test/standalone/MasterTransferExercise.java create mode 100644 test/standalone/MeasureDiskOrderedScan.java create mode 100644 test/standalone/MeasureDiskOrderedScan.sh create mode 100644 test/standalone/MemoryStress.java create mode 100644 test/standalone/MixedLifetimeQueue.java create mode 100644 test/standalone/OpenEnvStress.java create mode 100644 test/standalone/RemoveDbStress.java create mode 100644 test/standalone/RepTestData.java create mode 100644 test/standalone/ReplicaDbOps.java create mode 100644 test/standalone/ReplicaReading.java create mode 100644 test/standalone/ReplicationCleaning.java create mode 100644 test/standalone/TTLStress.java create mode 100644 test/standalone/TemporaryDbStress.java create mode 100644 test/standalone/TxnInMultiThreadsStress.java create mode 100644 test/standalone/UtilizationChecker.java create mode 100644 test/standalone/Utils.java diff --git a/FindBugsExclude.xml b/FindBugsExclude.xml new file mode 100644 index 0000000..01186ff --- /dev/null +++ b/FindBugsExclude.xml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a4e050c --- /dev/null +++ b/LICENSE @@ -0,0 +1,76 @@ +Copyright (C) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License") reproduced below or available at: + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +1. You must give any other recipients of the Work or Derivative Works a copy of this License; and +2. You must cause any modified files to carry prominent notices stating that You changed the files; and +3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS + + +ADDITIONAL THIRD PARTY NOTICES: + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +/*** + * ASM: a very small and fast Java bytecode manipulation framework + * Copyright (c) 2000-2005 INRIA, France Telecom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/README b/README new file mode 100644 index 0000000..8631d26 --- /dev/null +++ b/README @@ -0,0 +1,5 @@ +Oracle: Berkeley DB, Java Edition 7.5.11: 2017-10-31 09:36:36 UTC + +This is Berkeley DB, Java Edition, version 7.5.11 from +Oracle. To view the release and installation documentation, load +the distribution file docs/index.html into your web browser. \ No newline at end of file diff --git a/ant/PrintBootClassPath.java b/ant/PrintBootClassPath.java new file mode 100644 index 0000000..5b34400 --- /dev/null +++ b/ant/PrintBootClassPath.java @@ -0,0 +1,16 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2011, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +/** + * Print the value of the "sun.boot.class.path" system property, which is the + * boot classpath for the Oracle Java virtual machine. + */ +public class PrintBootClassPath { + public static void main(String[] args) { + System.out.println(System.getProperty("sun.boot.class.path")); + } +} diff --git a/ant/compile.xml b/ant/compile.xml new file mode 100644 index 0000000..e475d1f --- /dev/null +++ b/ant/compile.xml @@ -0,0 +1,121 @@ + + + + Shared compile target. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ant/internal.xml b/ant/internal.xml new file mode 100644 index 0000000..d93d8f4 --- /dev/null +++ b/ant/internal.xml @@ -0,0 +1,1187 @@ + + + + + + + + + +Internal targets for JE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build-common.xml b/build-common.xml new file mode 100644 index 0000000..99217e2 --- /dev/null +++ b/build-common.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..fa3a28b --- /dev/null +++ b/build.xml @@ -0,0 +1,2394 @@ + + + + + + + + + Compile and test JE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + debug the build file itself + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Builds the distribution package. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Using secure property configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Running je.SimpleExample to insert some data + + + + + + Running DbVerifyLog + + + + + + Running DbDump + + + + + + + + Running DbLoad + + + + + + Running DbDump + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MeasureInsertSize ran OK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Javadoc public api + + + + + + + + + + + + + + + + + + + + + + + + +
Berkeley DB Java Edition
version ${release.version}]]> +
+ Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.]]> + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + Javadoc examples + + +
Berkeley DB Java Edition Examples
version ${release.version}]]> +
+ Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.]]> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + +
Berkeley DB Java Edition
version ${release.version}]]> +
+ Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.]]> + + + +
+ + + +
+ + + + + + + + + + + + + + Need to set the docsbooksdir property to the directory containing + the docs_books Mercurial repository cloned from + ssh://soc//a/hgroot/docs_books + + + + Need to set the fopdir property to the directory containing the + installation of Apache FOP (Formatting Objects Processor) + installed from soc:/b/htdocs/documentation/sleepycat-fop095.zip. + Make sure to update the font-base entry in the + conf/sleepycat-fop.conf file in that directory to match its + current location. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Install JE into destdir + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/dist/build.properties b/dist/build.properties new file mode 100644 index 0000000..fdab116 --- /dev/null +++ b/dist/build.properties @@ -0,0 +1,4 @@ +release.version=7.5.11 +release.numeric.version=7.5.11 +release.major=7 +release.minor=5 diff --git a/docs/GettingStartedGuide/BerkeleyDB-JE-GSG.pdf b/docs/GettingStartedGuide/BerkeleyDB-JE-GSG.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21d2e8545b3a83c31ae741367fa4abc86d5ce2ca GIT binary patch literal 820362 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�(V;a%RdW-l$67ga0W5; zLW#a8ov0exKV_tSC-WQzi`_g_CA_eeOvelGmc~@Sn7Ed>2Zxp`(mxyumRKTlRS)J_ zXf<{WpLaGjla?cA=T9YH2x{&pE0VSm9~A*o8y&lRI+8eHt-#DL^+IX$twmShdgai? zm6vsNjnv3-@6|4g4tUUp(x=zumIhJf?VwgvSiE|e%+cAhW94Go0GP*>9s{pGbbU$) zPS>j6ocUCzz)-PoNdzKQ2hwf=dBpW34{%a~H72YlvG($xjX4e=56}{jQC-tfS&)CV z_rx(+MrHXJKBZPZZ#mQ5BB%bW=rBf~A<4X03B|`neBv1WwI#WABCMWTVp6WiniO<$ z<{#v!+nOCxnF09U+DoE>kYH{hfEdScYX#dms8V9Me6K1R8fM#1sHODZJ&R32kmKo_BkSkLJ^EJz7vR9HzZi~Ffs;II z?pI{ga<6crO^F2=PfX%um8nc3l(bU&%I(_!V4ayn9|}IWjlJgan)MT=oQu7hxR6eD zN0AO{>5Yf>sBu8v8S3htzISiIUWnKQow1wVkzdr?G-Kh&ugzI7BFpwN;ENLOD#v+( zS1o8vg{iVPGl{^iMCxt!5u@RV^YGsQ_7B~oCLS~$;j+w74@~N<5@(zopx&%j`+AvRB?tAZo zjPWdN0y3j}NMd0f9;njD#t{n?29IQr)+zXZ;0UU7y}~%3)8=%|7NcL zO+x>JPWfLsX#D@mK{qK)$PVyBcb-r^|5~knv4K#@_Yk+QNW|I?9HbHa{0X`I&(vbwAsK?+Iia}jeVZa#N8+u z`K)!3$m}tanK;8KF{tPGqcHh{G%uK!A;@VDN4z-`h^;S3%Z6OsV8Fka{-Be8$4Ov@ zB?z0-PGX!jTsMiZQAx8|g)*ID)u|>;a&F~QdK1N0RavU-Tol#4|Mi5>FQMeOY<1?3 zSA82JI-%+qJS{7whNMEA)sTC?eC)} z0#zl=5Q%M}s2upcfCylz5y`%Jn>S2SD#ov`C#ff?{p!;moj0Cd&-Z4gPes>$dgh;V z99XAja%6q88+(c~EZE(q#A$t&V4r_?F_$}WZTz&0x|uDo<)nWq?tETn3-F=8j&+;7 ztk3kY@MV9quUTzXN*7FPo_Wlkh1~S;d_B(benxaHviW8y8>sS)z?Hl_{}4CZa#c)X zA$O{5d3bUK^pw0}nEpn^H!gPCsY$sSa*==8kQRS;$Rh8kw`}RgQxjvbQHJ5QlRib^ zv=cN3!>US5+LG+@X8--0&8R@;VQPy!RYV(-IV0DQkEkT6jt*J@Ra=mXPTf_fm8YX?d!mmQ+D)EzvP-H3 zxt#!LAy(i9h^(m#0HWx<2OjN=6^%}%SgQ6tZmbfF*8WoZ&mfA1%J2*NwmE^gHfvgi zPJeX#jtPi!v$|+{RrH16j^bNkcSTUP)3E8uBZWTn?{BYJn`BcrCQ-4N#W7A`WoOg> zkGi*vjw?&Dg(b^kMvIx5nbBfqW@ctv%*@Qp%xp0;SB+9H?&_KO-cG z43T6_ZJs0{;P-8j&?t-jx^AC?F1NYq)c0jsDki=_(RC&2TnCFmOtZ!Dsl`~y5c^2auA!>kjxcGlLH-m`?)=wZh6+RRsA3Mse+KVl;4NJpTt=Z}Y^ z#E+ozQGaG+6&llB)Ivw`;S3n>kvDtwJDgn9{A|Vbg$jVjJ4Z6crBIuKJTAIg#34+M zo_d&;wU*71lUvA8zfEK2`_%)hQk#!J2!>Z-r4ZIMbDXXni3sET2W1|mM$Qgmn2Bnh zNSF-$lZ5^_eBgQ&neFbWxt3uGc)Wu?Tm2?|k3Bs7^K&FtNOq)ikPI1ITS{_bn{dp; z5Itz_FE?N#C~UQ;DLFLy^{5}5M3B{6-K=Zwq$shm59(E#_!mCRS!8d2+vhjCL>R`B zVQLh+*bGW{TUl3kT@F%_bIaE|Dm;jx(?2AC3RI;ko#B63K-Vpo$VQy!ce%V+IuNJu zOqWTl9Hjh0vo=E8#~VTa$!~@vpy{iqlTi04|D-MrJAq02o^~@kxdL>a1Ktg8C?`TZ zJ~5Yq07N?U%uFDMI2A3ri=00&#+ml#D>W6Q+?gG zV7W6jn?c2&?oU`eODJy*NuAqDQKqCf!bQJnh0y@}3Bg%q;}$m_TJ@>|jw=G7XBAMB zkBs`;uydMY6Vs3I_a5t>`DP;#q=@(tat-WAuvhv>J6%wN0k;sEQV!$6PjO41s+5fg z*}lctXxB(LSUKi?9 zKNC=j)54#oN2AFCz?R5Rkv0g@Sa;iRul~VOJ@oSB{!7Nz!_&zXLs25vdg=5T}o~G z{T$f74h^+}J!mR%WjKH?XcB(~3p`P*Eg*;#1xu1;=sMoAvZx|{0ERGA$zTdP zIlU*S@(J$m!|JvJh%JIxTqLrc?{yz!@#pfJPO-)yO1SDh8r^B+ligKx#cVuZny5$H zN(4|Xg`}7&>~;73KjrIa2hik_jS(7eX}Z$aDi|1EHIXDV1Bc;BK|^Ra>kbY{1E*Nm z1jeV+&jPqxvq65SkHp}_y=s4*wbueNAnLFuSOTCS8gVO{CT<+m0VE)@NxR}6Ny{sI z{T^|B$|aHPTiuWyUQuUSqn(iB&7=@e9oLC%8va_DXP4jx9j|bQC7@GCk8*JvKP9xw z^@4);OzPimZjR2Nu`26-vBE;HC5yxEW821fs)=mn|1L~o+K7&C8q>#ctqEG(JA^QI zCftOVd%G?Rif>Y4?ESpFl*md>RE09fYBVHdg!;u33Ye+^kgcV1>!m53l$i(lF1n6t zsnC5|$RBKfv_Pf@d)dL4<4ZEo82OkJ5q6_GdTo_Py}kW$(z@76g;8D@5yzEZM8j!! zj~5L^u|&^_0SAK^<0J{=IG~9u5arG537PA0Gu7B@b06k6)Se!?Tx?bH2D;s(km?=A z)s4>DJ99pS>wa#P?m1l(|0$`LXf9ch8L~9C@Bwc~TK5ZwzR-dNZ`cf%=Mo#?$fX_L zTA@b3Dnc78J?rO93`oF&7{W#J2h`7g)ljY%=$J5HEzhd7ConW^y!g+tK-EG6rZlC+m#1|hnO7U$wO;|g+WdRd)1Y>gw~w2x&|-smL*?zTw_c!CN+ z4q)$pq-E}nVeYp`|COQF*$ z+S78v-L)>F?Sz!a3dOP!6}dKaRS)Gx!;=IgDf0DWqJvwpRp1Y%NIVVB^PNUvnuhjC zbSt|Ig&)_mG3jz-*tgaKr}zW3WvGInLQfSm(9ErvqSe4$pcgtrQf2_NWa({*rBwv5o~|Trxurm00bG3jeb2k{V=hQe1C$a+MZ}+ zE{j?@KN{sIADukxlWsqF<`Sq?y=aAXX#~|Tu5Ln*N&#;RsO~ZJy#d_Rwp6yHdB%J@ z2=W;{@ZO33I5=JLQM^GSBV)tln6PqDAA8@|pOddM;j2Yg=LeK}AUS{zkKs;tLiO}C z*zs+$*6WaqdHQ1mV}D?z@i0&jYFnwhVuw|0Yfl<|?VV*Df{r6|w=LtuaJce#n+k}u zdq686dG~mlenK8=1<2@BS`+&YC$Tmo&9=ai*Sjw{f;O&!G@F{ItQc=8TTdfFRW1(k zh%I_??MRy*LE?~_IDIKEjwg$nHpA^zmGh=zunQ_2*-54MYU_@kle&@<`9rV`+k7zC1Gyzty94it4VGu93(G}v1`?>;0qfnw<}i@vII(`n7m||wd`ZJCHx^ ztS_fIF}&YuUiNQR$Qlm2c6*XH@Kvfk9~XF}*1bM)yuqc8UUed_CnN7Y+#lM%tRzsy zMf9}w`cqUSd-FiPt!@v1bQ8nHWT3^S>g!`Oez!zfdK*P#qEc<~_~B;zfD66u*W8xY z(JbETx4TQC!SN6bCow>x-9fqTwWDD_?!R#%RP;c1`ONgTcmIHK4*6*MXyy92e|Sd^ zxYsHxaxjbcVOxnP9ZZ}Yo_V;9IQlv;(8cj`n}_O>S=k02Fq3s)0ytA6_9~@N=_K<^ zD}_ULXp33d%qhh=cNSZpAGjbNth+u$abG&L0oQ|HSuTZw9FWUGKxMowJmlCC5pQVX zP~P0?Vi|0)sH=!wB?}=m4C0oax>J?ZrACJv1ROnc6>kUFP8_xCkyoQTRku#NPJj9u z?p=);UV|PrXZZQ6@wZZi@Kv0tb&K!#3#&9#0$QbXa_T?=uHw=xRQF}tfD3yOLsh`Q zT9;<-I_8-JpQVpKeg~Np{RCkD#q%5vb2lz#MbAfUiKzK6!9NE!NU zoTH3zTFyhZZFXOFo=3C(=9A>mC$OzP8z_S_a>U&8y^gUX^duiPraLZJdrp7}?kbYf zR{WV(c#E+otKc?0^U@i}o=QUxNpy4r{Er7>iMo0VxE!qrj$KU$xLN5G6?#WGSVM5B z`M33IpUaOWXez^Ud4gfiqFD_I@{58ju&5^MnlOWbhYT*>Mdr~%S=duKm;~(#6Xif> zvkVo8>Y=Dd>iQGkfNLj!2|5}NJ_2jO@=DUFSW5v@x}{TO3c#gdNM}&Qe`~&-eF&HP zQIG^qIHgI*&P%KN;P-5zqw5aDGgkOTd4_l-6Fh&Q+*ceSrBxBX0@(12rQ5dV{w@ADnvRFS{XT53{zTxL?t6s zA4tf~-;x@o+8Sfax-2C$WGHfV9W(W@WMjJ=&=~rg&f!d*SFPFn!ds(}3Pu`oZK3>` zKgX;wdj+iDa}($7z!l)6=kFF`&=ec9K(MhDsEMp#!aFN#wQ{eYc-Vd45PKDkLi0rI zy8@F-{hmDpPzuHl5<<*?Kc9P2~Wy%ms4jDbPKzK@tB08&+KMqCDf z%vI9>E%#|YI7L7rV+>evy-|z&;tqH>ct;#qGoVJkJSCvQ;82@gkSr{6Jw?{mS2he53tj21_(U~y%64S1Mz&p1 zZ`?S$099ziB-;vV7#FXuJ3n|Wx;irz<>vWr=Ur*i__U$EAh#9P?L~S9bkev{;TZN= z$gj8-r@WZPJ1k+s7c18>JlHjgKI!7IDMLps5}gkvSiIN`B!qJxNIb4kiKb0KLNdvY zWfloo!6y7dZDgMLLj*bi?B?}BGKXW$lro~!Xk*LNeG)@fAok5G0nr?=S$)k>EL!3G zB*q-`BaaiLB$&Y$$oqJf-8(+ihsWoV;`lCZ5SwM!RN@MN+=N`in=T#9a>nk`ZXG{2 zib;nNMK>6B0Ie#9Tt&l-IXrS&kDVo}#8B(3+i*y+=gI!~jD$Csqi~Oh5Zr($M~xF{ zgZV>ND6m+pA)iyy)jK`3uJx6Gi3ib6^uy=VAF#(l zWq__se0yzriJQO*5p_9{ozf zZHrKp{Ii*PaotD7WxVNhcyIC%1f0Lf+-g#wSbR{5E}Y|4+@c1BsMsGchL!T$SLA25 zp@EMcK|#l_fe7(W;`%6`^X&|~MPXMWJ~6U@U8?|9LHF_GWmB?7l&)XWFv-CNhE4Wc zX5_-X$G#3CyuDNqPpxZf3XJHZkuDSWXp{0#erXf=jr>_PTT2s&U#VgCLA% zDUh|HFX!7QgEH{W1iotqq{oDB%1ey-a>KF(!B8J+OYN%QE*=lTKO=k|szfQ`&h{=^y z)?0bKa*zgJRj58yGCz=XbYI8H-|yo{xI36kEg|r?yY%2Wpy4*scxHO4S7y}xRMp*98r3STm468Hd|YSiVS7+NZgfCuZcLMNPh=*XEk{YbV#gZ4wpM&Vl-%|tkMJ0R zy?Hyv1CVv>)Bm6G9R0s#%=8yf`)54&d(4!co{{DEs42rAqo%(_#`&zQtQ{c!(LGDT z)XE&;NfUEu<$Y!Kwd=HbeQNP1OMkW?&W_ny^dRA&?23*be&a&_C`1ygfKcDbh z+Znv~gZ;x5K3q;tTpC3=QCw0J2L~H=8X5y@eS2zaJ6(MXLu!3%OB#Ix8X-CsdKMOK zT6!822TKbY1v_0UdtLpX{c1%F9UM%pjO874?HmjZX!s57%ndCJT?P56#Du66T&$>V z42<5}+sgm;74NZjn$Pb&q9A@o-T&57jN$hL&(CrEX=|C-SbkZ{%0kV^!p6pm%S_As zKWDIS8*=nZi zq)TIJWnkz+{d2Pao5}lQ&h5`n9uvb)YZw?=saY6tnV9MS=d97Uwy=2jlJ}KrPvhX| zU~OlrYw;gu@4Z9V?{E1NtM&I3(Vv_?dM0{mS~^^&-<*?);Wvx_b?0<;cK)MpIvDDk zSQ$DvTicocHfM(RKmFIy@;$@#Yq|dUnf%9&`RCk_;pe8qMElDP=~x-4Y2Vi+-M{RE z|8sWzksSYt70USTTWq+DtiSw?iH?<;7MGFjUv{_ui&;NABI><&P^9_&AF5xI`QEP1 z*z|oC_5QY#8tA=GsI!%YwXT8vpP$U%Z!3RtmD2s1Oh%SpZprligoX9}C-|4$@_)-)yUz)a0ZkIP6$ zPfhAVBCR_$K+P`d#rS5yHd~5c9xE+?Rx`_WiLBFdy z6tT(-*M6^j06L1K9Q=ijw{#8>mxTmqN9Q39cN`B9w|VDY0HsvWR#wCkmL9DyU=?AZ zM7a`W+V0E6eLB=zm=-h-SLQ3Ls6}k=jvrco$z{6JCJR$IZXK-mC~mlnlMD7RF~-LTS~Q6~o^auA5Z++46Y>p-XgQ3w}8M;D719eLI+Q0ucabG;X)E>C9;o=0%k zV_lmRta+a{9Qp*=0|Z;Lu8B(0urD^9p(bu<{j4S*2)M#o1C0x!6T!6Tj`*+j&oyp7 zM(x(an%SkW0GW-^6{jbaU9Tl{9bNb8V3Ol3A@gATQNKZ- zfX;))1$mJ9OqE-h%0GTECkMayKxM^&sad>b?WfU7LKUyr-IOu?EuPNNVR z4r~Fyrh_OGGxah;$)51*sJQ|+eQnr|Py%N)s{gTO2uebbQ>eZ27z%xGDHnQmifJIE z=cnbIyhKcBv2hTNlgu~ zuPGq-9+}aOcq^QeS1}ugkM6V{v=Q8z!AszU^4VytKMcNF)OP2B^Rv)@Py|?2#}CN< zdd0Y16X4SmBFV35FK&w3$OJPxXZ$WJte*FnL-Nw#w+C5Hx(UJ&GxqP5*A;=>aB~sG zJs|C7B}>Fgz6jJ_iJgHia{1!$*8qk^up^R&CfDynpek7yprD%!z^?;P3~(+ z6|mKs$dFIBY*nX0!&@ym-dO|xbW5AAxI4Y1!IzG5)2GtrmzWz^VX+47Z;8CNE`5LU zLpzlGM^f^Qx2*FtciI&P@#=jZHjqIq>YJx=td{^`Ns$c>w;UEKP(de+2-|8b#eO)! zHhXKF=rcKx|I9kQEsmjL;aZ~2m6KvJ4dhn2zu6gOT)dv#Wtwu8f3PQ!r=F>;<<+4=SL}{99F^^*)65p@^k5Ba>C$9 zYECw6DMnp&Zppy&7{c~kV$~V`w@BnRzRH*7K_20D-jhc5Wa9%U^8}`HZ39@q^#DQc zhwF~*&1+9`vm3n0<`>&eTD9H8wHuA!M>Xt43BX%*o;#UAkM}Es(|E7HSOv&Bt;B+a z5{*5vP&BgK+0Q@qr`v-r&G)G}N_sS!v(2cACr?`>28V>NhweD=yt$`n7;CPFQibh|mYCsK7qeY2ERDE&Li6i*XIXAMqP?_kh zE!aYWVw|iszqtoH9AMs2Z&%>)Ao45wSSjv3LfJXsoC1r$?Js_B@$jrYvQFcz(ZhAx ztig(?;X-i~*!lW+bxpIm>+Pp*^my(sZ6s;`a(Xqh`{ea_NqxGNc<-HXTNuu6bb9sb z`1mNDR!Xt|;%{HvJ7-Tl9N$VK{*Y4YAiFoB=lFtDFgy`|-vpi6YU~e&bH3?Ts*HE7 zI70LO_pD8AeXi@NSj2ybdvq>XcG`oyFzQJIIpJ~vgiTm0cb5dGIw5M#H!%$?xfW6( z)PX|>cOF_l(;nu$!a>jdtky64$l&})?s%UUEbW{tv?FNIU*G1i-WHGS+LjVhnJKK^ zpher0mapHxv$AP~qWjVyKlEUXV(v_GOs|cjj4jf#Jy1aTab|NUr^%#s=%oh~-j7NG zK9;&*kngLz(Zly3eZiWGFm+@@d}c~W^$QXTIfMrHadOrWlhDt|!1XWlT(`@(XCYBf z!jMezea-~4@cR6qAhPB(ipXWMD|Odk<>muGqF}e4=1Gp5WGk@Qw-v=8aUjLOuH7Xc z&lB=BMO49eD}y4svcF$3u{XO&l1Jbk%$6=l*diR9!omD#QmeBxP?Xi5Oa|aq=M_tu4nX3F7a9>4$PpH3sZc<>+H^MneXxR4R%l z4hSFsmG$=myALJ0T1sl2H(6j*N#fMTxu7EDxL-lPWR;Xmd+G@d>;XXZ??uh8BpbPn zXWud&f2MFk4%l}!P~j5&5UqIiz2;boxy^6x5d8aS%)H=Ke^rmUYa^<$@p6zx7w=9v zU6WF-Ff@Al;9K3t8FuCcbz35x@bF@(X^6yo?0xYVRrn6Z92~p3)G}@KwA?t75u-Ma zOrTip={SmOBz$1{6A`YsarOwRmdRvajArE&5q4;=riH_fJK_fHwAzJI*gB{N>4WQ_XGUqqY)V@Sam6n3+AsjfON$i= zL~A!hx<6?Z7ut0Q%|Lv370{LP@C*g5K>ToFC3CI8-4jWH%=^}8pVH$#2I6HQ@tli^ z0S;e`RF~J;+Zk}qK@8YRUOdlvw>1b7Q=v z{ll_h7oKpzm9C#Z_NXT-EAZWyuKQdzmgUidC+|VD(wFAgTB&v?6pdRvm?Veq78yS^&E8Ns2kX|4>=S)YH28yA8zpBX=F1l^HP5Nd!#<37hu!EWp&XeQ58EF4 z61x76;JJ<4t_Dl(M++aft*e(|mVoSUYqRU@3NIA!R|(q_`OB2WF14US0{QjF4~+WR zs}My_2!(V`6kxm}(m@Ds5L`>k*s5S6rv|tiMe~yqOLnDSzi=PML9W(`xEe~j3XCbNeV|P$+qnh+FJ8tu+tGj;D{^%8pTV3rXl7B^j?C6 zjqH%>kD2wdN|F=BNxk*lPX&`Nn6pu|e^Naj zZIh1^KT~n*hGTeF*ID)jDTsZD7@jZ;K{3l4&y}ZKVzVTRtU4T$OEjCc7g$8ArKCst zPWIsFgKw#$_NA1rSAG@O1$_K*!*Rc?`kRg=j0m!dGl72D84}}ckVj<{BUw=db--ue zd8baK^_e~5_qfBciVgqNhyHk=^)56`%G+B6B-Pr>FzWI>!-*q5xY1fKC!aZz#A)1k`h%O`GvJ}<2Cq}RNk zIF(sD;#$H{xpmudzd23yUK2}qhu70zN>zIvtPlOCkmS8PoGf2S|vCx?g*=t?7^(^h;=F48T{rCP}n0PJ?tpS&) z6gK2S&sEsT0li52Z}QKXpvGQ?oWrW{>Jom!ASUisd}sys?E!FVs&A0q^MSE(WmGdA zV^=A}A=$++J+M!>n=6R7oZ({8Co?vtMTRLZHX8J9XHlDR$GAN{uyl2{zBMZ|ndLsW zUp5ZiNYc^Mj96_f+7YtkSOwi3AV+V$==*eT$KbE+P>T}yg|y`4etgka2&`|nGtzUI z&xp*MMYTZ1Ny1a+?*$OTh~1J;z8-Xh%6Rj|{s2)tAv522i8^dTEO?aLEk^gqXc5YY zKd#tOVDVZX)#q7hgq-TEj~_gc*#sMgQi$5vz!vD;Uv5&7yhBE}Sf0f-cSFl&&ez0h zMBs5JzjjETZ=>di7DXK*)q5dduhzqL*s;=7>f(4MH}_yB53#$PK`)%MJzV2Z(@N&~ z7Pi$5jhmfLiuHr1#hN>sl;5W;cZ&#bgdfRNq}a1^R0RNGWy-#!GqFk?yJrN+GzYxH zGOKuQ*kdxk=+q?#Ex>7=^x7=aC$+UgYFwAELzR})xD#kktugME8BD@*JC+K7yTm?M ztovG*NtXG5E74>=NJ{J?7=WAPbM2sRdm)g=pa~sV9S$!5qG&q{V7(#!5)YAv;8#on z)ug2akf;ohB|3+Q6!VPr!&P7&u%RKXs+MxpSx*BTPfU*QA?ghFClqhu`PTt##wO^uy9yzz^Aj$BW2)q<5e}=jjgBKsL*`L~*Rrk?B@F=T;D3lv*=1&+NyR>j8a`|&AR5AuNFDMhZJ<91 zA39}OPqIPkZzXtj&>t(EuO>O$DGM=Lb1bUlg$LM@;9xyz?*4<2Q@{Zcf@*DK5EC;K|Jm#U`gY&?Wtmm!-GuJjnuIFWf zh-|GP^YM0qKW4CamCxNT3>57~7hNt9;I2Lhvph~o9)EBB-i=Gl?zh(qe{T-%umUNri)&OYq94@TR$!wi)($Gi3+5tZQcV7)Cc1+nUn@S&nT1;t}X|{?W620w;~B z>Q2v~_u8?nFZ1YQB)W%uG`Ko?%N>lvuoQFUesZl+qr}fMu{aZAdHpk%_)+H#L~9iv z<>1+x)M}(Hw|thL+$S_2*q46zxD*lB?8xR*Zwri?`r3g)fiy&skOvYG}J<+~Z{iyLV1CGF}7j|@ezj9gA` z!sTmy^_fh4_ zzH+@6TF-#lyKLyi(1y7KGIIHBWL=)Rt@3P+z0DJ{vhulg}%zA>~G60TR!Q9R4uG#nJOyO+C_pSkg2-|J*NDJmU-!1IL3 z6-Sz4z!|8Sl}q8Fmy2^mR@@fZ;F9USb)f!0E=L%9K#GgS;WT!5$v zdqOz75cNy@c9UXhDvKKzhRoB8qQF*}FTLKt5v#25pwwo(c20>lwMXeTq2)X=QFb{w zO(Dvi*opXxn!cb?oS57g6cf)09#6Jb@ZI$Z{2mOZ69dNN(DNr7sUb1g!>j}{@}BIEj1*umj9P;3QmYUOAbUFCDt zqo>%W^G{YxcX33=)X%E3oC`Rbs*h&r0|~)1<_#&yq-&--Qy|;>r8?Ri;YyP0Y{VlS znntLqIGH%!!HulLaxPFliKLUNr|$9$D3u}~2ZszM6P8*|$j%!R$hZ3on7SLT!z@Rz zn2N_NeNq?3_{{8-p{_ot$BkXk#S`Y3+I=1+9pzGQ^m+|Z;sg_GgG8X;sJK0wbMmI= zgFci`7#DLl1=3PG^cNj6kXE{EJ%i-yFK~opvee$?3d8Mpfmft*?-VI@N0}v8~u)K(=p~0>q??mXV|6p%etEdxxJAqGB)F7Q@+UIMc zjO04wyZ%*Ng^opN!YGd&9vWQcP@oe|jm1y0;LN4B)V@=SMauNolgkmy0j($Z6<}vz z<*V>&5GMj)WgyQ@s2UTSqPjd#qR)WNIx9e4{Kq9X&c!~H{qP((JD)-JgoeD7y%3TH z(CqE?2`y?$&4^lru&OfHC7z&!#FQF31c)1xmmKn%88k}=|NxyP5ushcEBdN-ogTN5k{Sk2@%oU&D+{P9hEJ*sZgwJ#l)X{9UJGicO{!+lca%dF_-Rv&Be)TKDhEO` z_7KQ{#>N}S35SWX^hi{1ZrO&T&&hEuw}dpa?Fxi+sE()eP}OAK)L8h`H{NqDIs90_ z3b;z6QD&_4a$Y-&UMtW)PYBvnKy3QKF-$wU^W2t!jH1`cZz>jhe^EUBY1&56diWDi zkFcSMsc2s}f`FRlw8eLz%3;6Nnq$0bv~g=nKP7xQdz7`El@Z(G%gP9aX)(6 z*#)L+v*!Gv-?k$}yATzHG?M@a;;euRD1BSw7TedvlOZ#)YC)a_3~OG$P&soktMN(C>wbL=I*H2I$KP@dZslOrfBV3hbrz7V6?((QfR8W`@}eX2TL!2m=8 z#6nPldTvS1?`0?L`{Aw5Vn*vtx%1YNlN$YjiiE zwQF@1Iw^qb?c*hJ&h17jMxkrHhQmyDy0yyz+L@j;AR30}Nmg?R%=Ook>_T|U8r>(m z@K2yw_U8xT1-`C;PB|-)g5!DmXqE!g1MDj`4Ckx0h1Nz!c&E&7W9dRHxU5=!`kiCBWsd1ad*3a#3vRkWyFpN&p^pO;Uf+_UgjZKkeR`qsW)xLOd#9BYd1x6{k4Lo5ph zgs4YRG^p6f_Wk9JaE3uNvIP5)4n8U+2F?07#0pa#ZmGM3PWwVT?rpeL&iP0y&6k#h z=3f1t9~$BFXUAw0&aYlfwO!BBB2b^yf-)N53JuZI zB?KG$yx#y;}%w$eoF1NP-$q zC~XiMzprZEq6!9KX;u)sfZg2Ke!8ruWIyCfHJf53<|(&IyIJF|4-@qm^Gcz}Q23fV zR?--;XzL;KXsgvzWA6%*>4F@&EVj3S82<(79ezU?(ubJ$AY4Mo`e|83!};>pP6C&> zA$fL{n-%rcB5_Ue!;QNqPBtz*3y<5lTWLmP<%u|AqrL z3hC%We6|sd#=WZA-&9j_x24JCm0DHOrIn^#n#sn^@zR~zCA*R^6B)|5xeU-BpKu^@ zZO*f_V5t+N6C0Z4_dTG;u$&2f3?n-c>JXZ4$Nu};RqLl&5g)z{B^m9(hMuD~P>`>3 zsdc08N0+y_?S6=cs-${F1A4RKrZ?r}(5SXn=x5m0C4r8}9x?11uBUu!53ZRV9V2aZ zc!%C1$N3u5AszuI5BuCHA|MQ$g~MYJoqmla(aHy}m30JVt6xkq>SRe=-E7?FtBW*x z5^agr&p@~lL+Oim+9iR7*p2i-Jrndv)0s5ClBle)#vz(3-ZS-cWjZEip!xf%TrT*w z64(l)#-pR-gc)7z8a@VV%)trWHL6CMNzHh>@G>0`t>#&)?<5h-&C+}ECDR>Dajx$NmO1{A%_nuYdGse`kaU~p48rg zbdtF7(};5O)WWX9&a14B%PJ;Pzhi}{ba zqrc^Bn18XNKS6DjBqI^&pxP%Y2XPj4IB;S=7s(Z#;@heh_374==xp*vZ}hAWNO7i% zE^GExm#YO8PR7-_f`Ui!b*nBr&imqH4iql2v<>Gk6_#+_^>6< zBagx+*P>5y>do|BouBW`T-fVmPVjWqU2653{s2Ld8)J=-$ zO?3|;PTj8E(}qd02-|a^kF*9{{Rp5AaAm;&P~u-l_kyZHM{OZ-L%&sSmNxD?xJ`@_ z9e8hXA1YKbKhw{dy#2gsv-5%?GvylaB&?%Ja@MutKoP9WwIc;p zs7YlU0}%$lV{I)zsWgVzQzr6!zkGAq-P@2aB{~>d- z9*GTeLl*{{8?k;1JofI76KefMPq{*5LMxUNa#+F3g2hE8{+@{S>SR_eGDn;2MfF0f zP(|(ilZF^zb`exn5s=dZb}q6Dvvoc`y)}X#Qwb7D99QE~x8_22!9XH)Q)2~8YOae< zHHw|c2F;yzGJ5h}gicYU5Z5~$A~i1$JbL=o+4a}2tAGt6Ry2DQ{8q6-RTy$a572Ap ztt}nhYzv#SsgE_g1T!#j4DoE+*V2|$j`MDgO#4fx?(-CTarQs;Cn-m=3SV355YwVb z=f*2W6%$`Sm%3JrZWfUN24>7atXd=)UZpLu6=o5JyH#)^I&k9zym};;IVYN@R|Xe> ziq9$g(Kyf9i0yE5NQE(}b6C^I+Uv*+yBj5aI?_~Zx zR`G9D&H2mi{@FW!Po6R})BT=bX8w!PO$KH*Y6jL{3ix-aF+CG5)6Z%E2Hf|Lq-JLM zQ#t0JQoBDE0Q@fr8Cm`qaryI^_4icvyVZ=0bkt0^%#3XRe>3`b5yqd@J2Jkja+z@H z=~$@W<&N|$??%(pGgH6I1pZQ~2Q@X#FP;C-`VRZ|o=P^Z@6`=7W`;C^e^Vt3x#%0( z{FKfAi6Q`&zbbtERj)$FN=Hr0$j0`riukG8WW=R=S8Xyf|Ge=3))Xmg2VrYRD}%pe z(qC11{ALmZ6Ez(@8ym~}oUr|L!k?8nOz$@SML+!io*h$ra|u&RQ-{A~%RhF*zeh4z zeu;Yi#O+>vEaJ2QdM&f?0oFO8Qga!w1+2zw%4teH>-)|vfmj}8a9pJE znS(8&ghxaqmF$kl6+!-i=r?cg$xEIQqk>M)_Luvd87{7JU8kAp?=Rf}E@O=-Oe<8c z+r+0v+l7_#?jzD~0nR0`0o>ojuPt6)D-YkR4>h*98p#-nRVmtm+r1yICla;2LuuZ) z)~;sGKQSdSja?>=&?K&`><%a+7FfDHgAQk+w2b3PSZfz*d&>>4#mOn>hlMUkl7+uV zF_X6@h6_S(wF@>jhZ`g`X$yGOf|P!QQy*i@;Om&&GMVC(9~?*V~qv}wXmp;yb#QC;pL zwijPi%OA}&uJZy5Q>OsfzDP#xF27v)AXsXoU}<;WbYL=bL7rL6FFkv3tc{ZUX=B9R zXxFNxax5i0K6!1E8FAdM#@Au!{oO~8tw9-e}0-FT+JQt*PYm(8T9Mnpe*D)wIhPTx!YZggo*|>yJZ<(!F z77laBuf~~mJn!d|7w8$3wMQj*&zNq>h#Q(E4e24b+|+v`I8Za$h#a9$2G$KCEfB zDactfG#pB({@W@W&6e5?|KwfRRqd?wwMM=oX69kb`y~!e8`QO|Hzp8UoGucuwk|j}q`$F^tXL1#! zQEJqDP!q^*pJ8a!WUw-}4hZ07;uQ`ko?%!(Y_Jk0mN5-0C(fFlQV^}qR_Umzz4Zcd zEWtH7!8>rAx`yyEaU1S?$cA=P_T@!5YA|P@VzCJW`gR~1szvd(;&yIvK6yQ!Q%E(@ zPH}kOGE#Wq9zthyuOwB)fXu-oAnMu&0@oJu4b#*5tPH98=@#K?`m^#)5m9Q{^spr- z{>)l=V#YC}dN7|}{dEGX^jANjbywQ(RTHKkG#Z6N)Z+Qg6bJxTp-R_Dn04o|zA$cg zaI+s0(O#C9eMfUXF}PpM3b{1*?AirkCWwe>tdg>F@}b9jBdH%eQ_L_KHmpQI8*!8; zEHy75pOUjDl?!S<#7r_G#h+pef`*_L2}67`i(=fJluZ}`fIl=dmPag(zl4X=k`XM3 zQ>_J1t#S$ZMgs~L$~4)w{E<#qkUWJ{q>R;904g^ze_dOVY%YcfdF@)UC)UPn0d-1~ znk)IEX58Ek$7q#6JR9P7Uh8NK4++B$hL90*a5&W<1Cl+~lx)mZ8%k>reli|eN!z$B zCH!qV0WrHQ;Emt#a+OdHSZCG1WihBno&1{==ADE#R_#?#kC4_Ph=f&g^oCc`q+--s z`+OA2WIo^M31AQL3GUpjRWg|3YaVOsTqq$dc=^^Lt~;oRVKh!`GVfhREK1ilaQJs- z@s6?HM^KOnO~`N1ZZmYAzr3T`KhcVN8Qajc|HT3m4G&Y2fkkVK6MpeGieml zP*{TsK9VO77ELCTN=9}|>jEb@BvQ#*D0Cpu&$J(v zKBx9bN`1?_`+%&!SPf(odsu&8vH$@%RuOc7W~b7mJkwx?ZWPvTp?5^a%9&2~az+>a zBBwGK*Yors(F42%3jh7eZ-BsbP`olRvx4bR z+r2NIR1(wmy-9F6${a{GH|<4LuXsjCfui%Fs<5*#`rh7k1IxP1?bs}!95Zb$V*dk( z{k=3_uBy4F1(a;QIh0Ft*0YO%`{dT9Z*XbJd1o9hezl8J~&4U`%P6WwIf(*(YkfvD411!T()skHBC_?5$`vZgZ{?l ztblrK2*d73(nP3Vv9J`pIYiDyvULB^ZTX9BwBFEXK0>~*Cct)29DtP+m4`-T^10Px z?rez@{{xlFc0VTxqCLS=>SqZ$gvbg(D6WE)3{-6VH`4F4oo<{1opWwl331X*Vmy05 zbONe4o?YSu5iKfxDN}+&VCRP#fP@wR$`uV38BCUSbfU^_m)}8bJ{XL(PrA8-g!MKv zrs<~77Lf6$GMA;9Etx~d?E|omO>5&4_2NHUq#Cl1`_wxeDr>Z@uChUQ&rLb$ns-NL zO(gTC-&rxjyUH2Zs)ucwesqiXKtp^h1Ym}tUGal9?Qd^oS!QY!*Z7XoP~Il^yb}N8 z>(ZM*lgv1)~;Tk^mBqbj)}R}C`N%{WOu2N^GUn=qMd+1zbzj5+?wO39yA~% z8LvuwP;2g4e+;yYd&lMPMI~lT4PsEnPUwf4QzRXi#E;5fo4YTLuuojDw_Pcn@I-_|B#DIkYSgO6vButgCqcSxMR-O zw#GR@UPa7GRjj)>_TU$HJcV%&PQ$wAfC>Y()|-O(5l$9<&rlLYavK8SA6JY{i=gn@ z+-Tig*0WR+Hagd^((AO?^53A?&Eq>7>4!SV@AF|&hFW3raF;CEoLe?P!acIZht_$q zc=VmMhJ;eoC6E{sKA6h`)!K6!H-bbwoRGersa6^1^q|4w?8RlY5wiC~3xQsvyhQA0 zZ*m%}#TOBSxW^&9elbZlk;^OZ8N~|ra(aPL!Yl7m7$D2vHk}}dbAcE=w1WtfTmnUa zz^;3A;>fwOft!&1q~G@qaYE@Ck6?N40maX$W<|9u>sij=Rj%=>)2vXS>9T7`jy4WA83&a%aiV1=w9=!OS^Wwd`8cskjN* z#Ue|A9@If7Wqho!6}nkKQPrt*v^<@g^+!TXTI=^uQIKd;<{(j8Rh%|tkzSp{NDF?T zRPE~^$=-1-G<(z5eg&YEEZqAqLIl4D@YErGF>X1CU-a|+;WuUYFHZCR>^D*P-?i-T zjQZcFPt@PE?94w+`Dcy8dsX#+&^Y`8{J%5~EdPi#yw{!mZq47B0qZZp`JZ408s8%* zihpVx9)J^o(GP?}B6cnpqwN}pJ~ykJD(0Bb+zAdVYVq*OGs*x(Hyy@cK>|7-a~y~Z{m&XvR}TJ z;nnGB_vX&_>5+PDDTC(~c^4K@Gl_0L@_b+Wt?%)spRLn|I{vvXE%ae1(c0KKMS4?z zdVO5@(fUmG*zuCvYW03g4R3X!_1R;c+h2nx{>AC_^yM;f=CpUHkxWryxcCWF)|~pG z4_Vy{sax5*DxPOFWlT+-qY5G=2uOE#t+nV<5h*D_N=mv>QW`|MyCg)q zrKLj}>FzG+Za6={z4!B;?Q=f(F0bpn{}5{d>*ii#+;hw^<{Sfdkmk6+t@Wqcpgxw6 zoJwwdQ&?M&$&q6kd~Iksn6|%34({Q>bFuX%nyBjBY7Z%|#pmo|j@Xucag_A4I@?^R zEuF4jgrtccLrV-4DMRg#DxKWua#d{_WCyLQAD_s@Y++j@hLyQ*K1}QzX{y(X3Lkqd zLu+N0kRldYaln{c$eB*Qq>fkjPR9>XQE|Aj^h?jUr=>i{JZI5|cP>~x>B&zps~Md!of(Kf%H%wsI=d z5FFaTdWliK?|Eig-JuhGimK@3%|(qWWO0`BL=xWo!3afGrmXh(J63^JO936r^m#sC zt#>SZ+)Xo^Ni#oN&L~}>*mI>3?+|}^B>VdApio`O-EC(Z4-&mtdzg>3E^XWtAj%hh zMvs>67!M;pbtm33QCCOwG2Y7KH6T5$#rGzUz=f?Y7#iyzhSKWo%~m;49Qqj5<-9?yQ;Ci?zM#_WstI zD#THQlAmvy9>XehuXchXh}0oFfn~+fKg|U_d|r$2bGyvF_XUMRQWnJu8QZG&Q3E00 zK~jgl&Kps8925dpy7l_d77DbH*os~irI)95#i323Lv!k}5SAO1nY!FVSy_vzLs_XH zGz)>WrhkyH9%9G%a9op50-oHN445-C8f!r@75lId&DGR*frIjjv!3`p!F0AUEMnu! z;Se!Qx-@Il#;;qc(0hSdr)ksXO*AsA11%j|(G3dP)aIGV;Dd#a)a!TXO~;#!>g4TT zT0G6aR|^*vxK zteX3j^KB^lyEy)CuE@;oG%-judw#&2x%P?`b<(Li$CKt>8d`eyUPi)$dJ!;fo`O-#%cg4;_}27o&^B$PCr%a(oK=pk(H`MM{0WwQ6mM zHA5^dmmAEdko^`h8=n`V9W28g0?C_@`3X4Jmm9GT7X*h+-sefwxG^`=)odpR5CuLtTiY<~IdmiOMhzZ;@Vq=cc zpfJ}^LZP}`c`5x-<2{}Dk9$F+#xe+v@b(^X#4}P<_GxZ4X-~_vL*8Mda3e;Oef~ge z7uk{fMi!D@h}-l8)U>tZB2v)jYHSqV+Bm!W(gfWf=hNXbS9O}hZ?+y zKMko87>5WsnjPK^gv?gA%BXk8u|m0b!yLp?l|41u6Z`aHnw3EUU4RZp@1m!+R75XD zx7~q(W)>$6AAZ5;;44r0Ie)sFGB<17w#8{lKN2NB%*W(7Ds;_d5UwBEZq$nuf}U7m z4RA{-SZA^c*N;(aIe**-Ot|OAPf%!3IXGzI=M^(FWEAlkPa=5D>FEm&(2Q`%*xgi0 z+<+Q!VjKDU5yF&XJWux9#HyBySst&37{(3hrOIcQx{GDnznl!o_4L4XbXM2#_0n7# zsr@_{?Wx5Rg8Jh}U2b$wMvy&94gYR`b}_sEoMgV;phMLy8|yI)Y)S$nF`~ zhQI$rW-VD*^8rJ~>EZpb!38*5oCmM&+XZTh)ghD{^%L4Y%kU}bEVZ;+G#(@Ri1&HI zJH-{dn^UeUWw%1#>KoI{N~>JEMhLmgrUq@|#wK>?MYT=_!FjJX8+r?Vlj*s>a_~CZ zB4UWoU|Z%${U8rt;68J&0a=Bdk>X@QEtC^d9g_>pyo9TOxQs_M`&oXA9$K|dj;~7Y zl=ul7b|OlBCQJ;2W04|DJkf--^b14;u52i;aWjq5t(syv8R)0^bVN^%YxH4Dx~nyI zkVfAI8+ET6f#1NcWRziytA`cL5I6b^ehFB;*D3;eG|@puIW_^m+QZc_Ai*x`MkX8G zaBznRHFXekh7P1rTy@ItJCqc-mMue};3;DIgulTKtpl@odDHXz^8{gkZ0NL53>8Q$YA{50>}YYU6!DlA%GO4+sCPuO4ASJv+%WYFsW z4xxZEKX~9RE^XO9=ETpttNYI6cRmzoh1*k9^dWO-_ZjN7J@Q1}XX7p3TMCYNK04lX zW{cc@_n0m$7~wsK>}Q6%yn!`p_37v=iYT-{yy>u14-vb|N3=z&^{JAT|!( zpO?#}SjsQ-Jj_OpT!Iq2H%pNbxJRnD$k zXXnz|7&5Q5SBYXac-;$MAH+OMmNJSC$3SH$L?K`lhRIG$p14a-k-9{)8W%or=-Mb> zHCmR@@Z*#V9=uV6qmrg-{pKz2Xy4kwVs%CkE6MxZRENdqd9*PFb$8$JnD`5S3+bLd z4Zva9$J&knS*g~NtFia>EXa*H5!J5P^u&<|oBw$7VF}K-PW((`7Y@aK;G`N(4sYX( zG(b4~*vi!9dT$Lwfd`L)s~&z~ z2OLn;-(UEzl|CqBM%h?UHmCV%dXV@v<2k!vJ!YQ_YStkzO@)VFcxVmdhN2Cg`)<)is+NR%v7kSZ0Z<{jC8A(8+UJkh0RXJ^j z7E710Oyjl9+k|biy-^36lTw9r<+4glHl?`6!(kz_xnheU)9^o(%r9P6dX6a`a1vmMZnbw z@!T#V=Jpwxd%iGbc4g3W3tGg1cgYlF1GEFg~gVPCKUNLuTH?`T-OPJe7MD|rlKQY{<`qS?H*u5hm9-xAx&|amU>QFa@2Katmt7Z{ zP5OS4!E|S0V(U0x_33=(%lMS|)WOGbCb`s;2()@1rJTsVhPxQ**Pmv?#T}vG@>$bW z6pq7Exn^LWnzFiu%Kh~ zgSIghLu)NwaV>*FGd8!WHjJQnJ1_Gt+(%ycz9pp=-p%_g=O|i7!50!a{GIB9;#D{t zuT!3)^elVA)AK+JJ$P9k_{1n(Q&b@e`zXv-mCRZ;m(DLhlBqug`=g1bQ~{zBKi=BxaQ}f*H%0 zK3nOiQWnJsh(gnByUt;_SImhSGld4v>WVO}=F*ZT5t>U#yo9%*qCj&brbB(n zVnMg&0Ou1J^n}x-KhVJmcGUm9>fsR4v3@Wn`msU*c}OP*Ij2MTOShR}h6DK>|FNkj zNg@^(8Yz|S$l)k{!m<(xESf@$^5wqi=Vs6KrOavg{Kj6|G%5)1?u%>J6`2n}Du;u7 z*wN;qNGzo7^3TI`2m>lZek{tKlgAp)OPZHvxD6#rPxo*=kZ$Av!MgI$hn9l8(FdQs zRERC0%#Q%I&g=(ih(`=_4~K;A4A`MT`)ub3ykl6*Kwb2wGwP3eQ8mDr85-vAdmmID zBYCe}_uDXxj9K@}PM#E={=Tzm%?v*~t%gt?!B+_ZM#f^9 z(UhVA`$~P*`O2?BU!Xt4ZN?Cq`^i?bzkG&VK7>?5zn|-%yEV#KMacF@D4ZpD5CLle zR!E{W&%v_dHJ6wVY5bkDZ#p=gTgvU+UCGu5lvs&*zGxEag@;_IP!HTwA}#u++CRO( zveyt4F#m?^r@;t`Z1XP;7v#X7o{&`1P+9h}78%7@>@V{kZpx|%aUitO4doI>1u5;l zipXdjQu-XtiL|;Hcn~(9=Q14n2DvWMC|@;DNW?pn%dA41q_KEUZGHEn*+&B*#-5=M zpDduvRFvD-d;=z4h8r{QoEn3+vJwiBG>X6ZmXN&|7j}m17%{QX+?mmLsrE&Wqt)g2 zKd63rd8js^F)Oe`@A8l*j~$E+;wBF{%is2*o9>}W;5NYJcLHh&|*?inuZrqckzpqZD{oj9Mf63&I+GX6j-t{Fnbw=dU)0= zCOHOeU`Qim^*Z&VvuvGe%^QcSE>q4wS`Dvy@1SA|A1+of${iVS##k|rqotVssZ%1Y=l>F+F~ zM~mC3kqGCGjOI-~Ag|pKO?3L+8+4D@6P-<+d=YkmVw1R{-6kFDLRhtKjxt#35DA0J zM=y|6q2PGr{Mh0B2HnONg47lz?~H@dq?aS0V*+gbGsomCkzrPCwNDTOmS)HM=RO$d4<9yZ*=yl)eld#)+m-;@1r{GGRnj6@tMm# zaH)J2&%P))iSV^1X6M0>#(B)NLY~Jp5{I#I_l;&&IQp}P+CV?G$4j(2fGO#GU9~RP zxcQDjM1-QTZqreDibHIBbNQ8wtNpHbD>X$;Qm@Ac;{Yv2O&3oMVfIM#1JJ2XuD1u4(! z-vb?u<BqzEkn(+{(KE zkEWt=7^CrSCnMs3_{F*9F@qCr@e>-;9|rg#rv&)*Uz{;!lgHfZd3K`YDGcsf*pL=G zub7vU);tolmrNmYeT3e;BKVnwz$vPRNN}8vttZd)c*t*?xvS)BaJ6)W)MG9<;dOcH z+Lh+#3TCVw%XxyrM%7v7#W|dEdc_xbZvHWb$S_U)V;AL9pZbS{NiwIt^7}Z^m6|{{ zvGA>Pq2XKNRUfKlDM>(-l_DGwdh?pM-}a3cnVj)tgwcnCHy=%y+V3BB8^wm8KaFyH zM!h)Tu3R>t?Yv&X`|cfwhQ|R%C<7&f^u_E1FWA)n%y_i?5Z+r4}v7kzGV zxZ*sGi@d{|XZvvY^TtJ7iEJ@Pi@11hdoKTBP#^m7ed9VTTl0v$noZpQ+pM+MA>HzVR3gAa|0oAWYS_ zK4UrE#eBkeXA_Dzl>7CaB(fhH_uu1baR{H8M20>#f6=h0hcC8XVU5`xt2(w-Ncgfo z5pBc$;rEsI9y^&KZ(%T!&7_yqJ()Krgrba*(?@*ZonR$1-W_d|i5Mi*soVmeqYz9@=0{lX@);Mu9u5Mik4y z0HM`xWBYT|J&_vqSPhqM2}Z5woNn($+{#f`V){QUzCo-L**y}(*gm==2$C2{>Lb-0 zc7_lj5im{Imk!@+5c0%$p0~q4DDf)obW0iAF5yUGi+ZVL4b_o=CM_~nL-Zr3=%dhw z-^kFt(`^E6`&ub0onycp`XoV;ZZdr&dT+nX>SEfw;7|yj;oo`35xSE;6G6%A69rEp z^Vo}A2rf}$z_~5xbiU75#!@POjcXb=Zm;J+?%^?mpHcg%=>&$4YdgN>{7E++f*oVg z{cLflX>}&f0g`FoOfeH>HuZa9{fXvwDmEkv%f}KZ*{|%qIuVQfQNtI6MJE^D_yqxS zvC56&Mr_b1rq+RDFw3)q{-P;s1XE`Xu}R=iATWbo=K%rYlcYz|%hYdpWnlU!$3Smc zyNW=sdB~{Qy(vdzcs}9Qtdx41i&|_6wvt6P<=nl?e(!0G|GNjr?6bvthy}@_15+E0 zB((biBwXR_OAH&LufdM&*(7+Ws7_55CthJXAqLsWIWx2Z5Tt5?3Oy^9GWh)MJj@5hdVG3ra?M! z%pU$bBwMzRou)2?%!??1D?j`_PkzgDoSer7Sad7d`gKJ6HlrWi<5!jHLN*lRaO2>lnurWv#EG1=}p!AKhE5l`L zH$0r|xE$g#O{!j@|DIQ^lT1N>uu-NXFoS|^u9;g%)(Nz;poECX`H?6h*h;a(sz6Hv zXp$0$F;mBB!c^m}W9UPN5sZMi!D3wdDN?2HZXLA^UoiEvXLsem-Jxuc0zPOY5ri_1 z2(*1FTPSbn8H4AN$t-^Q^lesI0BWAQ{MQ6K_sW*EOiK1|^Hsh2)G^+Wkk2mPdFNQe zgWrj{82APVPv&|ACF~6a}UG6N8Y$w zk#qKh#Iic;C8BXamoXK0Y$HLAVx;fk9eQO~T+j0PWzb@~kDik1sO8C7SJ{WWhWjdw z*o&S{60o|>N1rFAKI*Me7k(FBBuDl+L)LFGjBX$EfK#Zdc#;(^X{n{SA~okJF3Z#S zoKPoF+-et!GfrxngalP_ir<_@te#sqdd%28Y$`~d%8$*d!2wkXI!yON$%6SoB zcc>S?hV|xreKC!D7;B3075;>wji7Kt@X08FFS34pdl)*crQKs|cHC9i^?PpCp)`1W>*kiTl|n=n=a- z>;Dl^$d_vNRB2ylc+}M~&@z4~N}^fk z;nz+s5B;iSbE%#pf;ua-22EMiBfktIWeT#x+8(yLuj3K#dUni@@BV;4vmCBKn2nJ0 zqH%wy&*V!d{`8`|k1|MFw4@*ZBk^6%eT*ZNp^Mf!{3G49!* zL?m`-ky=Hm8@7(Iu1|R*T6pojwNKXhf+**0WAY4BVa4?B=css?sYh1!`6Aq}j*h7> z#6@KJPuocBb7Eo&6C@|XD(S?>7enx%C~~PCg48&SQZl$tgZSKOqHLVpxNM#lLlwtx z1mrsMgy}!88-btO61LuaFYl+$!b8VY?7nQ@{O%EpwrcK*yhiM)K?r-SzaPm6dd-pI zz?}sM3_KogO*uxhQyDB(##cnocr_gpWGmrM^jXeja@324pEq3dF?&N^jZrf#t`P1h ze6z~xn0&Um)4u3+hVsyu+t~B#MwqWoSowbK&|Ow}Ra-QV(l$Q}8DEoZvPC8xf(1H) zl)+{ks~j^d!;ql@20N3SP=#%!1kG8PAAC$jq(Ya26du%=^K=$0LNh^EUz^iJiRH5Jvq_-u#x7t9-jw)SeB zYK$ZY-@oNrU=mK3&pO@BBM}t*cPz;HzcTT673BSo#NSnjcNGglnE#&7!13~BqtHeWO#s=lX^OMcq<<3XGQN(@3f;3w1%qowj%X?2AZf-I$Yk4?HXlTj6QIQbiEs_5Q1D zv`{BJ>_LMv&GbI<;EHV+t%{#5w>@@T)#LHFCsqAv(s;~!bRa{ zmL!(2-BX+5SKJ(m;=wvwUB-PJQ8!uQiV#NfOq|8Npw~fJB*y%rI#aV9hSRD}Ts*Nz zANziY_ts#Y*4|)}6)4y!HYWg2o~0P0(<3@G@k5kWAGQ)U;X5)``9Empy8XN;fsw;*Usv5@*nxFiSvaX%2!O}wtv##v7edu+$ zjcKfnNyv$^r1#`;<({SCc(e*xJWo7oAlLJ-gr{npBG!^E6>!yR84|CDQmD0l!=_Lx zyga@++9JTu(i+f>B#qSi!0Cd^UTpgXVy6Jiy&uZtU+*_JIj2+d5yKm=Vw5K$JS_=7c`1%As zE9qWj%N?-4g6O2E2bpc~UIc5cqF?~jP`oLbSD6ZdswgJ5#-m__?YLlQZ`B{cDb_l` z#+B8f=fjsFAzcV#p)Kg6)6>OJ^fze9#MvCdrJtdaf1)b4V~~-A5C^LAEh{KGQ*0Hb zV|`{y8K{|%YxtTY=7?|3?cZ1HdlxHBu9F%)g#8iyJYgYvVD>9okhVJg)AD${#BO0P zsV5;tiQo6I)|Tj*adg4o^%MSio`b zKD}bchX#g>=sW^nqBq>RLcFz)7KHI<;a9=~uv?>p+&0bi>we@w$ai{JOUu;5TKI^? z@1b~5FU;zlfk*kA7athPP?}cNy_$W_{tcSI#Yw<}*YJ}pazoF_NHJ^3`{CE#o6b_O z%dZVs5e)O;dLJcLkk+tf$tFB$o6`<7DL8m)!Z^eNM%u}XS&0owmPMWT^dKXY0F|Rk z(+x}gB}~Gb&)5k0CC_U8a5IQCA7S-3s?aW*^6Xj-=&546Rrlt;v0cEwh09UEy{pS07&h<-f6BC!;)+c{_^CFJ2m0#s+_-$ z?)Eb=DY(^kXec6KcW;-c>>P21{m4|@@C}2|{OgK5-m(h#ck`5laQZWoyB_!sLDRY} zyS*B!)T-F`eS#vO_Uv=ziw$M<1Lu6xb*Z00pHIeo7~hb6BeAFY00Y0AZ<>*~$xTN} zbJ2+&`Jp0(Q*Q;GHvQe>JK$s@gaxK|wd5=zWfsyxj~_iG;hXhk*ZfvaT9a1$%(G)-t!C`x5%G4g)oR zv2i!Mq{xY;?kCe@UVhRu3Vs4dSVMeWVvAs`v`SNJOtJBv3-UvL=nU?HHaSOgm zF%c2H@A5Q5lulC3pJ$&HRWf<6%dma23s_to<9e)CJA)IM-9rZ|Y;3eM3d}Bzim1qA<|F{7CT-x|^&s=&@Dc5}!l|8il{sP+~ zMi*O;p)<^yGRaDh3X7sWzujJhHOB}#sG2l{JHEMn_NzV5N5g-#nj7(%LB*GM_GaYy zs;7CGJVGCzz%Kpi8<>YildVgatc{)PvGdgaND#A=fvJ0COfk!ogpDL6e7zEH_FdQ*^yOQMuj4% zzo!4bp{SF`q9fb;EikkR#IEDFk-VL-Llyr53(FKf=)IBIhp%n&aIS5`59GgzO~)wG zZ!m1JV6=-nmDVaErGx3Vy2PWHnVXz%DBUu4uc#+D@qW|M4J@CQrYx97@R z5!_Ps*o_TaeY=WBt#EFUqLh%aZ1*Y#=OQ?nEk{E!XPhdaB49H7>FU9gEHg_jlYJL3 zN%V{IuQ}~yO6t5?u^3fHc+~bfBl%JvVb;;dJSo4`RijvM(EaSnFJbA}09rdJ!fHe{ zJ$J@56#94o&6!bc{Z03k{qRm$wx(le(h2pxWnrZYTUab^*81`!OH2G)1cqEEANnK? zA3?WP=s*-hb<>uMdrN9}S|X`_6ZrgdvFv|Q66`9X`JaK$U&%T!GX#A3Z(IgJz&*Bq zC&8{dLEqrK=&N@BKIR8ii!`TDct(r4L0!VVQH*FMZld^dc2Jne573mY9ahO9#;spH zXIC>c2Thevc61+oKAj9YP5QC9rR9iC%jQDz`k}sNh51V@R*FK#ws_d>aOjxN>@bHZ z@8uBUSy5wiE1cXOE|jBw>TGrn4>U`9ZgbGc!`Ct|se!QBHlF!5C_&nTC!uILnWQG+vR3K|Y`MooXTl!ZeD^>%LLgb}+j9A6VKm8=>L4Nh z(|qZeS5|J*8;6HQX)C8pu1?gLRJ%qN#ZP_M;r*iUaYfnz+4INW z4q=NAH(rwEtMcHbaVcr@2#`<(IQupos|qH^_WEd=LEaff2@Y#mc*Cn$3+91b@t&D! zzNnVjt`nG--{PURjvY)GAMDNJ?j~SSfi3diY(N9|sqCTnwmOHMjqlE?~_t$8#=?m{JsT7{j9*lnIaa$h45{`?3h&hQ+4&L7ix z#-@eXT9Ho`xGV8EyWB&D0BihdnbXp#1+Ud?F{4*2wR$D7O?r!EkR8dXx(PQU3u7$1 zf>A|MF=DCT#*lqz)3Y4{T+IM^uvtZmp6m+L?%RHw67SzQ%0Jch|4oi^Rp0;5=5fI2 zv1^|I?p^=oCm>*w$G;o}1YB_i4rTwJJ!MVlMZhQ|dUoST&lmBuRq)F1FZIuzFH0<`Mz6~>m5UvuI#HbvFNYWoDIA;ytf!8vaSx_a z1rqE+)oVRJ-kd!skAM6v!pTx4<>Wmq;wxysgYx&~XT9rdFGoy%#_^F}s3!n7h!1wt zPmZ|n6u~;%-APyBz6)ohUa>N!DV6YYA*W!($t-Dx!~S8`$&W^aX+A;~JK^lWy#DQ+ zlP=z~uXgrkrxXbY$+2l_UJB-o7)y@!48B4oM=#N1jcRw&xw8zmRGf2D?)3?GAoRhMZkIs%2nEa~Dxo?u4Fls5Nf0QbA zJU>YNbl_1x=IGAey|C!1!hVEqLv}RTISTB1t9)=&9Mc$Po|7N@pGuGBH&o)9hJMD7 zc_?QS<%v^NN18!Ss?Cq@&wy`(Z<~agGF2nUJ9TnS^GyGpZh&!u;M+|D*Vh_iY3b}} zDJ^ETw7Lc(?hSSpHVH@t!Y=qd=$OYX{v85G=y!9z8ss5oNmxr5)yLdvj3tZ;KnqB| z*!*GhK=^~N|I6=Y%|bSlkEFIxKFSNg?-*;^la^kXZV3BKtalM^=xRzbE8OQgL4T7x z^5mfdQ~Rns<lusfMUOt`Zk%Uetdi(K=iBiny_UMq6d&!h@4I)$20USIZ{F;_2r}g$ zy%3rcix3_Fb5WU?emJo^RX3D7L5ufCGB#&({zUoKU+>;YNJzBlPLiQ`k!}4xUk>Ax zR=s20K|-xRA{1_;K5p^5q)1F>a0OWpOpZ@0KrinJWN{PTmN3@j?J$k zx`{lRyoTam%N!{6JJX-iBuc_P4n@^0!{9kVEpiV3LM_wy{>y-<;(~2r)SR{GO7z>N zZx|1d;Kh$c(aO>(g}g+hgF|QvpnpMpoQ0uwk0U>She}4`IK@)!e)*H=1Ycq zVS^200_=q&2a^`nhf|80m+{%FM_y%AF>eZUG|5!EG?O(H;jb{b6WTnfR1&7Z@4FZ# z5pFf)9Q^j=Vy?wV3g(z8-W+NOKxi^&GU3MY%3u%bzK_q186K~YvU zP1x*Cqw$}qm<%suzim%9b4pu1ubQ*^Km>2(gRd7D@iylLp+kao6kz(bSC8Au3}D24m5edNR`bcG=Dh^333L)s>dnvbY#|Mtfvp*SMqH z){!?#$LVc&D;yzn_Wl(27wV8meRiR#bw~Dn*i16>n??1P`A9syVG}kI`YiF>65jh_ zD)DUbn7w}H{wlbYk8?@*g2fh>f-d=0LN`oe5^%5&+tgOQH!Z2SXKsa@t&bVjeljOO z1!X=kEm*xD)^06&!ssg{bkocQGL1e9Dba zOTxM_JKQk4@74ZznM|7x6r5%b%@GP{Uh{N9nF-(T*cXu%U3^|u+brTEHMi4rzxAgo z_B`b~oUcEh;af3wH*%?E%;9+^%D(mU)+K(Mv{5$;chKNk@Q_9z7pfv7cPp~)fH=zf z-nQU&L0}HYwx^5`c+XJDd z-o(9eV5NG1p&x(1e79l z$DkZbI_c!^OV&^sVDsG0_BfJL zv-JK%tDXN8>X`G~3*rqU_Vk3hF!z;Gkt;yNFx|{06VYW8#8A;DK>!*aP0|rvW~G`j zOiJtpv+dId_DJT(pozhj-nB@<5|E(dhTzji0`-BA@9RoJGgvS&ozImGu$wsu0o}W;SXgORyldF>VW*3#%Xk36eo0)$p$nI9C zLKS?aw4|Z*6vK3kEv!wJQfWQKSQYYF-w9^!z5~+!H`hE1GC8$Qzph;js;#>?WJu;K z+3A{{8E|@K&wK0@Jk`CH+?|Wv;1|@)wijUvR~v`j&(=gE%Vn1s+)MF&C%O2lsULL0 zn-4OzR#-GEAsMBc$hvobS5h^ zCf7jn6eexM+QiSa)F{+VLat)YBzp3S_hK6nq+QQ)%8nO=wKBU zl9;F{pZv(hEJ~-9)j_!Jfl(F}V`6EGINCn8BFufVTr6z8WABhd=P|nf*Z%tHO`AnrYTE6 z`WD+keKcJQ_S$6*AI1`e3(q@wtG_wA@kof+Z^dFSnXR{HciBj% z(uiL_xIHq_&W^5Bgd)kx(X3(S^?AhL#a)5oyrX}|iXi5HI*|M?3Kp-!!2hwWx())b z6Uq>df8xde+*sYB^$jN@2PZKInCSun2H>&+jeu@8R0agh>b$%k_^+ulAm+cWMc%L- z4J#|q#0B_kmyLG-D6Bx!Ay!V{+dqK?^q)sAZbAwxFk^?94Z?nj1kB0GcnO4s{l=t# zE^89MBL(!2b=_#LBr7o3j{_K+^b5)*DJ(#XqCbP>KWh&+Ck4!UMG7l0)fAXU%LeqR zxv8muu5ZBp+f+b*We9F+D!{Z~W}u$Jc8%rARDgj~e+J8K{RfzB3YZEAa>WV+%m@OE zjSURBIV=CofdEJRXXkf=_lFf=1q23YxW;nD%GLPpKY#`NPm%3LcKd5o6*K6P6$oG> z96(zsHW29MtX$tj{G1rYb=+nfPj&-e+J8c?#*xT4uP&@g_Yx4 zYk{%jfJd-$-dt;eH~06l0=}gyvjUSsAwaMCUr?@01<1(#87%)~TW)45R}RDq%n!TN zTA(Kx2rztBU>N&NWd+c~|H8^GUHOs~FbDAB*I2Gt0skp1w_FWD*Q~Hzi!Cr`ml^ms zS%J~*H)iE3nfjY``D#GlW!P|2vAtyF@-4Z>a>)t{>m^Bl0?RFz!(XfbGv6;|g_(sB zP<>Wl-0e+C0e@Rp=7a{%6Z4ds#)2r%^c&tSRbYWPc4fUbpC4#dI;Vg-gV z1JTrtS-Hw4{?1fx>B?6Q1O|q;Ut_s46`&jJpTTm=)$o_80L}9*SpnpP9r(-&xw+W> z8c+G}73gYG2K=^6|=6fKQi85YYSarnd5HKIgw# zxf<1ZYgPaqxyEwM3h?b8!E(#x@E0r0*J2CdU}*!m#>!~z&Nh4 z{B0|L1j{X#LohQi&z+cs^IB{{fUW>>6D#x0)t2SIMYb%r^yN!dnAsqIVYy@l0@OwR z2$ugCHFTqJtDd2_J^Mz{Wc2?9j>_JJ*M%#7t4$|Wgaz>EJ3 zmjA1D8R)orEh_*iz(`mY_8W^WusQfIq}(#XzV;tB;$Kj%{RjB=Pe8e)D_@HW3+t8C zLcl=O1awzoVY|81{u(&-Z&A4#J9SH`y^INdVYzajOT+miSZ?XczgS`Ul|%r#^#TV5 zSb#m+O&6f+iNL=JR#VEMaO{taX7U!nrJmRdkmIDym(3(L)= z_E)?9f7=R>0Jx>9{F2&hELXMyNbR4&a?54;7b}44a9njIhp@8%ExCcW2y%0|1y+sU zE6e|wTyTTEJL_d0;nHjVhI7fymE!&pIJaD!fB6wJptx7ufPq{kV0A2@8*47;dQQV{ zJn6Q5<1al40*DgJ-)OF!3CNlL5jeMQ=6gjh&?F9qv9sYrHEi{*G{Rud?TpzE^2EqZz@3l)^#&|$l2?FG}Z>qq*`WgO)n_K!f zE09rVW??7(2M#N+S^_(OKLqENyVvV|G=v=x;cJ&-12VgSFF-hMuEW>O(0}7ofNb4T zhnX2UflcE-a4zizShD{RoLerIzqkP){Nm;+#|#1B-CT-+-NWyt_&-{=+$aRUsuTf^ z2>Bb%l~1uU1B&x!0NrxY{Kd{?;p*CQ*n#>4u*rekqIUJGQ_R1;3dl13Usw*n#NTkP zEeCkykHEQY7<`rUhFq4?uDQAV9w?DOZc$F-_-_fS|Is(+MvFM$RV=JPMdB|wSKI)p z)jtF0w!!cDz4WTT;rxeJ{Ru!< zSE6pQbpGz^{{`sEc7VF> zp8<5s#q-*7z?XHlYs&#D1#|p|G5E5;b!|65Yy$#<-OB{|O%(^2s`FdBxjYVVd&Obnyd>vuKv(1dIkG&TQY-tALu)KX9(Nxnk?a%ftT%oZCjn z*Oqfx@4DiK1sD|t0k#6*o0s3f%$KplZ@IapgI^ts0g~?Ezu{bRb6J7=GjMLXbpFzt z%c|G4R{=T$21<(H%OV`}S)nz8M?IIzY$$A1mvOr7^2(8$=CjMSq;0^ z9w5-*1Ts3{%YxV~82T@vG8lAAf4^GPfpaC7f7#JhD1SLN@K$;a zEH}TmqN@{0w_@lz+4B#gONK6!J%0?*Ef?79{RI#i{>2c$7&EYe16>xc2foS}e z!8Bk)#Gt?NT=B#4=ivNbh0>tQ+S;`Y0ZDi^2=I1Ymilf^4{*Ng_XY&~saw(m?82`0 z8vkIrk|AKP@y9UTa*4gJZ-Fi=ZC4zzfPjIl0G!LZ-z_NmZ$b6d0j6835C;$w{R8OQ z$ACxv6rx+MuGjl9&|eidAQ%C*X3W3|P0(e@?G_aMx4`=9G}Empy3COg{|BNg8)E%) zfNmRCUqwW~U5jfI0+M4us)G$UtqHm;1m2vXt8-+(TkNk+HrHV3RP*$11Ff{P4g<#Lr-?!g z!njLtft0om!*2=K4YPkJjH%_>nH@We4@{`(2-+qooi14UJa##oRQqz~srusZSZJ^5B6-mMIH2&N?R?Lz z=;F-j{7}v5sM;y-F&!j{Xxf{k1M~6utkXG>(^2O|gX(GZFi}6z#U#`8C&|6eLp8@E z$$clH2m~uurD7n^jy487cR%JCw1yXHjb~--^xHx@F5{km_TYEvK zbCNpZbfI~+u~~k$ak8O#yb^G+JsW?~%T#@~GwpFiq{F$;W>#l%t0Q zX}Q&T3PzoMe7YxPUyt58oxO~9vN~7gle>CI@)=F3wII zjH_5cOCf_??)oX4KUv$+oKCARnws`Px5y-+jU1Xz3}T6vb97=S+Hd`%*3VMyvWL?6^2ioMN$9!5 z>Ej~ls@Yu)68fr~Jr03pWecBAi07?}MA!TkgXpL#CMeX*XZ9G+43Ki)`^k4$(2*DD zuM>QwOP@6;i-2QWi$GL0f#_Qin198aTbW4%)-IZA7lYTr_p3;U)=E@MIFm7ZdNt5sPd0@veHy5qBX z;*E-oR3g?Y$72T`tR~xeF8|7avGe`q4L;=MbBzi4zLyGv@pBgOJwM%c@Ps#Zmje&x znJ%_We;%wgB~?#0dG1S&tenidcEmlGSD9QpQ*v~umS3b%V{K}};wyc`pNgo>h)V_-MI2KA*W%;K~?r=D#STSS%lOD2O(kLKO(eKN5JMdRF*szxE?Mbiyz zBEc49bcqELd2=viWookQVA2s55nAg!WA;vLZ2}bI0crMN6|a_HEp~7|-Lh<|!U&mX zF#-Fd3X~9v^yzuRwP>7;dm$9!CBe1x`Lf+)ce~HPE15!2p9|81F}nquDMf?i@onow4qu0!XQbqiT7wJ4TnWiws_&jDfeo#qXC~r`*B%$h6ThrfS-mKSdk@6 zw`8kj%X|;9t1$cEPW4F~GK_#Exjt*~5jTz}SRy}ix<#j#|BE|SK>9~|18bcsGtI|x z1$xrPKQ=?(K%uwAqP2!`v+^|fzNYTm48_j%pO^5GZBppkMAxQ!Qz|3f1HxqCp(vu$ zY>@ep<|c?F*>dz#VJp;#Q0=pOYUE2q;A`m|e+)^QXIH-j*fC%nnaY%U)^kx|;Y9Dh zhYa4qhnPFYzuhO|)FCuF6o^Yk8po(|xy1!|G`S6UH164UI%0whbJ*iDLIzK^Ftzzy$Oxf8`Z9Vz*MeB;FlBi} zOVXl|MdiF$iP)f0hlSh#YB^d+T*3R;8Pt)OWw}k;PmowL)wdyWVBdSJx@EFu7;|Ea z0ww(5aZXFJ;fGx@%LAJlz|TO&5zJDM`V;ZHQ+BwExXn_`^=(5RjTpW5w5}AlW*ZF+ zQt{&KEuG1Jqr=c#mQM$oAGTlue!pUQ?CUb9Kqr9o*oSp%7#jF9sRiS0o;d=9mehT_ z&57&9G{bI@&y2STUK4WmCG@ltdz2X}kq({eKicftY>r3PQH34R-A=XB8O$2fD)$Rg zaaSztN}mpbjB6_myF@}%3MslNLm&kAS$WJ-?2_GuIxK2kfDe&?^=NVp01t|a6(DL2l{Ik2zx7GcuqnZy`uX1($`#ER8Ij zr6+b317J-BK6uobpig5T!w?%glq)Pvyo zsxxSY1f#NXM$~S~P~EV+Cx!6ya`Qx}ulYIU70m<&Rf1jg%28ug++Ug1`WVxe3RMhA zx0D5~0#kb}$smd16r*eiOQONAwv&7q79X>e4T;byUJ8a*K5yQXT;L9oZMWtlfL=tE z4K1!xfwBp+^Y5RPNJOaQ%P@kI^4BTK(M0CG29=~sr}x5Nby%=BUj%$ucPCFDOJ5cV zZiUG$5t&c3Yk4En3jOvz&HPUrPS5NzRE96U z*hPs`4L$*W_*F3jXO~rHaH|_`oRM_tNTu(pD0vw0MhCZEtwAE%SvL7e-~k>*>C&g) zLkufv!+AgBJ+RbacsRFDivaH44t7uAp z4{2g1x{ntZ#b~Dk%q3l6&6@#TOlQR6#-aUqUgw?aYSj*a_L|NBv}qUC{gL$s|b|c8Kmu}*G_u#~}?&55}#8PEm-(l0b2}~i(_^-0MBq)T|Sf9`IhZ_fn4?9KbkqI zpYLhHEgs&*xeC0<;$JVKG6TGZ#W3(B;pLO8YrvC(mrs@g2*$TBp9Fr>m95e-wS}~7 zOg|s)>gRsqgVLs7rkNzSkXo;^DDr2T*4Ml1vPp)(q}5pf*uL!i{hNtam%n-Wq5-j# zFZ3V=mrt)?+IhxZzMxJY@aqC4z%xt#4^{6SNcH#sffI2h*@Rp&@|I|D$=0{QD zFagi=`~K6bawn;gm?SlPQQ^diXUc&-^+&ncpYzw{J|B!BRu`lEzFG;-cVmuPw~U7u z6g&pGUD(aDY`a)804!=%tB}Mg#5zCQ^wV$`h(_HOi=aU8Nno2zTk%M^w8h>O_^`?g7` zs*-U#nz?$fV$2TN;{7^x(Z9Uh;GCC8A+~BTV}v!&`?WFNzr4mE#;e6}RgP-voWnIk zk;BB2as#cAwUQCPdk(%MhGmk?<1(N7{t~D#tbpJ{B41?%Y`BeoqAC9ZH z+db6f->w}0K&X`dU@p(9@Mo^@8PU5s`TEkzw~}c}KuKbrOrmhURr~6T38Cces|zh@ zxZW>?o#8;wBQFx9@WM#-x8LY!p|vSrQaC|+4hVj4)OJ9Q7+-zTUeKynCT$(5-u;c6 z7P^x{La8SlpI%gnUNa4;QXVKYe<7bST|6S@n3-_O!9{vSF-~D zdtx0depDFD-<r`ij5&$*+ zZIM&r3Ax2|IxL@lAqr8&Tc}r71I)W4_0?OOC;2pwa1!@p_ezxycVy=fnKEyhorYpv z$F>i5tE<*~pCCgPKRgK%x^*Ma<`%C{wgDCReW}9xYFd*yE(X5`*ANE-6rn)TiGYJk zjiO^%)BfRpFSs-vl#mJ!=)g}y2e~d(9flLC0oMm|ocCMF8@s0&Sw_r>5_+>k0PF>48s zmqQ82BtUu(t|4xQY@Jqs(gChd6dhYSeh;^M{eTz#O2`Kf=wHa&(?hC-*28eJ8)1V& zTjaRaLWLVgzriJ-$lIK=LLHg2O%0y9QvgiXPDmyXBlzj@UJUjCR}wEoY(T~>QDERu z=NY)UXG%!9=M3i+(-6>GRzsFQKKUd((BzRevH3(Pa|a6 zc)iV_QLRDtbpWnz_ayL)v+CpRKQ6IBj}_udzO>07{L=C?T1{jjPSzi6KdqkDlZ(3P zTJ68vZE7C%5R$VX5jo5G)@5#Qnb&DHqQ8t1|Y2QA;IKEpW(d_{} zg5VzUaWC?DvJVL%pM(&ob+}J{^W*%B)h;MXN|Ps*o^lK|MG_5U3IH;05fzY1jwX%_ z0iO3Hy9!2@^p9Xq_JC@0b~6-(ScL9-ZU{HAnhEfH$atrkbp5qZorZ#a{iE351wP^+ z>nQawR>1a}ms4WktV=svuh5#BQ{wLz5n-Z9^i!4Nd

_DAAq{i(O?(hb#p`q{|uOWYiX&qDgc33cbjDU^SIvR@FO9pyzGyNlc z2m2OPiN9l6s}cjru8(Obgr_bY&5+s1+QehX zuho|6sdp|j>Z8xB-g(LDR@Z1p2(P+C?@yhS&Ky_DNq8sI`_`AQerq4p^+#8@Z?32A z9@<;A#c@7xwfeLAcD)Z;yE0J}oz;_ixxwMwx^oP{Cy*mN!7Y#jweYKt*Ss?DwX?wf zi=Naw4e19JLKi!FHf+eM!i=OVQ4djLBni480>-h(@Y~Ko>Je)1S0979YGjZgC4ciJ zD=OSC7GVbSh)4=o`Wz?2jotej+q*W9DueXiF^lfVxay`dI`L`fQhI$X3&V7(xUz{M z*YvmZ9ewUk85HWomF-5kj9OtM7{y1)zm=<8Y$Io{N;?Ji8+syT#VK=ex5XjXd(!S8 z6~CST2wQTH6^B%V;{NS#=i5hnPJNy-Ovj5qBlu-Y0;>-hAstU&j#*!9e+Mt3*ySUxunNrlk$l~l) z{`^RAuWJRY|jc#Y7ZeQESFyG2j@ zv+J06?lC!wNW|Mm#Ox~#@!UdIUfi;ht@x$<)~8Fin&14``F`$veble?vRF5mp4Ag? z4$J;cAAiv+FF(!pRT(X%xYEJ&_XaU9BxM_)E(0HQEjqn9T#BSVEbqE3IW~)R#$vt> zX5mCf$3iVo<;92T@A}*VZeM5?Z!SMfuZeZ5HAIYGDy{an(Dz|<`S#FZoX^j82WFd! zJ9Z#96YzUxuRURd)Mcw%CiU-9YHps8;g4*+#ByV&#O8MY4mM5bqx5k;dx0UR5k9}z zofo1>dnWXNaCK+}5K?!-MU(0uBmjaKQ)`~X2g^oPy&P|`mlEvuI!=irPAxEiGbzKa zG3_G%Ft#vwIgVDqwZZb8>Sp}1Ie+QAKNoOlz`H83d68tyVr;UDO>_F;AI@H4m1o@V zxUojHB;_}aYMbAIxZk>WMPlBg>Rbfj?J7njLlYy^2Fn$Qr>^L9n%|BTpx=JTCW~keS{;v`TLGnd?v)( zFg7nR_rZ~}HP^yLZUy$dXRy?{MvFV{dJn1k>=tEwYuUa5G_a2!knO!AOu5nGRw+L) zC?Iac&Yq)1G~=OcF33UebMLrZE;naBWb5d$Z%`#%LfoLm?MVED@5|BELoA1Ao?dRw ziZr7%HbHKB8=Ew2c#kQyyr_@j>y&*HLGTEF0O1jOqe{s3xj{R)^B+8a^+UGDlQd5m z%^%@DX%AfkqWIu&;6{mC51Xbgj{7To|8_fY`f4Ec2he^3lUtM@AXO!VF1Fr+4qxD* zG|8hrU_B6I+V9G>Uqg*C12vEdAM*lcU4dCQ)yPJzO{`l1n`R>Ji)zxpPQ4F*5Y0_; zDv<>24J^o$?pZtsAWqshoOMe$=NVU6LT~{;PB5nnqq#0FUNkAcuT3rkJjgkx)GWdoJl*+FLp1nyNOdNE)d)HXlg0RM;`^2VHhkvI2I-0#FkRf$HG zu0d?839UC|AV||c3;JZt7T1f(aNj6hecg;X=45F1&4)8Og=S87P_ym7s2r1u zeXdviE*2=PPgQ6nYQaq>S#dlMG$5y+;d~9Ymn(VBbSS=m$xwBzu-1a+M3|Na_XTcR zB|suV)*fgCPRY~SI~#`w&F=JI9p2O7wLLJ}7s!W-Vd z+{c7yDZ?9vUJ`aSWa(&Xw3O#!PlV~7&t^xW_S6nvMWF}@asuIwCOFY4(A;|QBk9#K zm*sdCBMHHUT(Ep9m<7#f&VRm9OV63; z@-2+uer^I%mERdAs<&&30Iy|hfYbtS!_tNS3EXj0O}$m8@nBG}D#>87HN%s^oRock z=3b(iz$mvzN}<}5CTZ%9Nt!c!f!Vyg?W_+SM)+8}QyVn?XW;$g&}i=B?6}!;V(y8B zVo!YKx$+li$eGM*1gjE9Y_EC78L*gvN1%2!3pCf9BA~f8mgGll4 z&NFaSYApYDoQ{!x_d`^=qyH?H+XgLvltFX^Aj6ICS=ypSHp{)#GH1&Dx%82{?phh&>(;NX$N>cE9(rYCj(;YiarImoU8rT zjH%-N85kNWngp*b)sHRISiUySCpsU<{Y; zf9VV`P$yZH$l~08)=Yp-p{UI=!qk`NAC#lRwK@&Xz)SDcHZ?@XfEQ1z5+x3AKa49> za$MllO#J>8mZWaliJaD`#&GXT&z!u=Ilgo@{={3+_Max4*Y4q`v4e9{afu;^E{KzX zG2g?duZGz1o;?fH>ZSJC?XUd&PEW48?v_2aJ(=(0)q)M+$k%xR4CmF5pZT}DVGE>JDn5!yjTULu+;1)3_l^mX?gNku6_gAP~6f@Y+yBWU^bNEym10~^V%2L z=8W? zSMZG`S3!&#dIm@s8u!1RQ`T_fIczTU0t<{(L+F%uBv_7Nj#sEHTZ*cnjP@_z`!Rvg!DG!+}y$nQJtJ%y0yU5sHFD|_Ya^h zyz__?7*M?6l=#Z)HmKa8NAsLO;WwwIX4ErBVATjrj}AcHuUR$>m@N)6Q&pXsFgx=o zoR;Esdy&_xPWQ`KD~1p83S#=r0SYc&O78U4q1zvg@=j6`@gt5sw;^m%v; z*#W!gemHy%$N2((z9R^w?l%0~Oy8z+l#N6ah$mJ`#dv@ z=7PND&lnd1C43MKpM0@av3vG|Vi99=!?NMAl;Mv4QP4iZg@f%2PA{7gv8zMmsTRLv zWh6Bm1J&IUL*4pSyQu872_LC?g^&hLFTYdLJH33RP!bVFWe;rqoAh$kQUVqPumVx) z?f)aHBhMevZcX^Pyfl!_d3R^iQuL+454k#Zg=YRI0q96yEKlsf8h#vF`Gb2L>X-UD zdUY^;Dr_}zV6B8yW)pk)op8Y^ArJ{F+%cHCPJQ}q1Z^R#jbf6YXSV(95a%oqjuL76 z;Db2i+`qQR+aHw>vi;zTegWG|_|B6vQNe!D=#lFL&(UP9W1WW0mceD;IMaT^nzP^V zbu2s=K4YF`?0b(9x7x)*Q*}Niddwor`1oeTc<|#GO5@-!LDrE3kH;}!U|OW%HeYPr zES0pWe`cC%^N;Vn#Mv(hVM0erCeuN_h_nqs)!0L;n~PsqdS2l=e?#M@Y*949AL!pxfrK#M#RAp>f!xh3l26Zt!SDz8q^|%( z>q%BGkgSq^pLKAL1SXQs&VM>Ek`8d3FK`X~d)id1jJ_?kATQ@IS;f|2)wit&_GQ!+ zu0e>C29Nb8lnV&%Q-pg*kCcY{opMS77e3?gBVv8CM_$jgE~ruG_H^q~Uq;K9#ny#q zt!4jECOds8Jmf=rjSn zFS#Ws9g`bAUkoDrSoLN|ASuiTqVl)Bo zUUo<`Jy*J{~C7QFB@cS#tc+grv9Ekw%p0LEjUOZ?nEG#hSv6vC$DVFZJsWmuikap zLCpGeDdw_%#Dt8Y#O@w4qj~1(?Zj)$_L(s*Q;1o2YsK9DW|vU}-bY0-Z(;B#RO~<_ z7`|7qPj1o4c!UyDUuX8e)JSh7Ru)>>+YhU>f;oc!h&T0Tp_eAR|dtxcytl?1RaY|7oIo_-8zmBPVe~v8Z1p;a;4+5F~^I#pjCe|FY(fmDG`5%ZH;o;T zHL$Z+hJ$i%8`665{Bt1U?cn>02&1)hjSGDa_O)(5k_E9XgJf@F>cdm7=rt9fs|y33 zKcow>M>fKUg4IcCN{-vKM{#e0vwe8@o6c(o36HG&Gbxf`Vh~m<#L+^@@;opR}6gQaH0$Moas-FTu-igN-Hb^C%FnwAm!XCa1Lywvnu_-;0P; zZ?xcE&RQ`n9UQE5Fk~ImqRsiGF zuCNdH^q63rr5Q!4h#tMyW^=(-52GpFwk~KfMEM1xV1c#?`nL{t)UG58|a@SF#pU>-oc$ep~jMeqe=N0fSSQ@1V z`u>a-tA3xwItx9l#QkZU^%^C>Cg#L0O$#J@41yGTVxBmT|520C;juPUQG_UvUk+U+_gczRW0we zdWxlY|8GIBc;ibWnS_2^Mi~^UHR&CW|0ZMR0#&3DL8?(LM6I{^xE@9 zeg;1cK_uJeDf4$Zhv8dP5^`5p%1k!#l)R663)n5(D z{!o-)g6W5Q*Zd6nM)@SAdsBRuw191tD zZ{=xA{(RmGf(>q_VgJxpc3D#{WW9NTZ)Hv<7d6&+-U|_xy~#27MCc0h#8Ga_n-{Yf z=H!1B`%9+&Q!Ki;)@2Q1A^ugQaZbYN+*9)+v7sc~B2E&!p2TisP9_B^0Pf85Uewwn zp)35D6~Ii$dUMZCn}-hk+{W|&30C$NfHqF}CGY^d`HY0I0J7~tBxio+Mzbbd-5?SF z>U#d=kNv0W>~bH}2@FZPLzpv*2=w3%c%fNmLFD2{=6kSTeBaKjUoVmDw6uxIhre}? z-gs<;;7=}pz`sL#z*cj9%YOgE1;dk?g}ESg#htbgzqUOHzIbq~>`}m;*<-0vXBo?k zjh!Vc#ku7@!`$_?&CT5}dy~vj7t~~xi7o`Vo#CqrC^A~Csf9M*`|1Rgec{fnvO;Tr zeQuSpsmZg0GHe!#>PkJ$vQ50EJ^9md$yiOHf@%A6gEAa%mqpiiT{hr$DJd1-e51b) zmPpO1pySmx{L3o}aXVr%oHpzh=mWgbOGh(V5G&?9yyT~jFY?rNy%AxT6+2gn^%7fJ zeG8fL76Xy6=98F-smrDd`N)>2Z>lY|Ecuhrn_74dpC32!y~UP--ZD)2UVo_6R}Z34 zxbyqgC|}rdzwk#0!+X#~GJaFr0&Yu<%qE%}dHpRd0c89bVV=x1W50ScUk1!S+&=|{ z^N6ah1&wviuzF>$ss0e~zDk3@Gsj5~p6KDc{;drK;#|*=@?2~n@dQx>k6J@v3FecM zAim5oqvnt9oAtHBSUe`O+=j7;e>c>A*Pb-itznf%_`TYG0tisE3j6kFsV=D+3FrSPkCE=_I@IZ1A zXk#6>2vqgpoRQq7dF-D>xr)64^*w#WK0W$peYTr_=}C%E#lG3ms^f`^8BNz|-9+n3 zFX3chwLbEguI;c=GfJa({b<>?rS%|IKXvqzlU(a&``NF>u^jmbW^uS<@FNp-Gn9h- zS4ibzgbZVF13O}S>0#u3*bOuFx=@$m5RUxOR;MgS#zXXVelNwTK8DIaHp}L**kWIf zyeQMuN>5RE&NmxWwu5=(SU`5GO|;SEEexyP{jv9p30L7cMSw7H3o|X8{n{paH{RyF z{L~jn)=0&R32yF)pDiGdD8HpruFo-bPUc*rYziZ$M3 zAUZm2?7s0&mXEuE+7ap8wfHQ?>RM^Ko%oD17@`3`hVHBV8{eO=u)oTZ)48)yg|aSM zc3WS?VX_WiCf6E-bNlTzNbEo9><&I7N%d3i`tVc{I*@Tnd6g7+srw6`>^8GijhZvswRQfvAy!mzlXZ-P5V(JMk0i zk`=xzzX#Gl6OW>-@Er-P_jUkvJYcep7Z6YZK_h|nk6H?NL#jZhFJNsO!|0!R@21j# z*R5{IlupsbyoFvCqI9KF2zXM2F3akl$KC{dcxtk+8ooxnn=Es#mxbR;KJ76oTSWhS zu5=b))+Y;7fq15(i(y+NrefOT(5emV7)A^UIYY0{64?Kf2$Y1A*H_h&cVTleIXl4Hfm>~KP6i&w~P0JylK3TGLBL= z4)cYm^?KTVSajqJFQu`*AG78+1;r4KP@~BQJgML8xKFQy2rvR#uM}S{Ov=5&^BR2l zXpDG+-*ll3*#eVrpW887elT^{N6YNqz%#h}#M(H&?gJR!v3|Yq z!^lT)Nw!?{`7Xx)X*aww9@^Yl_gg9Bs}TPM2k#Mak-yP}uXtaT;5KTapPKO>`VkGf z)aVkfK2-<3G3y7|{mx(fj3Dy(TyX-NE+OWr$Wf!i#X0aA*KCspXT46^Si-)5N`-GA z1K)SqvNx3+oY0-GS|)4zEM4(*0|wP#pbPA%Iv@kj@x7M4`lb>LAA!JgPAE@U^n5%* z$!Ua8Vr$gl0T4NW8yiuebGCimD{O~k(aAB{*k4fweS)~iqwWH?!>*VfYM#fS-=)wCLXSyG>$FFW1;$1sSyi0R1@#hCl)JWt#cX{^}^ z=Cu3SR>_r!LpJ)B%3YCZ>O^e$af~Y?9Hdfk z74$?k`eUoj=B`M8JtS{5I6}+^Fx;dCRLU#svTBKO$Z&Enp@3TyI9T1iNym<+1T>>h`V( zveB5x3d*}DA`FHRVf9w3+vBT$Xjc1;Igg$r*I6CBllCmzxgPCUZfu#t_okeoSU-?2 z7R^(HmY{YyDd<_qfe+ZYmo0l*o|jeZ)?4P_5a1jLCT;ewZn$?Ay=R#hDHO2I>e?2A zZ{_;NJdsh2BpRxuPHD0XK9R~4+Foiq6JjtOOwyRBR_ZLc==d~1kNkTRPA)HCoNj^9 zVl8qDvPLSZ|0ETCJN;A=rrffz;;WHc(Jp|In_?dNg=uM^^$I6L#+vooxv8Z z`c|FITL!f4+l_3YlFn_OqL8T->4tE6RJL*3GkV~04zi`cC_;9h%+6c$3sR)y?htn% z5MKo1VKeKq6nV><^}O41f6HydKwSsZJz$?@y5dC(Ur2GegAE=MC971>40AcFJ=6*W zm^HqaVEi70I58pW<43YbUw@F4&HxA6e3U3G?Q6m zL%9e|g=4o0&B!nd$$&{RA>RS~@R9~hsL<3ItavuCKSr|eHzXRYPXrJ$;c$1|~85|xzb2dNfL zI(VOSqcal%!(x&`UJBYGG*gISEu{?WiS9orv0{6{ydGgmYP4pN7rPZBCfnZ=o&jr% zttN9$vLDM}#$@?>0@Jyo4=!_zwW(_|qUrE^opg8~W_{V->0UX5nr7q7m3J^h}ykDz_BBOYR9?8jnemoqtg z!uIW-gi0+r*3B`3-s8P_!yO~7wi)uggS_maEbqm`1)dpuhPdUgHVvm6KHb-O_BpRY zira^mMRLy2I@q5QE+a|~e^l3bghH2W+c5TwrpGJBX43HToZ}@=Dtu}1ZutUB-snJZ zZ3;gc2&&mC78^#GtOdVD87UG+wb-#&k*&lBOh9eXUq~1W4v82>|8lX@w1c6oD!phb zBX^N4ZoF=aw#UzrYlOCn7qGUSKPFX_&|C}lWH*mf~>mKcG`HvExO;6># zes30EzkYx}8BbSeJ!P)+@$b$ORI;rd7IBe*kV)<;76T^`dNlg*&NO3;7)*%2@1Dsqv8;4^~-z zhu}}YGa@2p2C1BSjZ1JSdu!=F3b(5r={srQN1HC?Nxj~C(lH=N3ydbLQ8p@0?FwLS zZU%dRWwGgm2e#nc%*pnf<8}?Z+Tj9l)CN)V14f%W>MpO_$xr{;AYbt!O=Yk@I6OnK zbgOzrYsB5cEXhLC@UFZA@;CVo7&gh}f;j0!Y8G(5XEW3vEMGzIYm&szC3BMg{VEBj z#2Q#3>jsM^mvX0pFonUnfG05X1aO{bZUC$HKiVruR_j1Tr4c`{2|Wr%HF*A^QozM> zV=@*h@Jeebb?DCaeZ4{-vOGGDyGy(nOK(kXmC3jltrU=~6=O`{h5S`x(;#XFQ^6g; zmJtz7s`6bkc1E@s>g5~{#^OEtXBF7;S5v=(33OrW?2eIkP}j1>f??{&Wi*q7$TZ#6 zax1+kth~AR+|F7zL#j;l+L%|V^23zT>!r`|{%-}n!MTD5<6PxM!N9N-YwJ+f!^i;4 z2>H9KE^D3KDtkc<%J_>_jlhvUg`an}8#a?&PoUzz(#Z|4N7MTcPWwmrB()Z7enLbkawo`MMCUi zEi4Q7*}q*I$mwM|{zJEWpNc-bKS64P{X0=>;`mbtZOHx2B#Ef6vW6`|wW$d~DYd~= zJKGo`x(fc1B}s1VR6_30B4$(D`zd)cp_^+rP*9oBt6;ZYaZn~yPlBagCgiHiFu8mS zW9jLAn$-n_%P?5)UkSvsCtn1m7%*X4K-j#WiM~1z<^1AvmB7+bX@j;9`dd!fq?eMA zVu;>3y8IUQQZoT1+Z{epmtmUK77YrbVd(?Q+5m7~g5_UgrDfr$vrOJ-EV@CP+H1$M zFxWxKZif#%|NWZ|MUg!s*C}9fLmvx1)UG|Me+x%*CW7N^XXU`sqQh%r5g15QnMeXp z9(Rh5#;|ZfrFS_<33yFledSrC^e#9f^?a5C%wRq=%Yef-ADRuoO9#mY(-I&8UP~Yn zM-oZ-b;)Ud8M1<B~bKah%G2T;F5+zSvl`-pkeTXlH9Wp_D~2IAC;(W0YI*3i^}9R8$#C%=hSG`;(po zno4`)y}YY=%kez?{%iX;^8#dKUt*m}jIh6qEx^F60|snkNx?wS>&M0ul>}}@D)hHf zAfEq!daz9r8?D(zyw8g5HJA%3(Zc8N%B-lrEkwEVl%0`L_a58mVa)3%kD9svs|qY3 zed(Qcw}$uKfOi(4P~2)%=pqYNaGr2=sgi;&0s80ZI*;pNatk&6R#Wc;F-lS4Yk-H% z*6xkHh3peT#-iAVqvwwotFIrfzbp_%1O-jjuM>8*EH7y0*V}u}?;UnT@w4{lJNB+C z=Cx>Nti#~t+GZY#5bTdh^i2c#iTp`GQ8)9-Va9T*NaZVnHy7%>u^}cuI9(7Y=3|%u zj`(n@jOBAlD&4guhVrWgBuLgfql^;j@O5<9sQ`34?chI{=v1>0c&cfdbk$F-3f647w)nMvH0&PwP?UH%=9Hyc#wPkMBLpnm1Y?ipf2LrW#bmFnaOI zIDx}{f}ASGrK7zbw8NX4Bu~Hsh!Q&8Ic`NuB3ewpvw&hyc=Ah?$}>FJUlHpA!X>!D zF#L{AP4NEOcOLAMh+BLBPkP1$=Um+2_DcyM6Nc~dP^Zop1!grIKasM;8z}5A2a^pu z|L8Ompw25(GdCD!S3W|p^ViTJIpGCXT`2}5Srdw)tSgWb7UG}{VkVV8MOl|2+aIb$f!rKEhQajf3R6yuKtu>$5E(n%ZKM!TA>x;V&%k*Ogp<#qoU-ED#i=TEw5 zYvG|jj(RE!Q|T;&L4bkoZ6FVtrkuX4&22*eo9N6Nh=`aG#P{j@L-U6jOXG*ZHl0beJdiI=Wc%-^}$8*+% zITW1;w425gtlS)|fKgjF4QXS~z2gOI!sZWUa5OBe161c3y+*L-61e-41ojRrtC&3c z6!WjbSz2(2OC(2L!6i~%DsI23KJ|Dvc**xjQXL*|7NQw4^MS7wwYDTQwrxc-C2va= zwDn1L6B!;g;NDiq`5o^|+?lYN-Wq)nEhMmU*da6qPh9oB1jpCFnaFlN@5+?&dC6X; zfs3HIkKHNk=$)(eP2hXXNo43bTVIWE>^w>U%qBI?U}JK$o2Sp^P662gz~0sn61ao+ zfir7=e`m>sEQI zFDY|9O)k@fzh+M2^-{b{qm+sSB2^?%cK}+o2tcQF04UEvTByqbse}MtoXe$iK+1(0 zfewJuIZA-65;9R3*~4!Kx`nfYK0rV`2N<4YysKEus?wy)L}|1q3lt*3!uiHU(}>7o z74No!$R1@o(3{Zb-R#y+!p!J)7VJOhiRt-e3r^c6jh@7FLc0fKjO3t-og|{k#y`Q| zYvwlgIY2dpzJ|hnC1+pJ`JDCrc-O}RKKcG=N@NSzZ`;c7f(t^Xg=ng;2gXFcVwMFPN;S+%eeI11CWr-M1+)TPI%J|e3-MVD zn5=P{yoKjkWTpz=xc?LE`75aN{};^uPf#=57jT?=bjYr;lOSYr0EZZpb#%%5^bZL# z6O?=6v&c+NwDTf+jx#jq5*8rSe?0*E!VS+nfokQYc1^kj;%ySt@&D@$$w<#%Z*;&9 z?MVqny=%X~X7JA*Fjz(=%>rUjCRm#!-Uh4Bd+ui>*G>^JCo3yB+AaHF;BfSA;;S@hbY$} ziVsP>M|EwMW6RV*$5+y+(+-(Ns;dL7_HQeAoPktkhSp}$949i9;TNUJ&mU_*c+pH} zjF^58EV3vtoq-%DGLYd*P@y*VK!{Pv&W5r=KtrimmOnK23nVwTQuiNXDHXorMX1eF zAi$)APk2S9#Qv5N8c8%Hc>Ja@ug)%+AC!0%D7zUdSl z?(=<@J9ikTL^rTfy!LAWU6j`aW>(?B&orU^aA9zAwIBZ6Wb-pWl!g-;2Nwp5$af6D zWa+}j=f4KKW7G@oKL*X=g$*#4F1UZyNRBgt34Gu{S?=B3;6JZoSpV8Ye!uZ~`=14# zW5rp<`fMKG*K%{4ul?E7C%x0)sz=EY}i@9%aj@V>Bk0TqdsY!fP3yjifIV=9PFvu%n! zgh#t*-5q{%7VBVTrjC7bcCb76qwWG5nB&~rorcu4=-Iy7fTP#xIj*ZDI6kd|3JVKq z+p|Tx7~kr#e&45|uW7#`l>e=E*DM7GM_=Y&s)6H~s)S{`*6!)vg1<^r-fmbKEWHL+ z-H`oPxO(wrXbE{E24{tY2k(2U3g1qtof}+rm`GZ&+;y7=uj(JEuVAAcGgb$xApeFm zXs#G9>`I^_)mI(OIwNh1L~Naq;QJz>bOUH1r6|y$yfFv82=AvVu;uSv?MzV_B?B9G z35`_OeM9PAmM0|haJmJNKS7@1iZ$r58jU)?r2Qp?&pc#)4|vib$Pw|o&3$AfUY)$dn6+?jQs|8YEc2LGlCo33aIv8c}e0b53O zxPb2!C2q3%Z>iJfO^(Jo$>e)BXgQrYUG{41aL$BG^>@HR>c}u%<%MelY;cjF`hyP< z*k4ON{0q-Y1CvS@uNE2$Dbl?%cvzK<@Dv>ftt9YcWs2AK@Pr2k-*~is9x7k zqvr3-3Cx!CKHB_+7$-qMK?AEf%L!@?s<#3(&XD$g1l;04L=e3&7^@0|se@W#YPjNn zd=C3h_F6D@=jVWT@5jHk(M0dNG`&A!LCiz;L7h)asHQ@m!6VzeF{wTxaIDBh) z8;vNn<0$+x*h4^rJ%qyyY?-=A?fvK~*^6QLM!>H0M}cp6>_Ex^>#Byy=uGstrbDj5 zAmb2<2}dTQ9jW}jsuQ*C@zEKSk#0xX2?&1xGTFX6Qei=vaqN%yFsnlGGLc%2LdLR)#~6h zJyISV!|$PG0;@fiFYg1^yoHE%~;Fs*iu7xj}QxY@WGxaL4GN z%a@1?)8U*mIm%PQzwgQC_qU4_ws8F*EIzmM%~1Rvhl8d0TeCaIltrY~*e?my%-4Nj zlM^LViKhzSn?0K|X1PA<^US40JWM5n-FTLZUi-SYGbP?d?B_?~$IQJ&aUMoFUrz>j zd7aB#t>jElRayc{a;C+mnXYK@1#F9P@K2|=gU|1#dQ!efoDU|uIkk{}pkcQ)HJN@8 zjei<{=Kn~Z(`E%v)pwZv`U3^fX=sL$`NX~H?_bqbGPsOO=5>!%K<{xOa4RhVB6u{fmnBz&y9w5QrW4nv#lh0x)Lrl{&oh%Rb04g=fQ7t;mWM3`htF?-S8{8*=6B+r zC3yPEav-3a3s?t9*mbbknt}iy{`%eKOG?;_kOs1hpi=|lAPF{BJL#%F>q4}EADyTr zvZ&zl)CYs!^W_M`G)^V6R;8^5R#E@QB-d-MK& zGsePs8q;5RgUlA9dRnNrj;NSS+nZDFoU@}VZxq*{seA~Sg6MERk!LK}(Pw@qnY@1s zudvXsTP>78Dow;Y3%fe=#@=G%Whudg)i^7d_*c<6U@ zdehTLtoPVg24r@6TF$W6mL^GHvMi0GDRAz)`uUz`H(uU5^E$xP=^a;zXqeZnm+Qdq+qf5p4H?h%JI;KvG+ zceUgO`VS^tKO2-ln-tI%TAc&kd-!(FlZQ%8Y7BKXNm-WFe|Gw<5XHk^iv5Cq4BzpQ zJ&*`B`t*t0g3oJun1x|#PvWeSkd4#NK|#19-vfX1FGBvAft*SrPx$Ykv#mMdj!+JZ zmBPR{*|bP3r)FJvMW~UtUr%f$DlVMejE2iy^#OV1(k6+UuE{oK&g7qI&8bw52?U`8 z-_$ynD>LI>)Q5XW8cEWH5qpckGNR;~6DK@1MOzu`{@$LfGB7U2H+&ODA`T>LQ`pTr zN;EUSs&=;>22*MI-ET#gy%c^(fUU(0D(siBh7a~&7f+HduZM)i^cQO^Sz8(JN5Xm$ zcTY4Sa5M|Rz!FzRHa{D;0C_nep9{0~2T!E&4!|SG{g4QCS+pKzz*IVMhVHt(w+E9l zfJyRiJ6b3MR25+QXF72z4WMm>c`<7b&P8VjygrjVUmOWq&7+Zc!36VBCh%OBbAmaV zhoS6ixlO~nV20Z2@G%J_)nIMgSQI?s#&pb_(8e;b^4VAh7PuSB60bu2NJT$V(XXug z(q?hi7Ct|b*;zW0er(C+3W6Ep7$R&jC|%7%b$SxGEf@50XDW1Iab%zNWu$Z~?sn^G z1ERQ|_O8M&N2`1xE8}0^lXHC9Lb6i#0=%t3YdFIVrcNFKWkn(l%1U;gAIoyY873&h zTOKP+B?@6If-j#PEL+>0;8N=&rww+yYbX7%-I+bta0=G(E6zWEKJ=#Ex3R-{iizK0 zrkM6xmsK?er`A*#{-&2=Ga~y>(y$Z5!#sVVyVC>6(ov%Hy^w3n{w1`qDabTYn#4A= zC^@dVhxdbPD;AFmc{`B44ApWhJ_X@yuHsSzABLJfNdr-}t2xiqG31rI17V=Ro%>Av z21I@&n)7dgv}8Fln#a=a(N;1wIP2{>ZZ6K4{%HCjjgwp3-1uS+N7hPK&f)c>5S~6tg_ND#GSr6dneQp0{ zXr}?_82mo|n~$6ZATjv6{c7ih{2Oq+SGs8c1M=_V04=VU^XOi`NB3&yMFJjh{wr-R z&5QW?bNkiKZ#G&$`_;~i;5Fd*i`ew@_SL^v-D4Vn-1v(fhF5zGul4|}xxe?n`uU2v$l-iv}Kp#379`MiC#$Mk9kz@+|iU8Yw%FY1KP=e^o_QRD-( znO~p#iw50u`_;b}-L>cTtA8(AV}SOH#Mkro^?Lwq-xoVCic-(}U;TU0P?Cc9EnoD! z{p}w>58&ne-(`+xgK``RyPU;D*xK@`C8*M33!BLDH+{_Wpyv5V*SZ~tg%e%}}E zYrmjfK;1p|sfXwe7kdqVQAFjXj?dSIu@N}73{<-`4*8c;dXgU^ZN&xpdfD@jQ zfe|3i3Lvru2um>nn8sNEz3p%5<-ERC|3fknAae7c`SQp3t1k?+%m7i3|CTS$ufl)u zT%MIgsBsto3X%+fw+cYv4NzIaVPFQxF916K-+3$mnGJx&f5+whGRpi1uKY3n#}@{G zW)I7M%a`Yl^~aY#B;LP=zrR7^tuzq2&IsFbPj>N6QelY?sN;=k6DCd_KJ*6cFv&hH z0#3umwKRTFw`?r?lp-rnm`;Gm=}b`{=>qlphhKENO5MfmPkBV+RrFK-1#UXIE4*oI0%w?Ng|#=gbGuDb$3!lA9 z7mv;d51%+`r__lmXpEEB7pLa(&WCo-ld7ZA)Z7T~*Ljys4lm9$@17uWrxn3Z@qMNp zE_vUm`Z_bM8fUEWC)h{Ltit38ALgf(JE+%yv@fEomEA(ns@AwLwWO)FvU0SgyQ0c` zMayveR37U`mZ5(w2PNTh0*#%W5<`PTl1-BAB18$I$f}6q)J1=?i-v)jM#bkN!k@+c zj!^kPwMCYpW)HPvdqUSlQfhaf(WJ!R5w>A+q<;1W1)H$Ca}nb4N}IRbDRL>cH0)l; z#ti;m5|Y~3M2HdsT)^WL6qXqrrXhEXW{=Nq(XP7%m04-hE6rE-ErNm~WUK-~075dM(DgP5n>4*R`N>n)!z4AF=0=xRvF; z;K4Y8lj)gb`WbNWrDxaLe?lGz{E2H~g7IyT^^i1Va@)>Kn(2+|`&k0T523^wMY1kD z6WUEgakZ+Mh)>H9yH&dhGPkZ``NRfDa0IZYsl-lHU|XD3DWb<_p@GE}%Tn{r<9lR_ zndE8y4&fkhJ7eY=N_jY2Qo}*uP|BYE^oG&6{Bv{#Pa*AVm~TE(V!pK;a@F=BH4+T^ z$w3s-f;K}3az84vW8k!o;$nqJMZ2(Jzw;&$}zwl zDmEtYtt&+$s^k|vLXhLh;mZ^Bh$7OF=S67QMzdsr)*Uw6u}V><d^?zYBCE<4 z4X%T;SdnAojM5{^$$jvn=ge9dD|k7Ph-dCCJe5`QD8KH_Ed?A%q8{Q)j!zLnO}3J< zZ#|rAWzSJR-ir7!;lIHvpS_|c0~Sn@jj>d690@9j3a)3O)HFY>ld7z6#>Rkf4zJMa19=I#EGuybUC%W`7-<>B_4=ZcCnch~ zM0QeFYhPPOLu?%`if-}@;hTi+l>ZU(%Fi9uiUSa zt~gF%-RN(&7C6r;>jXJJ-sKz0aV%T_rS?fRN~Q~u=wn}jqoAA`WD8~KVWSPeb?%^- zG*KdpG{jRuHwJ5qDfO{3w3n=qpqF)f6)%^kB-x@^0RyFg_phCNiSz~7dSC!I*RLM=ShOR8cBmTM_4*1{$n z!IDYpXU&hvY*H1?OB-xsur$1Jbtv$`p*vuARaL>P%Z&)&RhSSFALeWWZ}`s?aW09I zF-T>O(={K}1UK@mwb`c%mK=VOn=BX9Nz67f1Jo5J+PwoulVB_gnJ7oz5itHd*1Iw# zem7M&70<1H8XaLc`A(euNBTJr=avhHlat`jV~nV?fSUGd42_C-0l^^ZMd-^zc;j_g zO9iw-esT9F`p4wZa(UenDf6rfjq<9f(rNazE_q3}#87@RI@b;r!8>%NWj_1x#=Y~% z)Uvw=zDM)vE7r*ojcmA(2+MlfqQI_T#;co>_t@eVety@3d1LJ?zbw}H*SlMpC6-c{ zQWd{Xllr9(S%c3`RVj?sqEM$_pZ?ggPqyzJ12&q!$*fF0k0ynr6Cpx9Fnicp&&xaoTl@sdVkv#*1}32 zSBysGrTNbQ%J!ScMw0J92&=Y-hz)yac%{mAKX?uuHVzzr*^WCBM;>Qt99klVIkvxP~_BSh5pPtoUwh3!I-F^DxTSR8QEL%lfxmV3!Sk14BWVxJfG_ z(!?5zkhaah#${NrWkK^a?LbUZ6V#sBb6kP^1kByXXK(2K$s)Y;S2nmO0+NnqOml$$ z_TJq@Mzs()sW?n04foCZPv&UIhEqIalfB?0Y4)`y&W)vRBUlXK+lsTyKjZ)o4S271}2OC^M_1G#fI)~ijA2gA=&Lpx+ zRdKcEc0xI%@4MElHK_@NE8TwKeoUhzuow07^3J!>k3lr?>puH7eN-Vbh*$d=-K31M zjr09fliWh!x8XL?2XuJYsP<>@`mfO_?MsCAj7yXO==~MVzea1cuhAMnbn*pY{R7R@ zyo4{m!OZ^}IRE=jq@MlxC!7c9Wj#Z~zry(!%=PR$Aef^42bzBgK>xtAzagwm_YZa3 zXIxJQK=RL+8n71-=>b}l%zy~&?|@g@|2L+8j!ymqkN#@^w?_;BB}Kqb`CoG9ui?%g z{L1(oo&6mV8UTJ>0^rwc`5mxf3w4inZmOxbRwA_AFn$t>A1pm?B3C3T>c5EyO>xjM z(!TGNDk7-7*_$cSD(LB4{bdjIWXVI>=EC}54eKCA{)4uqeszsacQu}pWmLxF*99JZ zl-_OiMcnY2yh|=i#3mHXa?8o>*yeWE3Rr#ayEsUFuON*cr?Yi?{}0%!tLm$ficcIT zA&QovX)s(E;$i;grIVDJjt?A*VUU-@3!A4?XRFGiGXd6a8!AT3pribpR=?al%Njbp zX^%e^t)q&@91V?GLT)d&@V4(Fg~nYH>#!Q#y4}{ZySY0!0N=}f^__fkiSAj$pkg`l zpiIMliVNiu9!sLlD)nWG`8HXFRA*nu?2O456c;lq>$Gu*kJ+9+ke*nlE3e61R-(jB z0B&}I;Kzj2u0M^5DQxgJm0i?gB&x0+AGwFx&+ZTLum`31bvf&gZfj9VH&c>iz*83b zc9MLsZ~YM7wg>Eli`)fE_Q}_o3N9siYU7uH2P-4dz{S*b>d6fZM~6G^kYMp+3FIP) zpNiPev2bCx9V!G`U2%ISPX8S7V6_s>Zx7zUoySrD$;hRk|W}o7v8Ym^^R(Fe< zG@8@zv>{0Ob7rcWGOkl{o*`wehI+(&kxUW^%=n^PE$*;hXSpS~06>U&3+*mk*6;0J z4LeHdj`2oPGa=vz$RS5N;((V|V0>tMC3Yo>$Y&t+=gF5#zqhC3|qUZHMZjQ8ZJ z5=D5>d4w=6goL!`_zA287#ln09BdYL)@FPfXUGl?T3>TxflmyryRuP6@N%rI80P2i z-~l@HQnsMBV5i}cqMu;4qo=klGI@@n&XS4i)*dTa?GY2)Qb}_xrcsxkLJ{+qZ{#P} z@KgxGRo8tCvNGDG&tOhAMohAECqE%w=Ng@UtW;DCQ!5w<^M3!BpLp)4 zEYZ>)hLutp!|D>BxSR&kh`;_PAlg)}Y&1+EXR&Pu_S~C*1Pe8d%q+92VbatFu zj&8Wz2g%O^&dH8Na){fqW(9gV#5c=7;rz{}LmX0l5E0jyNxE<{b?+5?stIvq*{MT* z3La;*$C>%6BKdG_9EaWlXbdfGgK$a{81y}AkR3yb<>Xav6P?GB!?(Uu#IFmh3}%Gm zeAlfo^X7J8kxaq#lPWTGxE8>r^41@H16#@o?qLvxOpiR>Y%(J%JXBD87(Aj%61)}r z(N$?qvG8N9IK!ZLQb8=*2Or4Smaln(NLOUsSxglM({(udW>G`!)$ahe%8#+-@m94=B zERuvXf2h)b2_p}lg46K&vxH$^eN{+GzL{NhreC|R zD0IDXef2cf=R)A!-qM66$3EFUR^H3&R2IqcS?a@@OF}qe#u(V>$3mfiaYw2MsgaEi z?mI1*yC$F98f&iEOldKclm(MtmX*1g8y_bPlQh*!14C_S+}4!<)G%)v=}(#lOlM9( zf(tkkxQl?=MQDIcHiy4kKdX!b4T3Ucr&j(O2b3FrE5 zJ25lU^HkU;bb%#)^q8aOLDC6n%OcWZBU!n+H1RK{rc!kV)1Ze{%AAsZil&L>U6ic5 zQM=ia0{f*=pp(q-1!@vv$MQnW`r`Ogni5LFfySr3n4E15_ya)7i$5?& zzp{VV&=3I;3=ZuLA+L7{nC{3LdC(TXOHvDduuaYF1U~t!3VVgKwc;s8tnL)-{8=Aiwv~pYM(G>0v@NfEEN+ zPwKS^JlGEqyFi4UYPjj5?#wOo3Pg@P1=Na}Wl0%Vwa;PejHh@CY;N(b($k^A_uLuh zD3%+!$7z%J?k^henedX;Yj$>a<_8>0$79~`nGE*4MXYH~x>6#Twa%Ue&C7@!=NQN- zoVk$8&~Xux5o1FWkO5ZDh30w4q$_v|}h(cqsr`DG#I4=Vi!419?X{?0V!Q0Ouv)bdK%$%pQY z)LIV>kNbG#^rq@}Hj+9sjE9*d<7RjFIrzf0_;;52X0$25bXWb6{8(60h`JMRpWKN~ z=6>p255)m+9ozyR(}J4)=b0OE#pd4Jw@#ZUX-7UsIlHYkx>37N7utGEw9BhGJ3;Qh zCLV2W_B~7&JP*=8;v^$YjeJQ8?w!DxDwua zXKI_9USH(g-@fx;ecKMlZPd*AhDRO+o7Dx1R3+MRr})aAS@uA1y?xDfLLR)iW$lty z)i+q40=rRSdFtA~k0{z4NR~L{Ya5)xwins>w3MTeGnDehi^o z7i6o!vPRB6oDtOkBDR*Hv>*jX6>3N?ytk4QoU91c^nPu@n-?7=qB7Lq>|Hs_wVEYW zACyBZPrv#`Q6}JYcS_rwzL`dGADq||%__zBF38B?u)GIU&oWeCVU1UbxVP znS9I0;~4J06Y=u`!*G4XR}1Az4zcZLqCTH}h|Sn}hW&hne0Ym!=Vv0FFJWlU8T zUx0>P;@O*^qB}xA?H)%^{6HahOmvFjq5a;J{F&1!uvbPB270B~os3EFGFIo*!qgVW zk=(F=NUj%gs;w%bhK~$aHGjJHhPI|A=^GwWw*=V5N>NWHRz)T zE5jDssf7~~`W48QDLNdn`G2wms8#_B+wRfwV&ZVv5^DXAN>hFIsrsfBB6ZTXSRL~k-`p7p&I4m zwepm)azg4gG*`y8*H38H_Y0zyPYZhele+@^c0$|l>y3s*BCH1p*WqU`y<^?xBAW?f zP&e=e<{{4uK8i~8=Wd+e7x41B4xQa`lEF$OYA^ID5s};oFH&z2qB7Bg2QiY1R`CdCs*V!_P4ow2 zvnxH-{ctS??2}pPK16X155++RcxT*d=zaP=S*r<$PPyKuWqIFd%^z0Bi6-ieht!s; zxtNT;ra5_QB8nOjQde2$s)52m%d$oh!WVBbPxh z$p~_56qqTH%KtL${1n%A$ZkY-_>5z!r&z9_=AFjuLdce#Ham*lFB5JdscMjJ< zC)zc^{xU{f8_h{6kC83HR-qd|JLYbZ-Gcuy4Er0sc!k?d_wFtUDK#3(cCX7IOw}V= z8F`fN`0g03e7Ga22~|DnP$TyhDCA{8$?@hY3)4xzA7&8S&O+N6`{$8{@CgjVrCFg* zLrX|wYL~%>g(9xZRjMw=Mrb?DEoJTSw$cI@57F{4%g#`G6V~a< zV^_e)LcZ(wvc?8OT0 zCKaLNqf}&Quk5HBN!dJcj>sWUi(jqUNAA66t8ry{Z4%@v+FjX#EGRaoDdR`X>a^4l z`%e+?qCUxY&1JM^`*A(SuleNB+2^O)y8ohiaJk#xC>4Tq@rZa^mADy&-Nxm5cL4fp zkFsEO1);bYZT4pO;?%~Gy`{~XV}A8iWXT=Y2CW7Qs|_Zt^&RZTH_Y!Wc0-XpdOnF_ zgW99>F@s-fj!&jFu=PgInFzX;D8r&c;#N|}?sv1HI^!rE`& zi{74&W$a5|NJ+*hL#Z_x{2o*RE9|oKvzewcp{2764ZY>3@YnM>JAJUI&u z>@DjI(y?P>^IDe%2k9{CoCY$Nvi|@qqF5|$@eVFa&-wc<+Jm19N?VU9B*j8zn+7d9 z#ghi{OJcaDI(z%g@69dhDbH(S;k3~5P_<`VBpa3S0ZJ5%%4GAMX2vJq_##gy>Y+s$ z1nQ+R!?v#R-wVai_I^T$t2gfKk zc<`H6`n`Z#X@w)K%?0lp`mvq4&ts}lns%b)`@|tX5g4pd%FfMz<}Y1T`?td+*w^R3 z(CS^B+z%{HoF-kMVd67o<=ORuQTn^Pp|=iKS8+oweFFg!hUsKhI|stZ_6S+C|!W`sC9vTkTyMXgOj2Q+R?Zu%kjWY+K4< zV5%0%-3Guq11iWX?}eKgEA+tvZzvP#28+@q9{2CQJGCxrtX4A49A_MKs_d!d zX6z8jmTTxKZn~p;eXnuc*$=gmJ2y^Mmu zdLh0tqnh^3sY~kp8@knk3)|3OnHn`5dIb8J8{D_abk!;08A6=-Wa6;}@Z+;;OK*w< zBzi_F1yMa^*mQ>-r7UoE9+RkvSNebAbmXdDipI(pC{%IBC{}+SBtJLd37m;36Fu6~i+Is-riqtI$>V+wi5fyX4a-be2;3?j ztZ(!K*-A2MG9?K4>Qz6{UGgjCEYW#VsD?X<@L!EDC_O+-gZhx8q}t^F6fzoLWj9yRNCt=xNO zk(2~jH$Obm1Gk2aq&j8|t=nWW;0 z$I_ToQ|0xaU~S1m%N~MGwO$|`dXZ;@dRRrMMxDN`iAIkK9FLWsrA!eeb|rU{4>w}X zE=IEjJDDE<;p3mN5<1(Tj`J5m1!w}hv;BN~)OQE>VJ29J%RYTUwTLZC$`40Zm5QKz z#WU2M7hI>=jdl;NWhiWxBbP17!1{Xn5vu8D0h&SiN^JZW-JYW{2?r!a^Taosu*R)j0;m5^Ma#y8rgD0uvHiK55 z*;Hywspv^GIkEoods!7K8ELuXoNum6T(bNz8 zC?IO4JGI!$9=S_GC|JU63(qw))W#}NC5i@OpL^d8dI(CBC)VTd1HAZ=(;U!}nUA!lBu1ygLw&+=yn^Bw zB$Yoe#{6TafpQw4W3rX}kAjgAL-ns^~h;^DeikQ(tpw-=0nN0WtuQk1BL$_$YH5Zhgm( z(9BVVeQbaA`wDf=oLLr_7i@m`C4TDJMPy%)YP;gD-pcjpXmy>P2g1_ z>yN!W#MPv1bi2(5*5b$6%I0d_$ez~fvgTAVbY3>_L_Hp3(8BJn;^vSpqe7gcFWg`w zFG36QL284JCY)eCzlm}nBJbUH4S$Z=%vr;LINIo(aLTo~>jgG)LIH!)17Al*dxE~Qm znwd3VLh)iAi~;nt>21v>3PLQgc*zVyd8cpUwB|{wDi(bd?t5kvF$3XZyVcQs!Ut!m zBZ1;iMeoKsKznJF6p7^X$ozD(6q4!KcOk8@q)=3%D&~uxFqM;jZ6ZjU+6OCXv0K^J z4fh~(_06xTO_uKd$a$cs3-a%%#%FcNHu^|@v3f9L)yoT(bg8`|E3yQ=QZ=jGiLGux z5a$Q(xd7^eTS=d;GP-Ig-j?f3Xy|^J#lSh@xS7UKV@wJRL^;FM&%kG-UWcJ!R~0-E zn-eO$1W@GkgJy)gzm!kw>VC*JkuII+>~CCP&87{1^uU}cg9gKnblInePl5f4qG$*= zWox^wRPCMCQp94a}*x#1%cON>yRkb_D+*e&emjYxh1DEKWz zV?e$kRmZk-%VyIDIp>2Nj@ntQ5)j3DL_c|@T{8M!0?nm}<&A<*jwIByngd-oqz_WP zYGhh+6V-m)*wSn{XPkE{R|LroF5gNU?jSsNC=B0pcG%0sK@mF+tQA0dG(r+;{yg#V zm(5bABF;`K0FeNzkd2nwgp+NrJOcLY#?({$GMJS-Wrs$yOA^m$W;%rRv7A%Gmgmtf z$~lP_Y<4`mp(XniFL)qed>JXyglu`XEbPVTC26 z0rl|2X}iJNu~q_lin~pPhAuDhQ@eK71M@CY_co89{?AXNHB4vXCTnc2?gg2GbP0DI zYz`G&)9c?vlgjbdQ((n@=+m{5CV-NI^`^YNbme&KW+C$v8`<6jDJQKCE2<@_DCTBo4Ro{8+=I9 zC}3m(H}|05z|Vq~Osw3+cq8V!h~vK8yCPcT+7TrLz9*TP|6Y8`m!J6EQU4aDxl`$8 zttACTG}C9@6}+#w*hv##Ep+=4&mwQ|8~nZx&sTs2rq-FkQ!YDJ?H;!y@$VZ>z@$Rl zXlQogS}%H0Yb;`d*fr>s46U#~F3M*8e82p;oK7IR&3}{!G{eJ(7jA2)g>)-QA1v#; z6r@&7g>mVJzQNN5u^&VW%&0+a0Y|JgE9e2nh2=3;JV7umeYuiC9WwF{=907*2v7Rsd8+NY2$J8D)0yre9vmuJ78B?=RZHV|WAt@`t&Kk+{m~_&*?Va$;jX!(UmDPbB zB`Mi5m)70U8|YR@TWfwb#iLXUA%QPVB(>G(?#W)zYGwuMQ^-He%rPv5q{XCsr;Csr zDO+KhP=~&|Q}CVJoen$1mtu9<93U2NU#w3rb?Ha4^YraaQ8GKHZAGJ*8zAx*zS@^N zR_-ufxxyF63qUVh=22~|5}HzFfK+KgDnU+?am>Lr-S}zSAqEfk>3BSv5`pKVUXYl^ zR(*NmaC#_FzN4FVn~385V@<=!S3#->u8`D1Q%zj10Cvdl_u@GoA5=uo%9sp4(1SKd z)mk!B!_5HMeC4any7s`5N8sepk^zx!Tq}WIeWLesGjDuQLNd0=mn7q?h(lyevUqBt~>z078rJ_%rSGhs90epI%MjA)(OA61Js z=Aji2wm}M~R7PQjXlMh$3T(H+OGzc|&C^8t$YZAFpUNdD57t?PQ2HbTBdcVuTb!n9 z4@AFt0Ttp9+urAJJ>AokJmfi~UNQ7_G{lO&+6A#tVHwz(<3jXX2BEOwm;TON@2<8E zen;f4Tul20SD2**w&pE#+NbJI_JrFqdvFT3o%q^j+LxoznN_7fkg|nH1Vu+Hz$zVW z>LDkC8(jV9)?D37>?ZFXO#9&mkTQxc1!dSMuSW7dBd?-#CYItJz<^gZPA4@XnkbK= zZ+y+doRgzuLS@H7MhN!Neh)x>oB`{Sz&Rc{t1S&)s9?xpd6_3Cp|m{>Q0Db}PJ#x_ z)n@2E!d3fRpSwIgND7x!C<3d91%b9!6nt%{^+2q1@1v?|ANw8?P|I|j{XtztTnKuN zK6d>22;v-phnZXAO5_KGs6r5JW8y;9=xQq5YoFO<|>%yKOtI*Z@RP~QKZ2* z%GOWqYlBeGG#21Oy2=^6BEP%c1$t&|^pgoX(1+Qsdd>7f91>msC)5HP8QYHns_XEv z>Xf7|P9Z$MbNAv1IusODopI$>t`v@rg;nM_eN$=j=}n;TliaB`^>-BeqGqvAoQ1^*Tqo?Mvv_9~ zV|Gl+*;*9Kg@U#>^UIjbt*A2eu^Fwf3UQw3<&AC8?Lk;tSzvN3>FYf;lnP+eA5#aw zw>5h%;k;SyP!5#?!` z|K+4L9us11VS zLOB707Q~6eWKpSh=2O~7y!L%O6#OnU>9uH|5o$hto0w}yqh#2(J`+-XUro&uX&GO4 zlAg6~mFE;hF3$?c`jG<-(?s|FoS#|6aUJ7>o@9N&Wy(}ZY*IXRR@ipEgt%^F{_P>&;4-PSy0mqR z;2f_ZwL!Xq(j|}-Rf|ucubPQ4j_7?!0ZqWA50vaZ#Tg3C5R&|AjHLty3|%Kln2Y*! zuwn&5mj?shjmS15b{B997a44n- zk!TgC$x_I*GHq>$kAT;XB@HxMIDOD8RtnF|;^@2_i$*~VzR;EY9)!pJlM`Z^O_mPB z(U5tR%T*@A5qY#r9c^7fT7qiPg*Ka>=-12zNcnqsA5Y)8qc0G zGtm5VeEAbNv$OxHEqy8bgrJhP)v|H4(8Zw=H8eAZ0FO66wy9l!t2@=T_`#_NA0x%`j$S7+!MC;?gG|21d+ zjK_cT$uLmUQ3A@o>1b&w0Si_PbS#vBx>-6pT1r5T^51$a|IZBfm!j)G{{esFvCsg@ zRq1i)XsDkZ0o3AB0;-DXXsQ1Tj{Jw^vwv*=_Jo#>juKEG{onEAuf?-}W_ErTqyLS+ zMa6$+*^_^?ho=TLxCGQ~5xv{cxQXr_1yqT)K39nb!86&4q*|_3Xi95Y7i_j@Rdj>4 zx0$0n>0@BKxw1aEYGi~#%Y|7{%Wk7*RD`I43ap-lVZ>uJpr!g%ia@*Hv3!3gAu*4r zefk)-8rP)`b`S+~^XAjLEqY}vx4YGo)lcG2&`r}PV{hf`pq(FF9NgovKA4xOd@yr( z;5!53Kg_>8xuFLLdEyYhVFt1YD0!zb?d6Jcq7Rz^w+C1Z3%k!ustL_xT z%54G&NE{PX70buq1`ltp4F~3lE%8~}&#Aw@$3|K3BQf8*!7>0Dkf|fSG#Zx7ifn+Z zK4H{^B(yd;m1So^vkV4@`Xs?1{ykvpUOjK^BX$|3YnDJ`8(P*ZiZ)QgXa|cbnjFqd zHq4;2jbm2Acl-{RA$T-_JPPrN4Ly01LyL>R_&5WJ#3#OBht`+Oy~jP^ zOJ|+)<0$|ZtiW&73eq`%*OU{o47|GTBSq1Ah`=Y)AT^21Rgj$)v=2ne>D91yWo`V@ z@cCnD?H6^$arg!Ch{7O!b}UQs(My>1Csfm(M;ERuw6xF8*(f`#Xv8g_y+3vZEPEh8 zVzn~s7U`&bO=p{I%^73K(aeOg;zl{8wO(Fu_vYLlM(#7%h4SXuU~Uy`a!%Ao8M)&4 z5nZ8g4Ql1Dur{gewfL*c{EX`io$^X5w2Eq%xdu$awGZ_%GqlOv&CTCIc}deg;}DP* zL8l4ak|eO{ED1Srry^+4>hD8!^bID8k=ZLqb;mLFQ!NIz$`Oyi3LIMJs=;A05M{v^ zl*cR5_%`-IJkMYzat_*cij=K08;4YFC4|n8EMvw9)@*xo-PilgaJdCEL&~Mu$aJP` ztj9Qv`oH2>6Ni76E0RxaC`hx-iJ-j6(mwksc+z>7j1+Lp7CF13K{PqutD3zNvau>I zbun4OB%=`7m$WCW)DUTpMBUN|8^BJ*odf0WBrg6RH%eZg>uh%o6KnWB^uz6?Zoc^cNkehEOU^iG~A3RRReP zA)smT>NOkXUcFSx-l!~((n49}@#2+I>UY81m}7UnG%P-)sD_~|o@ief-5Ro>J-v5R zYnu5ea83qgfV9vZQSljBKhXJi!@(d)egVF@r#- z&UL^8CImVPlr-{rx{2$P=IwOYkZ6Zg7?iF4PRoX-+5`6H>>r^?Ho<2z#BgNyh|ug+ z$a{CLZD>Ev0DnF%_&T^VofgZWPbS?_Sr%Tn{CJ4i2o`a|->>7PzRpU=9!X#Hqr>2| zg}6&vFC4#Lq(@#MG!_A5xs+FrYqTwaSJ~*NGLrPy^Bp%H{O)NP(QB_5mP+yvx~X~n zl&>3ZExg~f#O9l14-8t(eGpQ~6=FCVSBRxt``2|`DFH z5p7CWZD>gOE2Fc6-N&uDew1f{@Ec_xL9sBa5LOuJ63$i3P#duzaK7_T0%2f50 zfX%szlb8o}>W_sg{|HWc0Ott*KF+9974nJdL%qcZVpdkut4CCPn_D$$;+pDQSB5ZO3r;(4(!Jx z%4L$=ZT5aoA@676=2qu40!Q*us-?B{o2xt*jL>)%`MAVU^CpVq3B=SM`;GN5O*o9Y zRh*tmIib10DjR_FxzVXf;tS4KmrrgJklhKQ@H20L??cVSkgJ#rPJ*4EF~a8mKbb{;{k@gP`(^V>1lUWsiz>ep8+uQw^x` z{)rk#QP=(IDfg+E5W}owp*eoZc{>F&ra8gMp#SvgTkqN*kW%Ssp3NoUXvyACse)+G zQl@m{J)E>~wO#@Vpdlu@H7GTaN>+kVgvSbc!vz=9ai(7c((+Y;6GxSXb&9_aX5rmG zYLBFs%gh_yA2W9V5!S2J^co1#p=Ks`L~87z2qzDC9PC*au*PdBm(?c;2}&qM(E}%0 zYlRjwcq;l1M|ZOa=Q%_>#wW}&gRs#U5AC1lYZyjU^-T$t7+KH>9kS?|Ok&~Y;2;IL500kCX6`O77y7c|U#+B&d`+BQ~XAeuu~UaWe>#%3z7dUmW9IyoyAAs` zg!*%1uk{Zw!Pc@+O4iT$3d1(A+vflg39Ypd!Nn=d+_v>w35y*foj@yH)P#- z>Dq8Nhmrj5>;Q?Xw4WfZ^@df|rbcJD*?MfDjAW&r78XW)7J*cQ=xoZmDz#-T6&YaQ zm)kCOXjrn`+C?6NU-|l*u%{6+qp?nAq1#} z0_UVPkNUbXdQHS$u-LNL?8ZmN-J0Z0#aAW|1w-ns#j=o>gi6kfJB^>xFvjeYt=$Ar zD+gUg7uuq+R@PWvWe?8Yu_H|o)G&VAG$`s*fSqY@T)^{p@YNa4QFoy^lp}cLDQ%}F z%Pq>*QETlh8Y6Z2^@*J$SfoH5u7EkEph>T047?Ah(fAZWWtLQL-^Ta`aMWR^FPaI zUMP$HjO2ett>5Hfe4)wLu*(9VrB}`(}WkEe%hx zlFzhu$?7wQx7nZywt5Sx)TY4Oi(d$nWrHH8`^Kjdo)s{@RXNBr>1R=uGP#8i!kfEk z$oV3M-9`OH!8c^VyBz&j0fEI-u20erQV*(MQ?778qQQ44>^^Wkes#GO_IA%A{q#hp zp*K_CJJz$kWtx?Hi*v1qByx`U&bk@{FWwWef+E zv$9V}6<~+G6B$!f=W}A0c03S{E|@;!cR`B74w~{kvCYn$PG*fgL#6eI5wo5!E(doPGFN$QVvpm_`+T{#Vcqm-d#!SuA08*2 z$ca>>8zDm##@aTq4Bf=pGE@ zg2433iLP;9{n@({#-mXU7bTJ*TFGd^rip#g%+@nc=b%&|Rhk(n z?tvW33h6$1Z7id8AlKMg7q4klGvT}5G#WlYhi61%)M$j6`(eL1*I>mlO z=u$W1Xo2w5GQ2{D7BB`I!pYhHK*AGCTG0lj%K3>}oL9Z$j&$|QBjRc@mOfW5J{_XG-yl7PpeUn3&jS)?B(gLW9ElO z{?e1`CO*Xu!{nw1JQ#AOAnheRWXX zYqljGoM6G-A?U%~-Q6{~yA#~q-66r<-Q8V-ySs%9N$&02Z(dK$?V7Hd_XkCB>QsH3 z?@;{KUVH7e0t?C4ot9S>zn7l77K^lws#>v)`$>I>J#AoWE=h8&&o*kY`#QVND0ilL zM3<5iZ_eByJ4%A1{-6btX6;2^85wNf19_e3KXA3o;@imVMr2k#&#_t`RHs4hb`0w@ znvenwZJ(}ao_;wlK#Ovk1(H4kFnXMW9J+I>)xm0bq#U>G19IK?y5qiX9Cy6`j-dYj zo};z50vgf!GFyPwn^A1)kWmln@GNi^0n)a_(U@FBAbO+3;%kWNSzl_&<1FNk~PB&j@5k#;dT)lbq7DMi}o2f zD}^fYt28k!OH^^RurCs;7O0qWreKAlHtp4mBBWMI zBD2b!3{4C~5LXT1>LQwOR~Pi=9&VavO*d7C8}F4{_o$~3q0GElXdesf>zEc!ty4Bn zIo|^2HxDa^BBwjY4Et}SH}xc7)Wl7(`*@;-HcVl3z!=mZKV5~yE}0|>uivcvpnHd zM>!M?_mr|L_JkkrgxNq9`-nHAV+nb0Q!l*?R2X1 zBrgmI3#xL{r}^hqsSJ$B2j#AomlOhdt|gkLHET%n6QKJwq$)?oSh)A!>6(zZ@b&z- z`7=I~HGudWB}#Y#Y(A=m2*7j+OWJJhq-z)@$bd$%8bK7s?32h`j$UuC#JM4F&lSL% zIo(@B%#sXD##UgV2WI=!?U>OJ?-I2Tnyf*Jb?d1U@^biRVyn|`(lJ~Y4opLWMCs{GougW`l1+B z<-?hKo;Nb6Xuk>MsHYPvFnI-#>pHmDV^s~n@Z6$Yc>L;*zXysm_u`^yMu>TN40A44 zMsEftk*pk60-sm-X)}BhW$d~CzU=fF5qBAGYG}{R^fH^cvr|Jbs+kgcP!nll5b^_7 z!nvSHZj!LjRxqQTEKy`YM{_ROBcp`lj&c;MZACKQP^ujU)B2#P!%l+C$oGEF@z`zh zq5&2SI@;J5;qq(I5*{8N_v98z!0dxRh$4QbvnIPWrhG*Ihs+h z)vx@QcdaLCU`EQ=k#Q+;u*>E^ln`QkTy)@|Sde;SCjd@aryFGW+Z*PHty>ZGs%J^a z4`8|gKE8<9(uQ=qaxuNLb#nVGbRdoG({9+72Q3w9stUy({k{r9?s)go1D*-B3S@%n zC6x?8IWpu1I#hW=#DmH>zhG%;M(q5g6H(1%a9SKBN__ihu`K}5GM%I2SVEU{nf%1W zs8ecDOAI7PD!kU#p>6A6n$r~b+O;;0NCM#p)!gc9*FIlXKI|OK0^)X7sjqIttx~a! z=f(SpMgw##9ODLo{G1$?RwD4Qw02w}gP<#0tVH)S@r{Q&uo2ep#4)rC1E@|9~oTrdiCs1neDe=CE zY-6o%jmsnXZlq`sngVH;I*%>47oSr;S;=@$MdAN3-iN|IX|?~F9cQ8p$_n4();Gee9yTFr$i;Eb(=oK5~9bpZoMDPQdxd0Trz=1e#kGdnlBI6iC>x5BWXz^^5(F7Aa0IsX2U z@h)ICz1BcZu{EDLo(ili4CU!Kr1~_wFS7J>&d~@#1IcjZ))I)AW_`ygT-rs>PRN~q z?h7lAG&7EwXhe=b4{5wgoWUhIu!#MZ`kMQPKqs&YqI+&sw~vG(7-$FC%ie30{)a|P zv#S&&K<(89pfv^~&+j~-WqrQILzb#mqlAs;;^?oL?K~r4(XQo~lDXL;+OmM!I>jki zm}qAjSJ1z_9#CTp2^;}6Ih18&jGte|XpG%~J**S_KtFII*)Lpzz$BiJ(oDmuyVPYUbt?FB@a_5W3~$4qe>simr~iym8-+v-UEi-Aw0I)ue$8GXd}JIIE>+lK*2(q0D*<59C1PK~{{;_N>Hgvte>qhD*^&O8VJr*ar)MzZ+f0`JtrLE8 zf~I+cB8+c##>{lgbPWG*{33wvr?J?-QO%#n|5**|o2M|-f3BK;p346HyZPx1_htzK zU;xm(Ip{IIX$t86*0lisa0mZyv@773UHHFoEq@&SXCch2KPTt^kwX6ZYyVsF3i{uF zEr2%)n(d932QaeHFu(cIyX;_&4 zgBATVLH-BY2K+W0|2t?~B5H;CefzV@!J9ni85jjP|F)Ue+7#^|XRyd}T0kMY>E_%y zkdP!+VEM`_RpdjYVJM+-yDI_-Dg5UOu$O(`bgyTdr+wnB1JxqbF>V%-cpAN?rv<(y_(TF=cb$t22&5Nw9-`mpEb_&(iyyy-osHY7M6=)(Rj zOGoFqgU;Z>%*x^6z|6LS2z>_zD?ez^n|obAGGrP7;s+Nm-oyn2gp1RSZ56^ZGegvJKz0*c zY;aHePb<3#pFuMy59u@{CjF}HQXt&U43Q|&CZfjwq*1OS^MLi3yOq+IWvO|mb@EgK7b}P|9g_47JQ3=;& zF+wVfMyng4V!W5Hs8u>@ByO4DXgn&nn#0={Lr<`0fS)Pm&I%ctEg|j>FoiDHwc^pJFD7u;4BNk{CU34EJq9!K2DJmRxRqw@IM5Z>cDjbgo z*=^*=X^T@EUZBNgcN)95xaCIUEPhtv$I)EMjZ>m%1`4)IAFHOL_gP6KIubJuu83{3 z8atW`;UJy=;Di>yP3~M{kGuO>ESR`_Yu%_o!H7!?J^a?!{etQHSYH!p3?LlKeWuY4 zETq>khTtTrJqJ;4jjW+fp=^$DkPRLC9@yL&QpcpJbR^I8;#iG`N!rHvA}whE|1n{G#^8W!aQ zS@&u}a#gF(jc`vh?2-;1k?~w_zp67Ix=aM*^uR6WSpaw?up0ApEg&-d%do38k)|Rl zqXqc=%ZWL{y6W()o$A1m7z~!$P9Q!)`5)7G>S~k^nnh%h*70V3(YO>0AB~I}Ji>vD z?E%w;YayYR;xcAJUtrx0S*bT!O`3n?xc56>o>N~IpsMzn=#=cUMq?)pUuA$qw@*S$k%S1#qn=@+1jLV9uIifB z)^EI~JWPIF13*%$;;BnmO@~LYwpADPbW(^C;O9iZg|4n`gbWbPtuG$Jt*rpFCFFdxUm{Ui}NM)3eaJNCLxMD9I2qGM;*%3f2I--mhcdZJ~MVky(fx}2ppC& zU@<5Sy)3Fr8^~$heP3ocssHrgr8A8|>~c5iF7>?TZ4^iCuGmDYS< z4mW4O9;8|N1W}!Vqm#2#&*D6$lHjJ@qZd$OFkvrxnp7wF4yoqDGpZp+M+xz#qqW3E zv6b^fy|uW`RYL-=ss=;}2IgOKdnVi3`P3&SE9_U)U^Uo$<3zB>K|yWXM4I9G-9n5B z1m2=*>}6vCyWY$imuoX(?6)QXJz=%U&X}YVPEaZwg`YA6`nk`#zMl(M)PCwtAw+Pi znwlXYnJjcIYz+T{@{$Sp6PvUC18zf>tm7=VOWQbAn3-UO zz5FgT_GzA%;d3Ebx#;;~VtyI7tbR)dtkp>n8sE`p%4utytfwbc84k zj`dlT1XU7xo!I2i?Y&d{wX*FMJ~wWZ*8CW zU*J+n<}tc9!?-t>&59*ziL7dA8jnF3?xLxXg8G#$PXRY`X2m4*AbWRB@tWi%QE^lV z?tWKXb3cHxC2P9=Rj2Z&0Q7C*_D3$wZ@euJ4R{0YKih@hK=bGK-;&nf0PCM8a=(Ig zej~2`|7_@=6S+4R=AYI7^F$8tN0QDz@uR`RoRG8sS zhsyXCtMfBE4Fw z{imw=Yo+|}HAHWs?zdj-EqIBBj_qe0)K7i&TY3`%;HPKz&lmpRI-*~}Q2)m5{CWIe z^)R#00RD63{EOiO;CGnW-)V>b(lw8w{M0oc7_#$PNka^FT?~a}2$1r644r>z6x%8+ z_%d*@SXq$RID4h76oY~T^rJoRA*T;h~_64`O1jV}crCUmQd_ajVLeH1Y!=#>V3xtRhiago)!}+Z#9=3h-5AaBZ8c1H(bF zNyGBf*`xr$;R|#;2>Zr{6xWfgF2SX^jU<~lW%Jh;pyS&7ct{HjoDG+QB7YVXOMwD_ zBs-X-sjj_+(9P*(~ep6MXo)FM#CxtPJaAdb>CA`5l2^d+uHRmpYb z@W@K@(}--GnEV08_(Z;|-$f6b$M)wwyGlZ64Bp>UE zs@^*%CHH+;SEnC%c$E79kr1Cm2j8}1bF&D)n0%Ft5l@=_teEI6CE%}Hyu*`+G5Bo& zD2*@_(jJXkkQqegk#?)|&0iX`mqoAEB45$*G8j)uSrf{gpuGuqS7VPz7xgiAhj3ZF zmps`#R=7==XGw8L%1ur|j9Q;|1(WJ=SVyYhl;r3WmD>2Bl+l_hPk3W*a_j(HS@86% zI#(1P`CuZDJ~8k~qrce``gEsczWqmKGlmS%*)|T#5m5ukkQ6LRUefJwAJU+nI=1_d zFDH=d0}nUyhjRYml=!M`W)0d_X<>>k*70vO;Otnt#={Hac8t8U`5qwK&cqEl2j5O)n7>FaP^p<8@g&as9kdZCdVRt?z_+a?!nDK((W5u z*O)5z+;EEmzQKz9wD3n6s-T5%i`ku;r|%z_>b9lKsqMOA+3 zn^u`$TCG26Yd9kuw$;< znG)DaQ#A@L*Hv=~lu6P9_71#|j`}XgboJo;j%cF3NyXNFGMsbpLmt|9Y`^P_SyOg4 z$Rt1O0`462f=f-r4Y5(*H{O-FNCOZLutpQXby#X#v22OhDHl}%Qd!sE8zX+@le z7(oxQW$H=_N19)F(7Su;pDIo>oqYE1)=kZOh44n1&`5VzM?ZV@+n@uJGr-eg zkalgZe9V$l6yvA~4Fqb3rLO1yo_K07YMw-K9+j4oP=~QCh=5s`r)=)9a`K{I;g2!Nql%IyHQy+Fmce6ugMZvV9GSSj4F^y^B zEA6C#N*K|2Lsa}|&00cseE~?>+EKe=+6g86mF00O*k~YrO>lZSD@1u?ZFv#5ZE>DT%J*0*`C1J3 zS*kU~lxIif896tCWL9h&sqk1Q_4RM*Pt+udfuEG&)JseDdo`kJDR>y|<{})opn*hI z96dXviyMB*OIUza^5}e z`^G6UukE15tSEMp!m?-aw5+3ZL}6v2#nPx}Fk!Y?In(9pmol2ur%@pK&7Rcq#t0#G z^<)*8=G+_ALQR%TmJiehcQ@r767SvxkAi;!B& z%ioiBXsm7a(2I6b9LdV8ZltN@qUBkXTFA!wkfGM)nG`GS!FqHM!+L9hZXL9VwuJ1E zDC!9?+8OrUV(Q-4XqzL!M3SdT?1pJQTsTX=jEp#L4T$?$)Yg9CoWjQ$&?{CW7FwY-t=ZyR*~p<4dASNW59XZZUL z<>hb8``WLd#kZX+URz*|`oCl@%_h){Z!(vl9oa33>Yb968&Xkn1rOMXbXOaTd7xL% zfs2mv{jmxi>Caio#|9BoWfsk)*BO(GPv!9HQ`>k;bW3(~9;VYYb1$a*f(V?PdU4@> z6Q3D7(qGy2vQB(hCK+_wjIMiRc+$B&dWSmnlFVM&y1L7)qOxSpWs>%1oQW2szHxpg zd|cy`DsjAiDR{i#@@@p`#PF7|a0e2mPW}R+<7X2gD-)4;2i0)3ZGvm!A>Gdq7)4aS z&}6vU5X-}am$r{5(_kEL4Uqs9^3$K(pbLC(z7@5L3-2i$q1rlOMy4Ca$kD;kfbPd)tCY7y<-O|!jKv>1-(wYioPDhUP(jL;rOc-J5E+vkYfN_QcNk3X%xI_=LC*ohWQIRsa>G=rLfVyhM#?Z5E0w;Yv|Iw zXC#970B~R2*BB|Ja;C0P!&>`cM=3d%o3iTxV_Nr%f^_!;5c>5p%9qedlJ;kLwupF< zjQ;5KRB6U&g%+1JR#)HEz>^2{7}3K#VocGv4+OheIP6iP1vnJ8ht%>R8fMz#%3KTk zjTV?Q4Z_azntnOeo&GLNBQS|33@*Y0OI~{rSl2O zE@tRSUh-%0Gq_~Syt!HyzBc=!#`2v3%t@~`8vBy*&E?op-kIscV70nhD^&Yl(4A~T zIwA<-A=s$3JSVw#{zi=`v5E;{u@r%unH4xtM~UrN*!gB0enB4|#hnUg`&<|elhB9t zJ$N=R*>JxZ8~~wt3}42~Q|(iy>|@l7vyb~lhN8-QNh~YHaF1v)HEjvX9~gl;`V_l; zht@PcqyTkBVVm2?EH;SI4(Tb=DKv4fwlldH(S5CRHW zSS`@TbXzJE6-{5LMt}@r&!48)e@HN}fORE6s#ZeX)k591Nbot#ow$JPeJ!bOvrDHe zF;nW6z?Bibo$M29fgVv`2OVj?H8=;33#gdWC7?!*B{^0|wob8{&@(1hDHf}+7oJxD zXGlwfZ4|?-`q6IBa$kDWf?~u-{S@)=N2U>A6bYU^GG*vk_C$}%e%B(&&RH$i5h@2P zKDV-S&^+AXOb4eO*Z`oB71bVc3zx4TcTjy`iw{0o-W0AjudXTyC+mg6B*6=syzUpY z4fYITN4=ss;9F%sg(KEyUM?1MRCld!sFFI@x`Nz%)b>HF{NCT+lYNs2hX~RkaJEn7 z`!~kouk1TuD@ayGYXf>D7>HK23f@qGihd;=!(`al@BAiN<@2>~HN#<81eQ}25C?X3 z76*t#Odp9a)WD*=2(m*m^b<7p$lX5+RraeunCEvEoqLmPeC54&(;Yg7uN-BrJZZ$P zq&P-ru9OTGkh%gfUCkaTk?;mF0bT@h07~Fg@u*!Qw`{}rp}kb7*7#(i;%gi=(t=S- z5v2wuhHDmD0Y3deC%TP@Uz7*(V(v>^5%u;Z;ysIJXtmNVs`_4_8<*d@lxhWw>7dB# zY;`)5P@v!ym5Q^NKM{4w4X3np(URN(UECrpwkNTe7OmLv9wDP=b8Eh3%B)>K;h zF|TbCN$Wz?#7b2faIqo{(;6@2B;VwC4RJpCrS5u~l5>r74JZsVh~nEwxUF{Y-EuGn?1d1N`dhC=TZG#jRhN>>_R zZf?3zl{5a7pXB-s0SCo{%6`ch9&3#E+S(EVK~wBZpepPtNUn`zIH8=mLfY0o-W+8} z=I#|-@c_r|U!b*Lk@P>Yz#CfoBZmApKKLj481O5n{5N3uA44C%E%5($`uJCH`G3*R zylE=_fTQ%Re+8oeekH2^34#6rJAPrg|2xBVs{WU}_UOP8h8$${VI1Xv<`le{y!yy~ z3dMxw`}bHRietm5{q;1VP*Ty8m|H?u7eTpLKkp75u?Oobvxmc(!-_aqL%ZZPlfWX% z7jX`k{#>!}tDiNUVyVcfzu$dsdHjW&-~P-~JSBI88;=KeW(Sv6mY!FM zd;xRz5v^d^V{aYZ_Dg{z=T?`B3!PVO7dJQ!@iMw?*IgziM-~*E47fZHf<8f*4y440 z70(4}wjzufg@L*4c-2+Toy7j`qOBBD)O^1_dH7LhMS$CJmYk4~SgnKyw-w~nBHyaB z1ceAF(-6=>P*=i+kgrv~kkY`nt}?I^vx$OsbjR7R@m?s>dD1(fL)aQ-$TFE`=|ms` zV+H+1nqRrR+E8?&E6P0!gq?rr$EzDinq4@Ov^p2)Gc~5#^0^42QCf;qLb<87*y!I_ zK?KpX&{Z4V_Z#FukR!}OaG_I>vAj4jh-L~)5vB4K1AG1WK5}86-cdUV0sdYVFxH8Q zPYD`3J@~0U2(NJqJTNs+06bjPj*&NYddI{`3u6i~riA~ItzE*TB4!gz?@SZ+4#gd& zEO8NQ9-iE@xDKY80=OHaav$;Wrf$ZMUI{^!ie;}QEwPa<83cPU)4Kq_ey{LI9L0;I zev^)Gh9mfk_y9-(rI=Y;>~i_d3R)bC;0uktP^qiLH5ix(SZT=|rwdo;lF?O>#OWI0 zgO?nGT&bO!L6SF+iZ_>9=^31a!im9yvmA_jvuznaiNb3^WEseOw#b`#9r05x#Pw?I zm``+2T~A9zl~yF7lx4oR7Vf!Zc(BZhi5+PxzvV8W6#&ppOCg0Mgo><}juI#5Pkhpd zln}4uiy2N6P*xfVC_cFn)LvE3+EEDT^X)A+F2gS%fKNszaeM|kRNiUnJ`L|%wu)97 zr=NAq2d!Vzynn$QeQR9@Gy+0BlZ1`d8TgWUk1QW zi6dJbKq4so6#7W=DlEYV4FL_KPA{#m1(~_U5U$Xb05evUNbW#)8c|5$tc*^vCpUpE zH@9XiEbZGoS~@Vbh|b-ZVk-Fz!b-=~Td$Q}yIqO$4%Xe9H|1rRKA1B(zF6)0N z*LbsS|6Ut?gtdpMUd6X9zX+v^=>WkYec1jH&=TBhA(jvBQa7~|)&=IJXUeCCG^2rB z^X3FhOUnmo#LhwKOUT~~O=uw@yJ1ayXf~bjlTT>yLmOtU=hY8^GeyfOT~kyM7h|QC z$r({lnBN6VV$%~;vp;yOsJ4cSC3ipS7%h7_)o4*f@#X1fm<75*|yLtG(8@J*GX%4YRiV7DUVM`#!g)g#H-Ns z{td==NJSIQ7VqK<$NMU=(gu{)SSWHJ_cG9Mk zy=IaHJz`ktFY{O_+^Da2zmlWx zD2cl%A=zX_xcX?+oA5b1S!-9aP+q#)itqGk+C04Iy805H_+F)LqF{Hv2Db``zIHw9 zu|4qnOK>dRD$1u-d=G-r)>JNRso2G%RyR{wIGMq3bvcP!K8L4VbTKp)LQqz8!;mR8 zAH!ExD6R5ibK3?T)=vU#u8N&b+n}5fh-=Gnc+nXA4M4cn*kIU&*miK2Ik#}jo*pJi z1<4$A7x$=%Ex~=wMjChfDN9!@`sMm=PKi3XjwDXw&mW>P&AjVHgxB)WPv^eY_CENz z{-B)J<~*GukBGb5PY1D+Taquz2|;__wC73Ys76>?)XFY(sI4{{V^E@b@HFS?;qP~- zV2!`}?8v_3rA$M@ai`CF0CLYJTNeym$BqPw33*4h_<8J=2MrXHgmUUN3K*f!Tew8r z_Q!ztQc7!)oFgX$<2)D0khu&E#N4sN3h!rvXcPe5DM5dm(y`ZjLrp0*YcxSe)u$YM zO2PP2R=FDijHvAVE0`}>NlFne*8~bZ@>CcjZpA5hIi;@|h~HSxCG<)3S=Rc+?2R5& z1Z7iD9RY4+Clo5ekuP~v3p(r=MNaj7j+qANq6K3FEadB=_Mf_hM#F-4bP*sTz>yCADV|iQeUEhGDr_ zSCczG-;{Cbh>A%zW61{CM^HaX3!2TOs}*RV9M)z-Wll)7IAIqyR%<)S6gz**;mSC` z)^|kkUPya~vL`u+CMDB~b~^eRk-y4$$-FK+Vh zpuM4T9HyVqEeCj=wyqWup>CKH^G40_Y z+P6YhM2EnjBej?B*EeH_3&`3EkzpZ#jSbk3WICRdmQBQX0fqfN3d4(S5ySC6Ou4Nb7`ioQt;KLR}7 z{I~12Atp+UfiG?%2UhIB5TnFfGuqQKJ2<(xwjVyo@=^LfA^X%}H|~UvWes-{;c51~ z+f9bQD{=u|@6Sa0WWBQVn7(LJlI-iTvGD0qVr$y529I;wMd@l5N#ERyrs=BuR$|*5 zPE%o2^4JA~R+#l=4SM~~*#B!Y(kW6@6qc{E)5fzER3{2|3hc&rx<;f-Abrqf0i4h8 z8n(dZ-WIADY-&rv1{z~?BIBh6>2WV|+G;%tsU&3-4af3YxcXk4$0B9PVWx zW)ltYrxw7S$7egm9heNeceq+OO_&9cY*d@+(%Arc0t;H?`ML6GxM4E*E|6Go@GjJX z0Ltiq>18igJ|W7L$K>tp1W{zVYGUncxsj{|<@4=i?_TCK?5J_AIht># z?s@lnU)?mqlJx}VO#CG$)>H;KJSs%^qm4DESv3dTk+UuU`7Q`^3TD!a&-BTu(AHz4r z!(Q?L@2D0}28y5Mj7Q>(a8lZN8)6S~t$+l$=BQ;i=Gkewi|H;WH{3}(2EG6(-cd~1 zQQ*s!Q0XBr*7cW8)*BVFcPq#ej+UCaO(ITYNIF<0XdSjT5=jkamH3mN$Wq?u3Fjia zmFec-qh=OROlYO8CsdfGgG~WLS(u*3Jw$>p)Aa~-6u0Q+_udR}__pSmQ_X zc9+!cMkFKD%(X(-&9%Ied5w?7X?7-CTfacx;e^4i^5dHwqKK-2xpLFym+V{=Y~_U| z7v1LEAwYQO0=9b~&_$TQ-eY3_W~kn zvVRK^U>$mi-{FvJLWb>DuS*V)%$@J}2yGsN?N;Q%2Zn%n6kEDy>00)vG^RHf-mSVf z*0TomCCTN?ut|iT_P)wkoo(VHr^Ry@BVlWw#0DlB93B^P^$6S8R;JfE(yVCsf~YJT zx){cYsOxAjyk6Id)(7^Q@pq%4=5ag3-_d)y#zT!r<;lT{f8<*LCeV@4X!|B1hoU#F zmK4SIvNnz0MWBqO?Qn=qvtlC1$I9h{R!UB|3gJBEQ}CpNmll4Mmo5NlYm&(K{aSeu z03~Ue{NAe|aX`Sphn$R9B=NzEMS)3i zW_OF;uRPH7J0W1pt|=A>MyXq^r5S+}Cs1uVx#02%8Y$gPWX1w5Nbw3Zk&>Qa-p1C{cQs@0(~HDKT= zJ^OHNphb{AH2dH;l7Z%WKw}7jcG`)3PfLT5{esDq?(s=-25Z7Wl}Lvh#5vEbHRUO_ zcWQM{tIdZiJD)h!u4P*nSszH!zuB*j29kr~bIg$1IBgG4I7E7_Y+iP{e!jy5{l2ewiFh$nMNu%;?3@%aZ%gD_}1ygt7 z!BHa-8+yD{1wzP#vgahoOcmYoJ;TQr)4mk?>uQC1vgCH3J~h5mf?X961n9zkC8<^A z2bBX7+KhB&a=3u)AGh`zJhm9hOIIDVSp$z(n0CvXHajEbIkzoi*jqaHAzYqFvl=U( zg?&m`T1>jsVGqWh5&C^PA{dXeq&8wzTxY@%gGF|=p$Bz(9NRuMA>fJpfGTZtbpKb> z;9pBI|D#afe=}|Q4ds5ad2a%}e+2dc0RJq?{FCDY{F2Q64b-Rcmx@i&9t{c%VwP(L z*v_7T7v4uk4Z+rXC-$2R>QHQB@!Yo97BKdgGON&!b5~}1avzX`c&x!*nB3XEKV07I zi}};jvyI#^s`y#Q2bg20vMJ!c&csbhrXFr9!lxWMYsPuT+`!TFX+C^kx%qw=g&b}= zvD=%n(XCPC`FM9cgMg=dDMR4yQ|I5ruNo`zKrkB{uJ3gEmC$}fo z?-!{1N26>ytVx*Vnf5W|t8Hl;%qp9?qb);bFA!0o*VF7)o9^@~kPmJF$30G{4BB-b zES|}k?QC4!z@O9P1E#Z&RC4FjZTpz)D*`Tq-|1}fxf}UefPP~Qr_59iZA_(QQ(j;2GHuhvS%{CsKn~KQD+WFPa8&kL7!{Rh zissU-gTTe$o!1I=fG(yHDQGqxgo-aMhyxL9G5agLRiBuWJI$@xtX!VFOMe-EMlf6) zTm8;^8SXJvLXe(Oi3kN-vE$3LrbfTZqpFJ8gR=_ZBBp+S5S^q|cMVEqpAu6ne-VeA z={+S9J_IbNk(35_>}KK|EOKUC7yz$pHnYC;1;hI$LXboI+`BtUNv?&BRkcaYa6E$H z!2|4A24s(X@kFQKhy;?O8r8V!! zn;sNR%})rWMi&@_HqbFcF(gh=?`>e3b<9lt$e5OlxyggAC! zLTchHRx;HNJ`jswC>EnM&IP3rIR#4OG!2WzRV9dK#;6z{@daE1+`9Y}_lAzF30a%4 zLvAL*F`}q!<+gz4UHM+BL&&uXRkNS1{=r%oCbQNpJsZ!+qBn!4)pg>0(jv!#d7d)n z=peN)V|_g!4jQ%5`q-CLjhG<4(VZ4PP9DQ38|U zdO4QL2YHqLit7jJInSYm3I-h*!>$XEytyCgl~K>nNnq_sof^pI1Nq2mQp(16?(x?t z#x~wH{dKuScb6zu*fU7-jYkv}Nj+6!bXeQpTS;XW!nE_b{EbA%p{iNSZ|Yn2N6iV0 zIKI0<&vIRhYRRbcOZi-heN{fWS(uoiwQcD*^6g0-dvQY=r`IJlh(PZwNBa`}B@Uxv z2szGm5=gaM^eA+S9R+M8I>^PkAYnOm)&#b;{P2~D%WrREpbvq$lM3>yhafdv^(|Pd zQtqX`oTF_FcxErc$5e7*-mP1&IeZ$CVyJfevtV`hD;RR?oBYWl^BFF3_-W68ko@=3 zw&7r&z!on-jka8?JA8SQAYfr=ffIl_bp3{?>G}&7?#5Y?$l=-cp8f4bbo38g;<_$5 zHVp>h?J%5$26#ENxKZXtbFfaytrbN7vJ zk8TxP*isOL%dxj@F>GIa4b)^+E^vlg2-@UmFyXSwrbJ@Zma(#IzFJOME@STcd1LMg zmuI~xSOj-GzdB~}#iY~}*-5^WjH$m;vvfa&dgTm*&Kk2}O;48VPIPhERfCPcsxhA# zWbUK@tB{?nzeIftwc>5FTTC^4J$#r?rCgf`>67we0)?!_@{Yadml=4|CeIBuFe{U| zj_W`LY$mS07IwNK{=*krKX4reNj%8G*Y#Bg#_k)&wISL9I@73pT^^D!E~IvtZ19u% zN{l9}$WQFI3DuKV25v_JM`pTT_L^&eXIvzAl7noh=l3WQnfd*bKI!XZ(UfwWPEG9~@;cAYFjbLzk#);CPmB9FyX zHBg!%koJ1-=}?UQOX8L~e^F6&wbqkGBtMi)NJk3PNJ%hvzJ|IxvlXu-vKr$WjfKDk zB)F$Y{-TRkFQSX_`CXtq1fr!w$S_$sd6)vp6}}n|cgJwdVCFofdUg5F5vi=ew6DzL z1MAa5ThpHP-=MKFpA6R4Lj%p$#%k_0h#O&*?kL9Tbc>HH9D&7Zg+Ay$b&lp_rnUPH z!enO$y1H#7h>Csbu|Qhop~?25!3FX*KaMC!Fdb`Ih3s^q!3?{EuF^6;CUF9 zWCcbjZn^Ee5mCVB2DgyX^x&i@0u|C1y?z%@8(|DTdL$V&jEGhOIBI(*L*!m(dradz z^2nT0Mm{g!er`m;19)(0Xs=Sj24Cj)&+#$p@vSoq!c8nv%)HWY)wCI!y!MEyNvfZk z#wr?D{F>07w_wFh9}AEz$ePO;whIr>{K#>q!^J=~6$Z;Cjx0izJ6^T1Xw75=m`um< zTz&J2S{-VZBU7J^I!L&>+X4Z7Z`!G~^m5V&t z3XLKnj>f+8je>V@KvWCV|2cf$Yt`aNW5e&FiV31#&&GYC6*2yZm;rTU z;o7cHekxd9J}$80Q++BRqj9Ri0Ea1hRj=&adcP&$wXv+fJz2!V6hl~+hi+nNvbP#& zNiu_9x@M|?P-C)eqct(b>?O?6$lh$0l;_c7++l^);pPIfkd=zZ?rPLguEtP2#=~=@ zCi85dk>#PXqQ3mJI?ZB6*05&jJkD}Af7+tte|rNJFQm!CZN^e#ATDarVJLEX@tM{1 z^XI2`Ht&y-{sqDV{3+G@9~DdT8@T;fUhfxd`;G9J{|Vv!#Y_IfBnbfcwFLElM|g7@ zBjr1PB3z6+bRGEmp&^>xqCdql##o|Hdr9H`m zO8e=;c0=gue);iH)Phw-5|}#}+0}!HCZqfg)EK1Pj8A6xp_VmK^Kr7j;MUHFU!loW zZOgC`eG}4|%4H=BG51LPMuL<3407s`ZxvpG!Wfi#2$%q#K7KD&8UY z&U|%*w~C(pf;6MUBhw)Wx&wj$4gz3?~f!fX8~Nfs?RIG`Er znx_y^=l0K$)f~*0W^OFRs$`%j%#`j;AoZ}r6wWuqQaqJ&lA1g`Npsc+d+_|~krA@X zvXXII&D;)bMfzY+6Z2J<*tzAx%@+ucp+7h#i$rnuv)@<_D2k!B>$bf&%50^bzmo>| z5pk>lZaeCoE6-6}bJI*4o9P-Q^e{IZ!P$|5Owz$9KR~kx$cjIU!d3^zkpc!GP{pCu z>`NqZ&S}&GW7ic;xn|p@zq(GzLYA634WoQrn6fAIFf9lyyWm6sEf5%OeP-z5JJT_0 zQTa-lJT=9DUZBW$~#`^FvR;XNM>)rsft~aXgRC~0y{}=^A$FQx?zvgcx@d_K^)6Ns9Y3_{ zl{^aw2c{3GZgpUQUSg*|xtJ$C(>OqWoDxeFKfVOhlyW767y4Y@LiK}#r=mZe%~F=c zROljmQhN%8Viwy1GAyM0K6XKjvjHbBGE2NzEzoeVy;RIm5~rHtLP0A{Yb_98*(20K zbEweG)% z($xCcFr!sJ1;hb!7b-Db=JOT@2~Eix|( zNj=Y)V~#n-l&Sd#k+78UEQ5&)&je2G6uNC38?1#kT+G6O#ah$4AdhF1Ku<(sh;$<) zaGLi}*BFs?Ay7q-od`|=4sxIs1-S%S>HwwiFgn1LnAKzJA_8DV~Wq7p_?qmzVG z*eg<}!HDFnYzs1k;~*rkxgu!_T7^TjW|K%M28{)(&8-TD3L|Eqlh!(0F^in-!@WFE z_1XC*bJrM zCDPnpQ-XQ98u=M;b=+v*M&F%7XBdbET{^_@_%bQp2RZ}^tMv_xgmray6OqZmq4MFj){ez|R(FOg!6MpyXi8k6Vj zMwTAj{&4O7+#y`-4sdwe1X%R0e~?n8TfxXPK&n_>{By1BM7`3IB~pLkx;PT2$(Qh; z3+R^|?XFU183qt)lfs8G*XH{E=A0_kpPuYgdSZv4Khw~<-y16H1O)jTD_ji>LkF-j z-VL|47nB7hcG;mZQT-qzp|3Hy&{1@;^i6vjoxRXULBI=nWb3pYu?8Q{^$HSQC_DDm z&rdvQhy1QV&+xhI*4FqdihEHcPnHTAhnYX5CMfv4o$V+kLYU>(zpKMXJFjf?n{r zqRc_qP5{ycoudlY&zYd1I2Xf*3Vw&sI8@oW7gd>Mq^)0QaN{2DLX4i>NHxw~`oA%8 z#!uFDOGmJl1#ZPOYLRl$p;&ZqP zDv8$!Egu=nOFF6@f$APiEGTsB%jdhFSzKhTOEf)7W*qf!c58X}Eg8rdy=V6LI-~Dx zsfwi-0@}Wnu5N)9&A|A}Zx>ur_xrXpBX2>R){2%zm;;~>x66Hk>w8+JnUoX*8)Kj7 z6d3j1&nXkSTEEx5e?x54H0Qy32W-0Cv-@|z?oZL%e;Ba)W8LGQx4VC%wLgH}UwKdr z41ZCN{{-xQ6MugL*r|?1?l41l9+2Gvoyc`1`se}t5QV&LJOkjOyq|Si5oqFdKRQXu z9bAk}2bHB>#d)xET`+Y26Q<9Osw#@$vj{Z zF;B7-Y>ptBhId@BK|H7j%p#)DETrwrB&{-B<#6V19)fNdhFSbdD+G#hK;{cJQ8mzT z1TRN}a<=_GvrFHTx#Yw}Akp-#zYUKQ)NLuyetH5xQhy!PNIkFgllJaFbtxRL)77xs z^E^w^oz(1Ql00pnSX)fl60wGIIjO?P%_UhOYI=bIq~Q2IVpZaJU_UBi8#=3*(s7QT4id53{%)-LK5-T(Hk}dZ^kB(;Nv4aJn>*!tzKf%k zU+UVME^h@}A=PuMk1jY-HLB*=CpqpK3ZHpxJUpy@A|MBW;KRv1MA(wU9?htK>;$k@ zykvWEG$V6n9JLvMTE;U;y}gw^$D>SQlMulG1ZfFg!V)A1D7uOp2(W_+>Ssn+O+l-*|bqmhxNczXC(&KMHYFXrug z5!_7q*SbLpFypL^)3W8?6JMlT{9u_Y=XF+gxjv_Y*`Z)nFJ03dw;J$5c49FRC*GL# zA}iZaj!TlK+=dUPGV(-p>>8U1j~faI_y8HI4fBv3c>e4s{K5(u#hK8XlKgeVS zN3k4uc!NMR@UtIYp!b0Vlc1H$_ge~GV<0Jm{}+BH7(F~I&0O16|1T>v1iN;EcYl#~Q z2rcM_OAME{)cnddQG128RH*^q_$RKLZ4(@cjHl^7TqaY91YgVo{E^2XH0D5@Dr1zj zMG005V!IXt_WM(5hYHu{m_2*+0oE*I^IUwxdjKe=&D4L-qPpHTXEw-xTL2V4V4(~sJfZQZcHr?dV0UCM&{=g5z z?0k;HOlr?Y;W^zj3uweb)XrN}mTetZ%XeALZuYxe3}vD3bK0X)7@ko)xJKOV@iK66 zMSZ21c2+xAFsP`3T?6T$HnNV-vU?Mcq+j(Nn_Jh09E(xE?lJvPxEfdHF12J`4}oHm zxSYjPP%g{6xNWt}a7}rh9as}T3*m=8O0AyW#twRx3u+}@wwnrq;$<7G80Coch^cDj zr+y}C2ghc+87i&OLK*+8)F$f87B)LgbAh{{1JfX^&UVzAjzSb3Vp#rkv37q>OmPCGW~v(M;nmfR57#iEC7|ruF~ffCuIWCuHuKg}pdD+)QP}UM&nAx6 z*7C@Hsw-ZxBbo6l*uSM8=;|BswNq=3k%W*WJg!_!klL_xvb6oD)Bi zVm|C2=$JojAO2VlWd3DF@exJyf43aS_|FS@f5ScT&xik6%OA^u|3kI>Gr#jUYGM4? zP-ObGEcp?g^P%u(V)$@S#HFYE@a|w_`dhyi2FBl;hmim3<@oUie@fu~5B@@QA3lY@ zD*4zw_^9Edun)h@|NBz@`e*-prTp>mKWm| zME%F7+XaYa31l<)JY;(ImetqCwWD6)!&eH%rLB!Pl_zqqouV1IqLG`UG?KkQ)?eG3 zwz;|vRxagsC2p-!47LPjHCbGZiw`tpL!TF|( zTMuI9Rq{droW2A`FFa~ZmLEPGfE8*o(rkCA2eA}9^-f2*SQs-3y7f+GfddecxAneF zZ)|)D4H6&jBvBOn4sP%-Mr3;?o04+8wE~Pp%`x5)^$^ELEU5{DGL|W`%D}=SVi>|( z4n1F~(ed*0!E7r_iqExt7=-if!%y)a1 z(4(lmnYNP_MXcGTg1jh2-DZhQ7IHuCG*!DVdXS@3-pwFs>ZZflm{r{1tuRqn#Hpu` zy^>g%9D8TJ%i66J5>j8ytQeg?wbR%VGL1f!B|J*4lD!>zCaX(N-N?2^5+X1L%{|mb zkS4l1jz+t#S0B98oRQ~OoRMQwm`?f%ry$9UUsg}0Y6$S~5htH2N(zbJ6YDh2XfoZn znB4`WeSqXr7!Y7&YN`~NPDRtEE16wrhdM@s8u`G5U|)I+&ak1!gEu5PjU*dOmVZGa ziOXfwnq-~IYkwPe3ckD>BM$P5DA~4`GUy7CyrqIe5C?R20Lt$K zx)h@oUfv*?S+k`k4-THqfkEcjMB|~=F)y`vvK`x)(u+nrN?(GYL66_t99rj!g9^{> zr_*l?^b=dB?(BNmSe;GVFx z%!TMV*6(@)-jp&9fI?aiId_}Xh%L!JQ@UD1M{I~Ut$@iAB{k<@7YZ)2KwW3&&>UA(?p1@7ABa(wS4xJxV9nkJh-?x3*Os zsOUpUoQRX(6(WK?3~2?&2(vcQn4Fj5-<5^%Ur@C66zgy zsCaGc^-CR3Pbke`@^`vI2LKch>UJ_) zE$|%Zlw&M9EvYgrbCiB14WOp0h8_Z?!1{u~mO^+`33`-utpW^1#~kyAyF7B~6;`-n zk99AouqG|}t*zOCX@50V#s;t&gTkhWlH$~k6cRoXHf*b2?{O(sfC+z3idO_Q4`Pwf|><>CzkJw(Gj_f(QPJt#*ErS|UZz*qx zzn>!C%YuLSZBoE5t9Mk;BUZaXJ>6z}R>!`F@c5>v3T4%xAn~2@Sp!*tI%6Z3(Z=qq zVr+t0izg=zQ}V>>mcKBtF)BY`b9B*5T5=L;gWHslwQhPJMq`7!yQVG*IU~Ph&aU`m z*vc`0^?X*IJC2IqX^vwaG2E5XnBy>tEj$HRW5S?}SC_MVH9iDSA)&jyK%>%!Z%K}< zuXTg{VsQYOWs#h+$$gBb=|!%uM$A+dcZZ}}4Q#V4-G1+dUo`2sptxQ7Tq5(fh(i&9`GavwcS*9ew$ zi^12&B`n(57T*+k>PG8dwVk_`2%`LL1p z2pX9KFp5SB!ws<3Z)L1{GMA$|&2QGN)a;Se3AHE-0X#rDx4}UbyRCzq7}p_1FhNSm zeW&ATYNoQ>S{#-}30O?$@)JbS9G>@`mtUfgytd?x=NDxc!DF1+oDw-H=Nj4S2`%pk zn8#2x%@glbE9U9WvL4h{aOKNsCMYLsx73? z0L`@tcRHQp^hVG0KBGo97|qh<-{1?*p|N^oADVlz)8ywhS+{8ZAW}uSdkMH2&k43W zy1V2HHtXqTLb6hJ&3!~}8eXB;9VL;kb2ANy_j1nN@>%=|U@Z&t8|&LU*cs~n?qB{u z{eKG7K6Y<^cK{!bD8J$Nuh&1QGKSx{^ViqEcT@igSz}=M%K-8Jy*lq7mW~V`$>aZG z>B#u6P0(+E_y_67%JN@L5Ys<5L4WG?n0~+G-@%gN)*o21^P*}J2b`lfi4d2zy6qnI zkgCE5+c$l=kZbnSviQ&6ULf+*>_UJfHu-aMyQ3@{oL{iK-@SOBjnnroM@Eh=ke-cM zC6o?zDY3m|5-Yc+!1>2+h2e?=7<)&edFXqy&NFs}1~^&`%#UtxdMApyq;4f9aKYfg zS=BYHKN4?lpP)KkDY)o+yGRbxk0&0FZjT&XxjmiZoRWhMswlgZ9T4YXCun*Pq5zJ8 z0E_`jj@W^5wRPRl56xxXb4Po18rt&mdf2_-DA$b55svPK7Jl4?(rYw$pm#z~@T6yE ziguzXD5Pe4kyID@QcUW((fERKkAA|rr3`P99)NOSc4`m4$EM)ON`Z;OkPn8lF$~jA z7GD_iJcK2Q+oI!wwrRFza2bgL%smyY7H?j+1}{DZ zc(Dp0Wvnm&X63o9{K_J-m~AT)G_hWR%ipjkcL5q1o4^WHJ*?|XK_YK8M4e@%WeW>^ zOHuWacr$#_W=*riLaoKszz1{wZpBN*78vTG*~7Vlr6O2aSfRXLGvdQc9qocOPemEL zB=wQDhPsRwnT9QHKy(Styv#=s>Gb%PuX#CZhdd4~;y%2UwGmjw=f!v%DGy+>hwn3m zT+C=XOw!vIX=_A+S2nEfLTq>~QL`iQI-a2DNapKZW z(Gm*wXNUCt>F-HeuhxUc_-x8O7b*4}y(q3ap>E2o1=N*Kb*8eL(P=m%hE62eX&^UN z)UeYyP}^Ixjtf8=ZTy;suH;xyGe7ikQ9;vlw)q6Vl#2_t2QwpnnlCMLb6)YU7pqFp z(}Kw@BlqM=OAOe_sf8~wrJZlSMXb-w?y&d$B=qMV2%*{CNeMAwQ|LWtTDotC#7Bp|*;t!9hA+Y})&R5zEqA$H4& z>*8zNR%#wop4o$4BQL)YD=ssJ!4AHBn?}EC0dRZoHt%9S*T-Q{PQ{s+3dz=%GJmgt zw7W8*fQNn12Nk zb%$i5Z%Z?7bp)WH%2}!nDi1^M#U@#*7>t}H zmd4`=cNkhn_e^}MwjJgoN|i4m|4e9>6XTGaNR`GATuZAG8UlQHu^>(#`B3Pmbi52= zT#Ao%+M2WM$-D(He`Fzm*15DMrW?-Fi6_b}I3XmFpjZV>*)!cDq|Dzj*D@=q#vh#u z8H*`ZbVP4%-%2B70^O{IgLsd1>77H>eNwiPxH;vm=zEZ?k$+c-P~boSS*vk^3`{k< zqEB`q3uA&wS8+a4C=x|3)=!%?op&y+_2uAUY_=haAU=&Jjk2-Njx$5`Yi#=fH)%t% z1$g9~=@_gkqBRgz?W$_SMa|3A7?rXw9oZKQWL$Sk(_AmGx$8_?QO;zEx>9$()ZNIZw8qSY`rb!=pFI-2$QWD+_dpZq5K^iU4UNS zuA%#r9m2xvkn0FpWFnBBXQ0@Q(CyAMwM3kE^ACpF8`))_sWgyZf8LW$0|%L4e9QZ0 zx==3q$=+GN*+IR;A2QK&j6Y53Vb6;$&F=uSMUAp)=;svL$#^Ok_(*aNHI?C1;;@l! zPP2t$U+WqI&O=T{rHX9JExW9)7{rk>$gi zH|xotz*#c2#{Y&I{fLtOleqeSj}!jd-TZyo|F6{O@2mb7DxhPf{Y&HZ;YR#t{eO)D znf|WEOQqXtg%!TzSN5vn&{j0Qk08KOB-CkzIxrV9mm^DC&=}BJLDvRGY^dOe>CB+i zJOr{FA<=mIgAr>eVyxE&+4GDm{04T~MFgb280$*zp%mzbskkN9u|XNvTei%iFG3VP z4*j;am(i?Gj<957;`vX6thAq)m;y9>gG!=%73@y$kCPwat8hO>1%zHLc1J69qol`v z7}=YwUvxv#z`_l^Zx)+ZpacnD?Xi&E35hLt;1zbpp(mJ7CB_G!a) z!?4GDEm?tfwm@7!=#FcQwx1HWQw2G)@+^5jstC`p!wgFHQza8I?2OK>zcGV>ly#o- zl88TJ;~n}ig#We2SF$<$3W-Tu@Bq^6$Y}>Umo^t1eEhMpev@VlR$|}liuzPKS!px5 zM8z0HzAOj16QZGF`LpB8b3^eJ0o7Mx#a0iCftrDw(8a{ zBon`za%#{DcVEIy8;^j5iYDaD=q@0igckG~LZx5ncP!a*87SXa23_HD%u_%=^{|q7 zy%J&P0uN6LociP!NE4&yWBKixEwf)KS+KUyrsNSCSf-CM%2DDdLv4try!Ts>J++JfjJ2{o0Efn$%Qj!wBYu2Mp%lsXg( zNg|ikxGaHNYf8)!0lHNU99(jt&*cD($bFQ#bNDrrTilXph}6(rLo>8Z^@f4qS>wMw|SV)|TeW+J64akBD*FyV(-Zo-`{LU~cp)e8G6 zqv)n-#;hNwj0h%^S3z&9f;5Uo02`IrkF=Y*yQI=8E7+FE>1=kd2E2YC5&D|S<7f`?Q&-IF?X(9BWDM65yAv|zhau6< zi%<%&{X}qjGskYjTSKTycHeQ&UhW{=b_EQ_%#3VRqk0zN@X3#z}q zyA~UGAYk7QMnUTi1+|#~H#CT^5iI6o7$NAWGnwdFD6Rs9O&*ZLs z%`e8O_>##D!_$GnFZs*PDEkV_KiUKJea$;6AUBTw0<>%g1vX*%%DrdXaY{+7-J|cu zkxg9080I1nu6M?{D2OE98c>luLZ%B*Wx!W&y? zLExO`3t72HOm%vPsenPKOMY@re3ymWG)~{Fk+k(ovrQ9l6d_&3zOUmJvCOr;z<@U3 zwvvb7tJ~>7&<*WhFGH2kym+`XLP_XmIdAzSGoQ^q1QW!H=rFCL>3K zYKLNiTd;@eFb<$clwMC-H1(29-^I2=Apdj{>?M1`eo}AmoVUrQ#Fash09_=Aayz`u zzVpGxHx*U;fvn8rgC`6gi3Oz2zlFc4oN8}A+#7YO!`&*2_b?l?vPfXpHHz3tU^s!9 zSnN~9wSoxg&`{bzTlpZ>|Gf6i0lpx zB1L_MAq%#ej0p+xHM}%+ao*<0eQU}Ia~4Z)Hw;>gw!~mjpwuD4GK#jw+TvSZ7EfCZ zgVq)g9p&?L62qyz;!z=|tAC7UFVO62@Yp;N*c=Vn+XRhX3&3)?+!A~u8dsSdZf0+E zHhr~sPrh92Y}zzn<%5;xrwZ~|Mah6qDR4D~W`b$v(myh$t67lam2?A8M_Qz;Ro_Ro zPocA;uPv1~LL`?_zr&b?bVz>VPMC8TQ)PWGoDz+FVdbkPK&Z+~?!@vJrHhQ_}j(@4g|g+%cRLrrrN3dLk;Ee=Z;R0B(>tQAEhw+<(req&aSb|q(S>_AY3 zNU)snQ_I9nC>3&{hT)v7?zO#~#G=F!I5qp3`oos#fD}ICsiVYaVcqx~W}@>5V=CL= zIOQqAV@3}#=IQ(dYkD%fnoH^jz-cM*IijU-pX&(t@h#)Cfcb*UxLZOa{u>6*lF$I? zLBqOTkVOv_`WRV}>Wv@8$oxS37rIgcQy>0%m?P6L^jSmxUe}s_{Aj43B?pKd?T55f zRA1u=36MAyBv=<}8fJxdgO62j!Y$-;5XN;wHsr|M95V6(Vr{3S(5~>QqsVlH&3DOV zqFFTh z1nafAPn~UTs2AVxuJOPVqHqsIpBEuJxUnzC{yvez)`g>Yz%ES*nu8ukss>(ToSKF& zJB!zG=jdQPgIUNRYfz#jcWf&tmo1_a?L1)xtyK;&ZIaGKi)Y>iX^%yzr0{s}22-vT1Vr`Z0If&%rI-2|1 zR8}E>*ikQ$hLVXXcW2%{ma0EA^-`LY#5<43^%=dHBouw=(D^tmanwGOi-t??!jenn zewKX>%l=-lHQmiAuc@sw7C;b1=CV626>j^9xr|JuX6riLg=G#He1+e6!(Z?vZN`Ud zfQuavPmfu)Zo1+`;U<5mO5<{Af4(PtJWU01mGR*WBohgjh_7jIwz2elH-s360pmOY z42&d$%M@m8s5YeT6*n+>GmejBBpqHF|CfYwInyP-4Tl0^c2wnhN!p)0TL@`t=-O| zB-$nQmbH`=qJ9m>jWwYep>Jo;2B_n)8E6we?MAI7Sq(vVWy~GRd#5xJyjt){2V$k| zu~;vNdYKZ_9ClC$2VHJq2Z}eQ1v_`ydlAK)D9oOD4~^koTYgX{Iu7nhe)ko1Atw5z zBKRD{17*+U6!F&$GNtg@to<||y8?JUg(N5fFX0wbX{9KkDYyb6nF`)hAD zth5U6GLhWpL!YPw-&!3yI&>RMy83ynwT;T#q%JA*u2>}I#DWpUj~VWAAD?exzX6g( zbHD#P;PBTh{yz#h{43}B8x8!?T`~L>qr>!9clfuo1dMca)T}JHOsv0NK5}AMJ`@&g zA6C#G?$m!X7V`h!mYVrbI-Ha9@73~;hySA%rjOuGR=WSGTK)orf2$UHR<;kJ$45RU zBQ@w7bMiyAEOFjn-)5qCx_iF`iCaCNiNYF5+Q04{fjzD)Dh>4Lb@C5H)a$*wq5sVJ z5fvpy3qM_FW7PtUhL-Enq+9#5Rbo~{RjH|cqZ3P1iJ+-JeIv8ebIvPtW@RGf!GJ^z z0*YXRTbjp`$&35dS)dnQ)?Yv$BSt@ID=IIdHQpF z$h9EhaBnJ2^X?uIK|7esSQc?Jm86?IT@-8gNxHC>jLTTDxEJL0zJeA^Kt~JP&%JJhEj<3 zpeAE5&L*A1A*v_*jAWmYDY;5P*0pP=6)I?f3F^zMOg5!6Yd!ng$z{r{aI>{LD`3^n*EWIMLig>b07* z#wgq>d&mC0PSmU$Z}_Xxaz^$XU|0Um7yns@Y)2!y*!p;49PIfHZ+Kae0@_UNN+uG9sQ5^V$~hnMMM`Xj3( z^t3))tj9rXfr|1JXR5j^5LuQX!Y-A%&(|MD#`mbA<5D8|y~oWh2m-ylXdx%^#wQ#}z}0pC?o5ZfyPzB1@b$9>~An`&A(6 zK#szvoOwUSXhQ_fpSY0vDE4e_>|uyNn@0nV=mS_&^joS&;%hIQe!@UhNpQ|6HQjB_ zL@5uC{&Z<}@<#paBUe-`N5kSc3Va%c2Ow@<)m&d zA~sLC&r|Mv`D5;w5NktzG(#mW`eEfB%evMw6()BM7G$(FQxRG9^+;7Zb8Rno)Y+ZN z1BDj`Et#yGztHQX&&NY{u5;9hux{Uimc#R$9of0o+=7iC4;{UrDF4J4wH56SZ%zb} z1pqy2{9|LJ+_0o~_p5<#fq5O-yv1*P07SiIMIQ=ZXkCc3u{VrSW>%$x$-wi(`; zCoKnD9R3(BwKzf$q7aZpS?kj#^b*`Q5>_(17;nX_gD>@Eam1E|Jo21l)2V1yGI>5N zB}Il++2h77%}9@wGu2_7J=GYqr&XOYy9sIdwp%;#7GKB|JUdzvK?;~U>XoS8MlrY= zu4<&5xYV|MR0l^sX{pMrRaBo=gkGX9qj3}!1G|QMvICj1?R;J-7zHGK&E*JO*=Jro zHP@1+O0WBkNG}C+9Z;MUQe8f~-H_fUu+8dOpJ4kAxmf%;&}#V*chV?9uTSIk$gP;* z#iC`~a-s^9#%OnuEsW(5n$N ziZ;&|sBU?Cwb8R`-mMJAO~Ty)qOdBA#&WNOi%^x}KH=zV!wb*!+&qE}SPV0HU~<5o zieT$8eQ>Y?(*yX*0<#zdP0p&rDFLJJNXG7~Np?P832PW|a*6Npq!GdbGp|zvwl+n` zOe#8_`%R?nxE+e2xT)iJ8f$4*p^{C$T-Jga89d-`Mzx!aGD^7OgU()WKW=aAhD{6` zWPR)6uEf3@6rc56MVO}712i5+)vtYpAamO599{Ys&FGdrJt%x8AxmxiCyYL_vBPUo~1Z>`fI2r|dlJ zgtC^kgHJ2D2jIx|edNxX>|QtPjhlQ>9l%&$p`B6epIRx^yAWKA;e6`;P-q~*@TUITw-HzyNjxLoxT4b0xtTBtm?!#OtR;$#~OrRuQ~XTcH3 zIb7)M*`EiX=k7Y6DW7D2P-g%sxrUvM=}u!T-YC$2DR`G#UK^cXsD<21c9Lu~_-n)&p9pdOXc{(_JhJ5Y=nQ09hL1n+njCoPuD29D~Ez(IL9tWHdq;7n{X(s8fNdL95#e!OW6DvSO&;Jy4+1;KODcvRnvMA7*$c`iU ztD(TQ(U)>7drLnCc46i=r*F14Afy+pkhNKsN5|!)Z)4p*+*>jP$RyT_!&8L#1~F)I z9~1!}h!{;CSm=HZ-k;HBEnA>8N##c-a%MT4>{a?jrcYZUd-s<1UU{#b0F#7aZ&|1G z(h5#?D);7q7^J&{(p)CNP1yjAJQ-aBSzVb!)GU1t-)Tq$x}xC{a7354inQXW!395( zn-@LkGGF*^rY&V0rQGfL~pHb@u z&j@E18DMW)|E95G{!Z^olECb#I0v(;X4nM zAK@6oe?%=Js+neqtU^-Q@^S$N01Ns;ealK&JQ`@TVqQ0Bs8?i<#2Fg(*x*+>Zp@@LEjI124pQpjOY>xjA^6kVwT%^*!(m zK972GtgZ8&$rn)q!)~g^xsaNc63K-_IuKRFnQWaf^F$2Y1$>Dw@KPG!2LxinYBS@9 z?65h^kS4e&ny2lO&DI3?l_T9IE==dFc=1);L1h0*(jj*rdy7>E*W z_G9DXP8B<@TAD-@>1K_tMS&uoOj2C?$qJp!;Oi^1HD)dF%Z&pJZHuO3b>eC~SlGHb z_lZ47Gr}gEQllgYA1auGn3Y2awc&x#i-i65qM8y6(2$SO*SiN&R5yU>A-p<3{hjKk zJhC4q^h}-X+leUYcFU#puuirGKEy)P^ot{e-NbTXmd;afC%n0h{AWEK+aQ9*s%y-u zmI6Ke>updwO4Rxe&-!4o_u%=R#DfDWlXEl7U^?1qedE*=eHj)6g}OPgN;ZfCW zYX*#S&!DM2kce4%VPE+B$jeG=fFgGheG>hp=Rm2n5cBGMOZHY<2>47ChYQxJCE2* zFs22obhY**;u`zv@wV6<}m zcow{~SwotL&+ilQuIQ#^2wJ6tZ<$~Nkh5Yn2~bJ3f0!z+;_2;AINUl?yh)ru#4v)VSiYhU$g)?RqRg$CZc9Hy3?Ynb z0ZcR%IQKzyzAkWpBFp#Xie_uvU-cwb6T`(*h`rhaGv$VT0gU%qQcJj*vY%@D%+`WH zXSOdyxI(g>o^c4id23<$;|V&^?%+!=M4tr zy#$sCKX)GLea$J1uW2VyAsWy+p*;olBeH3_l<>qTrx5ZL@4ae3~2ym`2-sXJA2L!m=CCy(Q>%MPICW<6d@--|A)u8MU; zUJ49*862{5*GMgEier02~ zjUBlpcD7KZ^Br&2bV6E^ala81ROJm z(ZKP@4PbwNl=e*^v;&!jji77kc%g4x*`gaV=GW@6DpUT-`vd*B0Gi-c zAamO7EE=J1PrBtPb1k>J#v~V*4nZej(2~wC9rGuyrj`k^$Y||2FwfRz9`u_G&bPH0 zTp7)rdi9@`_=5Ki<=XWX#k`=*418btZ7AomjB4}g*+2Oj)Deo|m=#@)L{@Xc*4uLd z0q8T=1%gOc2m4cE1na*e2r&3*l+Af{krZc}D}i}_MFKr_YD}*V-v0E!IKVPUqZ|$( zH)t{kI=Vq)FVxHYvpq-Sr?OZOy}IV1>|$rtTp#xl3V^Y?EeWOkr&*xGz0o=q`eGC#r6ugLn=I+ z5SRer)Gr`8j=O*fnAmzKPNZ}Rfyd2}N3jcZI5HZRy;h1SPN98{HqG!_$9QifB! zPOGSOWz#r&ePoVt(+DjiT1;%4STM;{Q}-z+52mpK50#8ziyl}`ZYzunb_K~C8q{zr zIh32HI2S`fuSM4%byZg%3Lml4(`IH=u|#f~QW^|()nL9pr6f_D2?tb-Md29aO}34^ zQ5&?OZ>?;j%sb&=k!W{CG&-BE_yNh80YnHq02QJ88|v3I!nU2q-I1xZJi5?#-t z*`Uq>96M?2kfp@2WoGxscIQB_DqSsmruHI#8>Codq1<%X3V?4yc zbf9^cYGb`9Asa_~^@bz8ZlZAyD^1V#`;Gt2c-;@yb?Jt?bXU{w=C|Y?K$mm+sfNTf zKYXPz36E{Q5%{r^6HT6&Da}@4H(j5Lhl<~IDQhgAu2YSIwaVdAdv zV+{{UsCpjR^i%0@HW-@PD9nJ0s1QV=@%&u$c=yft_T%H{EFVLfo}FK(JJN8Vg=%4JnFJ5qSR>E3L*zwBSh>E1 zbf71U`(T@YcvTm&_G*eLHxSwguQ=JH7Gzcqo!DFiK|iyiqbY}k3uDL?$mtiI6-A1t z7C;5Tj>gXodC4#G%6i$jwJr?8g;qCp$!KHXUrWU@t&1Ap(E zbdZt-%5fXVVccJ1wLKMZAr@^W)*u_8V!*frwWYuIaEC6x%#9!zeMGC~pG4_rTI?J) zWdMcGi}Kzex85p2Wz@5i3nQNHN6$j5ZSOLdu1#wA%nA!OAMV(9O0Sa?nRj03=iRH~ zvd8;@#kz)GO7U!S-^Q(6x33M(be1r68Y!mQUVhUPNV*+Q&zoIK-zg*w#zk^An7QS{ zM6%F6u8Y?fzHBV0c}*LX#h;qy?4xfzl@h2Jd&`boWJtMY_G={wzL(zt1Rb9VZq*66 z(hFF#nx~L##fzkFSEy=luMAcr{tB{)7~t#V%GRaS<<=SB&q8`DK!vJ7Wnd?z$P*&V zpM}?B@8aL04&5iMiOmqA{sTScJBHu{C#Me@T{TCqLeY82@7U3W!Id5XyG`uEE!A&tXk_d?+FwD%M6zA@aNB9(! zy}znwGgILUd9E70y^Q?B_MM|am^)woV}k<<^VM~$4k4lonI_N01yEhs=_gwTcRp?o zcN*0-ySh0~R`sUYMAj4G=IFSu>Gg$r!9DZy*l`_Oua}f* zMhk;a>4&)>x%GI_?Nzp$uBbp5xOF9!MbR3g^blb+lxusQ`5L;Yu1Vns7@t&3p5(?s>0cjjk%^X5<~=SxA>VfT!>QgMv3Twih? zU%KHDoQ^wrzPv=T`NFO4QmJF=+G7k!DAI1^0H83s-JTI2M&nXl?n&X&!$ zgB`}>!Fk>VvzIS~Cg5{BRo+Yy>w=cp>7d|Sp&{b?8HT@Kz}>@P&{U)Twr>o+5r=1i zgCDgZ`!<3zZq|_YviyENUC}X0<-#~@T4^_RR`4!Lr6vp4aq6{VVc{XU^?Ra=k;w$g zRRw#%)b`l?;)4ohMvsXL1D-Z#z|^%YN9pUF8JQp@oVKHmA~rsUR&3lw#9LSTE7*z| z*UP`VHvXEE|0gw^zi)&8c5VDQucrIRxBRQ){AYgcZ#YcQF)>hogqbrjGymb|z(oDA zpvT0*O#LzR|64PDmOqpk|2pGm{p$k$TQh!o+CQHCk4l(mshK`>8UG`d{C~`SRd8Hc zwyZ2>W@ct)w3wMKi{NJeLztueelFtA9Q~w*4{9gMXl>mex zfK%1~OeKGQ&;LA!{Uc!ge^xupYAr_sV#>Ym)Gr`%ujr8=(W}~zfxV?$1qu9l3uGTB z=qB2J+zn&FQ(fk!ZLgk?+mR}hvN`UJY(__ZTzT`Rcot}nJGq|TTo3rh-UYsFK8F!; z9)B}GF>@`)^(M}e!(+aHGMoncgwrQuW7Kw?R95-+it+SvG2Yc^-cPojvC*x`wD$aX zy}3;xaF4KVwBQTDf34=#ZySsdJiWbH7+yD0-Opeoz|HM6SJO{%d&#$d^qot$n9@aE>^GKW8P z{O!-A^1{zF6|I})nE3Y_(ERsq&QmvIH&{$NFRVpV_u6lY%rG|rzQ9D_z+Dg$O!wpN z*n0@ZQkoPkVrqjqEaa?DeH&1`qtR5I;O8}oK;}(n{n6@(S2tgfbEi8fgdnH_H8*Sn zuLyw7`MvtTWbYd=;Q+j4(Qpi7vJUpNR#Wy^KkmrH}fl_VawD<3<1sct3(dZ86H}yYH9D%csca@I@}s znv_wLLX7u(?xT8Flgsi%=ofTSb{O}msEYd{*e<~v-)8{y8CQf|u(qZycSD02Y7&vx zGXp>Qh$r}fj1sh6LWavP)Ro-LK^6r|XUQ*$$%v0zSBLqkUM+kL|#w z*Fo0M>Gu1?N$S0CuBJTDdd(@PS`rr63*w1k9TQIN)$J*#0iu4{XrDs$C!&ZPm#(n% zH2%ybw9EI4b??>@k-8r_d-?8y+Zah~;22IkzQpdL-nnR^UeM=d=CarOHq;5*8X$a3 z$XLj9$9T}~x94XsYTXdw+gohHDi<1;i;&Qs4EX_k9cc`Mp0$rO$$edwj#q+?Q@;G^ z{g)tm7T?HC!j9@du`vZunm35)=B`!&(&E6(W?7NC(l75C#5`l)r0;Dc}h<3v#*V1a9+31jwqo>8}D~tE;~k*nXiJg&{~r} zLa4e#wob2VF)lO8B_3yT&^@hXU9^paPF1ehao*6QMT#hT`%H1l;n~B zpdx?CUk;WqcH_>vB*pwVJyf3p`-R1Ldw_o0L%Lkuv&K!#G%#M2(N9y9(O!j8vYCSB zZY4nu=JxcMGpSy8T(JsA*+d)!${hz)m=X=fae?sbmXvxg)d@D?w~|YE2OR{IMeQ;t zxbv#anTWycmE9yYdn>JWUH^mQx<(B4@I^k$({#-8k964^;A0_uGffKdyA$4lJPHF* zOW@5MxhNLoWu8Py0qaU`k+8Ce`oTmcL~>3hf?#W5txjKiMBU%rUJrDLu`d=;G%Bse zyZh|#+^K7Yta-!{y~H1Y&(MA~UVnEQXryI%dn$iRW>qlN65njTvC>zYKX1dUDq-B_ zTb#?RF{Lj}&nKDO^Zse%66j(t_|SJ6+xpa9z!=VN*IXAa@iawV}v`fO%0&3XhUM% zu!q|y;gzlq6H9NU&kCPvA4K0tT#E~^->dU{wW4CDcHBDEwIFb&!UD2adLR+VVL9y7r$F41MeG^6R&yFiLu+bnXNa=_B;x!#Q!OTSJarWPn^ zO-)^8u3%91U;-)~IO~a2TOMsuISr7Sb)drtW^S$A)8pMPB!O6QqEj+`lmB%tql2Fy(-H4neGHwuM$!0+Md2|^ zp1RJ}=nGI?nN0oko(UG6HaMSh*h+5M^z7yGG0pLkVn=TL^b0F-`J$FI)q&wBnm;s7|d{nuXb zFJSSHBaUBfo?qP&fbRD9C;EE`k(HI6jgW+i+?u`jF~9Q2I;sZ#zGVg+cl0fqn1h;>zaIC8fE36Oa@fsnkXP5P15 zj=&qlh+_~)6Y~REb^8El2nS#)a*#SqUUxOc#> zQl~HX%RcEAOEu^4j~aG_PG$6p!^xqPtBb4;fhJS5S&5G^ny+XbR5qlmT?G~}oo_AA zr$5e7c&9UmgIKzP8Vy<>hO^`ZUO@@oK=4y`J1O|F*dj0Ir-P?=w-29M>%#T;U%y=S zhjN>oUR_RKZ6l+)%`DR(MC7P1ddt?V8Qs8or*J!6#j|OaWZr5(D zPBg7LoU~iGyPYLpNg&h#r;@`e_!99=3%a7ov&;nhQxX(J$Y`$i?Lmpk=AIR`n$oW18o0D%^2gy8Hrt0313Z+(z z8xHV5J{U$J`>OH^pV$C@@2?3!nzdbY!Bk1F4RUZ^F!$bGU*AP2bSA z68%MC;j_7mryO6y=Fuu$Rp@l`CC)`Kh71HQc~IGMN!`dkyTEWFG&1AhdlBVzseT6D zmP}&|uPGaR4|C!}`9&qqT&)jXP2k-%k}I?E4+kDCAwz;3XFBmqYfK_<9^BoQ8(h*z zfY-$QN2izzv69<}svq8LQ`SAk8+N9`l+9mtw0ZO5!9BmK)!;^S*og1WycMu%Dik)z zgve%e9LU@Ws>)mCvgsR#ff!=ifI@ERiWATF2~KYvgIjk9Bq^UfIzSFAb+NOCSwFjo zO_JHQF{Ll+$Z7=<s_6m?wd9?zP14(u?HJ+A^JRVJ zFSuEIXt-Pc_MyzU)UW8s0e6c5F~zAnTUePSqut6z?U-U?_29Y<5Jzyp7nX7JJ~4lC zlcqI-K7jE%+j-4CIY?uD7QsgDX^t^8=}qntAH>?Q*$Rmdi&$B$wv<5MyCygypX~ct zwy^WlX1IfVXa2sHB(iKO?mp%(;^%n&1pP7TQ=4CQPcOglXi_CBYb{96(rGds=-r1z zE5PzhCqvLS3pGu*?nkWcT?t1* z&>9(fPPQ%6SCphPa-(SUQzGG(?4mP1oyfcaSMfUPCi87egTCL4C~h0VX__zr=yOhw zjhRabqAwmTsqQ*z5o5@mMKEf9=v_mkku2_FC^Q_+aeK#+b6q#v+NoG(U3p!UA!WJT z;tY2~1A*~=DNAwNrMF6ITb*O^{wT*3SPJn@oL0yzeP?>E816KNv6*QrR@bPY= zFTFrv8xx8+Jb{rewgf`~*efK8qGl4SZ?rhq7t#uCrsq9qKV$JQEUi^0dhYb=3|mwu z*>M&yvNNCl1`dA0L?MYD93n$klW?};w9Oj2ON$Gdw6hy9KvaIq?RQO-;shRCBHoukn-1+qYOB^PCm+@Djl!_mbk(ggv;DHPsbVHQd1%m`ba3N#- z_(9>L-U8WPoZ)7>r{kufl*1cv4q<+0xPtiXbG)O(1N)eeaLm#+OC*S;6@-MvY+zoF z!jUzuDd`N;yOC>`-k8hx@+{^+4nQ?oO@UMJNZ^Kk=jKFTU2$QMFI{05#I2DFmS`Y` zW?8DTtJ;Ogl=F$5$vHN9B!;jp=2hYFQARR7>z;{>zk3b4RJP^hdhDXSGDYKhTA1OL zZyZplq+2>D4BeWMd#_DlQ1xRu=J)bi2PianA07}$2APnVyM7ut?&5~bnLrZ7a!I2G z$tEi3-y9>+s85rnRp&WhZe(55NE@BqNR*iLzwn}}vXBJ(o0!~6`|Sr*r`#;$4$QGJ#%2kOwN^FOLReza+) zv|b5+AnP5X=@XD?ajZ5(T?o`pd6#x;!Z@^&|5Zu)ECuEz0w^9eeE__wB<+qt99imA zL#Nr5bfh9XtcklqWXwt9J%Z5iT#859u3f9S9OYhmY5Xk!kEB1sLlpk9QB_qvAJx? z=SV4WfyiRc_@)tmy$2DfuJlzy(Ry~4CtyX4)nT4&?9qSNWCYfTNJJKTg2GK`W6cB&6028BM%5ImsZ)t39&_VNK2FHJF%8v0vwkG_*%Ua|`gI$d;q@}p&kyeHdBi6hP2?!;EN=dER|T`TOM-HWRK^UemA!0gsta)J6P zQ6+^neviU}0P5$O9=oCbPF$WtAB2+%%s40k9fFw_ic}x+_>zdIb0k(nuxY}?A3Ua~ zg(^c8v~u$BkDGOU(Om*Yis>w7NET-SYquII;vkP6=l8f97m%1!zPUvU=Bd7n3>E*E|L%^3NzCi z7I=qER?BR&$c^F;eFtX)AL19=_lc+-F*{v#aq*jyeJsU(!u&{B?~*Z)f~e=&idw33;Fll7nN5UxK-^WUPFEC7dXMgV!@-~ybq|KwBv z2XX*^;R3w*H~S&~J(c=>NB%Cw{A2BZRKm*4Ob=)){D(^UE8G2twt$uK7YF>Gsno3Y za^y|}k~hGZ5J07LiK{dOSNZS=ZRNlR0yYatUGUq$x00TH!i>;*)9Cr~7JHWtRHL-$ z=5}ZFFBRy(;osf}H?k%NH?#EU-`Yd$?-*IykT9x(2&Iyd66UR^h7@;)=Y z`aB#uc(*^_N4wbd99Nq8+Bq4_!B^@5{582_4olc z%FPZ9pHNSxWwN;%=yTh?WCHkFxAY+KEW<^pd^JS0ue*ZGMa!=FYcV|)KtZ9Bke;F1VyQ6d)PozU%hyGowmFTElf@FQ7|m< z;SefkB9Au|bJ(}S(qQw&uY()&bb82+pduxLAEu)<9TRpRx5FaEhiQ5N=a8P{lr@dK)59LV1x#y z&cs<=rcDn&UA}OZ?AN{z??$yf!Xny@9m6c80w(4Ey2je?Vuu^T>KmoUY_hEWd<2(2`r-Dnkx<_`yg*b z*ad>99=ph>U)P|JE?j|zU%4>MHvya>+poJK!ko$zN8TOZIALw3 zl$&=_qpRE-FLiEvRP3bF`WZ6XfpVp}W02^Exg;D33357!XHvHd*dDrlc1Sg>R6R50 zL71l(%V5aGT;aOp-;78fgVPXvUp?>HgsOkHaETPwWYl zVKJpu5fjYSD;cCh!vf|q`owM2o}Oe3H5yV%6#n&n* z5=Ahj9p|JaK@ujyRoN>aW(rL$vOHI#R1y;bJXccOe4B}@%6T#%9Bp*Y4=}whzULg3 zLG@a~QB=E~#nD1wFNyeeyzFe&q8$tCChq`QI=dBV8$FTFZgqwJ1&_fsh?TZl&dHo-y2A}1itOT!-M#xYL<#=50Wc? zS~WJGTo(CpN2rB#Y8WD|(JM0!lKMJn?>#K_BNMGB{&ET56f6;z#oF|{2$!5kdLN;> z+xafHjxP`5mG~KWP=|JCBNqP#Ic7cEiOfgJ9$Y)Y+zPIx@Md$ZWc1&poMHyuxe@f&$-oiuI^~`rDWnP6C)5 z3XTZzyB!G{#C$`6)M88L`SK5nowohulNj-tnf4~ff(S#KS9H;)&DI`AXX5H)0mQt6 z852opTN!oIR);x*b1z3$iQ&<`27Jq)Auj3x;Iodl@utSZvt!vt3FldSwS`|-lvS&p z7p4i--^Y}n55ju9*0l&ET;11mug+SOBYeUUptUhdv}-Flu}{mk^wGNUdEN}780ArI zD>dD}Lp@*-R+6lm=`INNDGu)1*OKM9KPodgX}bD`3`b7z32QXdPsmuA2T{?wL)=U$V;Pnp=V3wNa;+k=l2q$ zTnaCT(h6G8roV8)Y^_sT&PY^3tDTQ!#+b?uo~tj<$;^z;tab5;8tS|6?MLp4gMGVP z0+om7^`(wZk&;{1<701gSJ}r#tKIC!#hVro+h+gFB>ymJh^m%fSSnp-lr##mfS+O>kBN~`P81<{#YDHR(^+SdR2?nYf>35M5tL-8Z zwI#o0iZ+~L1tYq42KL<}#RK!(nV>0^q`^pUAy} zSW}MFzweFnw0$M0tCd@0F&S7a3r`(n&I8l)L8yPF@y})bt~8#p*F3s?B&Yi(baRuD zq9w-vEFDC`!f}W8!>oz4G=>s?@;vUr-IM-)$TK)%b~w_0`dQi)Z$m=|CL(&L6ZJ5 z$@m8{{zWa={>*A-W&CSv)-f*>UK4uldNbNmGLfbJBS z50tAw*3%5SF6s3}3f1^{x7u_|*2Rz1?xfl{^jX3u_kA$j%$s-5vq0bF=JtM%00j8m z!bi54fMS~tq@}EFI+0Mj*C^a%QXROg;HyOJSLkyi3|`#_<;l6XSI7ICi@UD%xX3F% zWU-WKtB(7J{+=g<*WLAJI<{xmY?!=m%ud`jyuQMoWtjN@oJ{_l=jx9!mu`vA`uB{y zFHUY=S68Fi%tU-Mm7sGvc0y#;m7*612o+ZlwhY}F_G74#UE|G)%~wgUh;58FdA`Up zxVV(KT~uWPa?L60vqS}WBpF3piIixzPicyA7j=SPU$N?G&fZIGKe)h}gAnOPQTB!W zphIdw6h;Jl^@s8Wy%@XXcn`{Ns-Cww`)!glopWCAY87BrZ z&i24-io5`NhpULs3b8^H!Db#dW`K<+&jw$Q6ECl=DU=%Dn{Lu$AJca#8L!hqj9UjU z@ipcWEmixwVQgu-0+o_B4Z#vAmzvXI-vh^kL?q_IkJF%HxeI7HSU4HhOE!^r^!CsJ z*CFOxV7ihfEZ$LQnDy^94jQlsS@1bOLitsw*p48-TSt#_?SICMm;(*C;zGknVNQRP z*kca+@FafZLEcfZuXkerM0lebjk%ylfrvwhlg!OjcYwJfpF%E3rJdkvk63~Bj*=VX zf_#8RVyauz2-FbAjQraw|$0mSkJk?#(PIZf1B)y?~8?Q`+8GwnuLJ0htg;48Kj2+i5~h-L35@t)1=E#8c0!QWIP-fIBqouaaUh=n}=+}&=7{zyOx&?uSf z7W&{hUqO9tzA~_;qRuYLMxOYO0A(Zdi}oE7dPA#ZqwoPNo>UK(^L&d1I>^#m<2cCR zJ-#`U43lf4sxZPZy{H8dU~*Z>f$kqub!Snb7yUkA6eJlA@lYO<39u+#ay9%ZA8XO^60$tsscRnj4 z3#QBA*DzARnLu~D+<+03ppxu{cUl$9b#Lb6EdVJ5-W$j$45gWVmXp&+=CWWuI9CieyGHyHt6)FQ3CB*KR;VEUG z;cnt{Z{SoR_fTN+vdyNUbM>iIJI1P{ zK!6kEWz?p6O02cjPJDx+p$8RPK0NI*Kx)*&!k=}k(58&@yNSG$r!k0tS^rW0;$=^i zuYC}gXopWXFV$hw>|-qHAZJunFj^`tvrIQjMnzez0}<09m9@A2V78JVPE7TgcO1w#>;q$`TRs!1~7LTs!LDD14a!gVedHSPn@c3h-s z8Ce19eYkMBUIB) zr=g=Ry#u}(Is}VH?*zJ^ts!|vh zHQXQP&diJ)oWIc@E90N&@1JU8R)E6%Z)rDXwT3GIYU9->njavF4~dYd7#FpIuI6w~ zNJg{lr@2%UHjhtuu_9q2Q?b^ZEiS-%OQ@3eW9eL^;#+tDZv>prfH`QNmzD?99&fyJ zvFTD9N@@WK5aS|j4FAC|SJMb-@>x08wh9HUZ|o=Cx-Wb_YhEjW9G`Q!Zl?ww->wHwk^Z&hv*-G!AAE)m z{g}(l)cHv`3(6!$6p-QH`H?QZVkaZ;u_L>=27Bk5jHA6EOagTA&THS6hg!4ZIXc5-yl_RV(e)b|FCB2_oW1XcBFec?W--b@L3%_vuia{Zj;Dw(?{CqPf=myOl zcvY7kp+QLV38JbCGVHp`$=51=nvd-BTC-oc9OLZEljj{7<~KGc2XscW)UVlSW?z7n zF9G)2!RW+dSYiYqsZhc!6pB-uf{$FJ<~X*=!bUN%&|--J^TOHMP)rLHV3CwF!nH4=)T8my{lek6dc9Be1v*Rzi5OX z&RBmlLv674V*%%KgaWhv@D2=(WFI;_7%V&@3E1p@1ijRI?v}A0tvX6MS$9XUXDFsz ze^+MnW#)^Hd5_Yu)s+sv?&hrWo@%%o-myKejrI!m5S5rxCpt-)o3WTqK>%DSm$JNc zjG0P2zn`F60D94uPohdF%+)ID=1Loocwh!GQI}d-aP0&hdR<(&I{LWib(HkpF_iuAG0H>wI8~J z>ZoJXi|pQnwc|XdsKLBLhNj4=#XMNDWLl0tt8f7QCFvI!L!AS~>TaxrrlI;O6h`w_ z3Asv}YS^=i$H=Y+HlrTuRE(FD!5=zRrMi@ZnF;`iQv zHm{}5)s}Vl&4dxD4XTWg+|tEt;jV6dW7uf3!X{{M_Q!k|ufrjtE{m?J59yLm0 zmcRpai?z5&sBB`t)x$(Q5^(UO7g%==#6_Icd>+ZC-OWcxT8N|Ru_6~53Le~RoQQ2Y z|E3$tV_H9|U@5WOQ$)94RKBiTk~rhN2`Vl5_=-x9DRX<4e}8Wj%OP*iByRsSlN+bZ zGraV8I^d|NT}=_!{!~N7m`482>SB=W2LAWS(c`OQiEq2-?vm>lFjyluPHey z9&n3h>r1@U6H7e^ji7>#kfZons0zp!UcQ_pIT-?H{B;SZHEMfQmob4B5gtm6x9>;uwG9b{NOR^L zo*L%QmXo%>y_R_tshN-Os*lWR%&j;I*>)odJdFf`bl6~zN{$nSpu-x=f}2~idDuk-e?M`Rc4Wm7mqN$VN%*udyh3SHd_g_YrkJ1 zMK>;KkA37Qc!PM^)pq+=*x=7W;r~_G;OAfdf58U7o3VgAlz&D=voij*8TmJ7q5#KB z%uKBG9DtNLCPG%g2peE%jhUI1o(V9h^>>88tbiWxzZARz?12A)U;bv7_SfR9KYeKb zQV_tKmW}<_d;gi5{?$nn)89O4+SUFu41w11XC`rJ5>PW279m6rpjiuV|LHz*K{8T(EB$MvtwY%i9TO!(~^BBAmO&jPea8 z=X-87q^aG)?L1jK{~ElyT+0|hfX`3%7^BF6&BE)2#sB;*IUUo`voFxU)bvXsjpI4E z+bHRWd>;->w6l*T3k=@^TKX35SZ7HDd{MQ$eQ07~49xZDJv<#Cc1(3Kes^kMcmx&y(s@JQB< zt&qQHQb`Z4NE&Z@DoTs-To$fur4uJ!XfMD8Y{Kd@sC{xUqty@a5#<>XN;Fo-X#*k6 zcf6nA#1zuCS-jSYH}2xA3=u&v0#GgPANwz;n7^@kp>lqlV2jH}yT=48`&t~ga^`|$ z8 z(XA#_ijP#7pNa+jGGXNN?^WuX`VBDbA)oV#DMG(94aFpwRl#{1L(A}wI!YMgkuESoyHHdFg6QfZdq}8oQ%3(FtYV=hCcqwvAJ_hMq$9#q&e!^X!?fRmxDi*@(K+Td} zX7pGgM+L85&hW9>3xZ15q0?w*-Uvi~+(>$8rcW4XRiy-OmdrGNn6*zC966U&ur;CA z-ZhE!tO}lf77vjUF&0)ex#z@La-Dq?a-ky_AF1X^b8Ok@QkyHMUyCC#b6mc0iEbNh z3tw`8E&@aSAw(u*4eK!4@@kp)Ilz3>`Y%H!GB;as-b#Z8qoW=54yl!hfpdDQ4c z7>+K(SKT-_**edz7TK03AqDKH@K~OmeA4(XsH*jBNB~5@ocD2QJnf?y95K{3rt-1Q z3IF@e?3zc?B4q<|CVIKUj8NF%oP5dggF0qK_e!F;{1w6of)vLIj&mVvL2O)dZiOZL znp(&0!4s8~DuU~iZd%j*rAR;J3vfEL0`~keltmeb?{4T7vzfph&b`|Gdo#t0<>T!L zj!{-@#jneYjfF*@mXsq*k?j)jRh@RiJZB9{igzM<8g~%+*cqG;@ zCmC0ciFNr&x6NJfBs15AK_kWd9xhm8h*->}MHXOCOWx0-(ru;z@gfsPq)~TDtI&N{ zvFqitSG}3YH!_D6K3otz%q>Cp|4{ALOM0IzIOC}0B@LJqn|Tn^NdRJLZ7{b^l+$ov zQ|I z-GpBrl*!d%jAOBBJ6}|u!8_RDdG>OZUM})7=5IYyzh_tsO3B%bE7}~NDp#QOVZ&v0 zqKBGOVVsA!7lqxXM?sad7zI}GM@I!8#-qL_M2T8?AWjg+<_{J3nV|SQB)v6KuA1~l zn)L%ua3d-pUK7!e_@3*GBDZ(#GdEKDC4DC9s-#b$EzZMz>ho+ultWQt$95W@YZT{d zDRdMx6Q$vJ=`__bE%|yZ3`j>tEXdo@2I@fll#k@9+anSmc2I|rn1d79QCT~zh0aSd zpw7h&+wW>X_N~<@a9pU{ahy%JXb5fUyS_2UTb}P3iU-|^EItV{(R>#{dVk1i%plzz zN;Tm;T5SlfekeYcgdd^w{(O zYPKXuA;5H${Cy$aAjMP*x%xMHOqVO)+@KM5yPN3%+H9_G$Y3zFg^GvqX0Fa(DNA~% z14ek7wCLKldgiwR@!GJRfpmTlPFbd6%rA4Ts}FLNr0}Ky%j-Dw3I?8!D<;+l=2w$^ zuUC*Z8>GAf7Hg<=wqxQ1sRB9oGOeS_udK06vFL^(vdS7ri*g>|iX26lZk~Jv0rV>kcoRNN3 zj6coi{v8d`T*$uWE~$2YyuP7jNrnbd5tI_zve&#Fm!$;-#_>9|a-CU&M5(gD52O&fp++Z7auJ8__2cpzx&LFe!P2Z7x{a$@MqB z4(&4^L}V5WVSmfpO*9T9W|gbebMJgYcpG#;bHuN9RP6_%CQ1us~AuHqW zmf`;*p&{$9%Kz_fAS=^P==Fc2*k8cwS2vJ}^`B0EtW1BR@V_NAWM$_3nXkYOFg*ZF z{IPNZ+z!|Y*_qhrng3?C!hh$xzzUc{`?sd*ey{yUC2WAHI)J<3f2NW@@ABW;6DGiX zAHZmV>sRarGb2EW2>{VtfIVXQ+q?4LIWMp>{hR8`KbQYq&rhR_|5P#mCgu6Z#;^lI zNjM0ZIDhWX&y8UNOdSHkO8ySvVfpW5sjSSupVz-hc>c2dAN4Q;zR3Xb?SH12f0KQ& zu&~kts23Y6BY+D6h#=E1_Y#102ou}i+Lr&G2LhhWfA1;!x%Mv}_`4V`fNjVx63F%+ zspsGPePQ7M1h)Y03Nv6YxCmJRj1-Vj&c+OoH8cIaodNs~{cDEI{MWPmzrojktL%0c6isn&3ylsV~4M zqpct(L>E+PoWY#m_F_8;I>JW9>s#1vmw1@SV_VXUE=wyjtu);3@9+ZOG#L_q<^+2B zJHerwCTpG8UGkWBn|2s+#qmEEqASQ8>`qVVO%0#h%Up|YG+s>d;rP5YJU{*Dr_xc* z3=d-2*nlh3dwtkGEJV=1@a-mRe|Fx&DgDa!>g+-AT5b@aqR(QhU^j^7Xe)kkN8zjh0fKe-ESH}7QJoKR>+1l+(5oxU7`{a)Amz=$ zB>7=^0lNy$eIQ=%cUZ4Z_pkB3*V^~GX8~@FUK$@>?LB;mLLN*uE1k2;RuC$V^>@jh=d?&rBeBRIhV_>X+>xW#PBUKFixL- zUJ_#zgVj-ZBVTe+sB7hYLg4s*E~^{cBBV zAi;&)`(5SS^X-#Aek-7`RY$_KXk3k97!oqYI#ar!A1>8L2m%t8v8ThnOihs1(&+#oe%KnKAYl&4{kRm zS|T3dRLK{or_wsZu5As61k1el%}UIJrsQ{?1$#$O@fX4=NV>YDr{yYa z`$j9xcJ=~w+EcYrY1GXGn(UJxPcqiB2P8b(0$-8IXWvLJ60uc3tgz){x2IXfuX+cCT{sTrX{#OC#OY(m57XnJGp1JWM(N zIjQ>iHCFucI8(W;%!sGTM|uSLE!Zq_kcd3xHq(^bjF#{uTg==cBr?SWx*MB=tLB^b zS3=Eh-r=6Fh*C6%u~Z{*WZKDeOr$$wq}qg^C;GBMrcTl z05kR|FhyIQ$_=G@0SE2J^Nhj+q-G0pa(k38*DZ5ydf}qiJknTVbV=oHVf)P3@K)9g z{5TsjX}K%t!?|Qi7wGQ!3y(tXr5!eQTL+{^I`>mr7DYGNPaaA0t%DM74(uE`vT-06A_O#K@|oqm|0p?tiWto%?0nxRVx6rwo(vO06frB|A&`NJ$z-dL zsujuULtu7jEwC$Et5mhZsEwN^w(N)>meB;7JhIbX3~mzr8sRdnRYpJ3Gke%wN4tA%e7`MPtz;(KhGh4B%O&M9wj?GlgcmeQoB?&#HtwPurd9 zAQ9b<@QcxymT5f{er^Jpk*yaRarH2*Uq&z38wz$*Ici_$-NliWsmojBcrQP9bl2g7 zztEbeAZu1<%=^_?Ij?yvY|h`sHHCGyQi)|O^j&)aMxrs^=|xwRI%KEHIJcX+6GetB z56O^gZi)c2cVTj8WpnlMY=(&af#$_Gn}z`H2IG+(x~Q+qP-8L861e5^x9U@xryl>78Uwc}LnX@l6<(Ax_n(JeUIqdRRps${@eU?I2we za=SL{FSnf{VHmY`4GXfffH zeL=lNHoQ-E%>!|QhYmhAdk(Z?mQT(Ov zic7Pi@HPbd+=y>$`Ft-fq}S?siDiHc!-Ic4O$^5f1FM9WFZlM0lS;$-5O*w8QM62=$TC*A(+`oB+6<0@wvWs~ z$+r>VsOT##fu4BE)aXaHK zd#6{}=hl(qSnC4bX)V4_@`9GX!)>K$CSD#!vnPsiyw;)B=(vOE>ik|x3CEXL{8py- zlN=zuNNES6Njwu30R5c_Aw(cuA`sD z1eo9lk36?A(iKz=ukC&v{UVx3vF(uOR&JuS%K3EYW_z0PSRqE};_rk;Y>+a+Q>+=E zl7uNTz@&sThlTH%FAI2GKY*<-Yn=8FQ%#QAl1BgdT=&?yKEbqJTQ9^jWx+x1+`~tq zq4_e@4BPqTo|JdY*f%3-QHmpVK^7`kUj?;7%;z4hX2%j>BsRHusSQ#wY8u>5(n}Jm zn!z_PytnZ&`0~Ziwb{J5g zAVssQ?;ISN1>rx-%cbKo{|e0(t)aA^p2Dxss3uaTi$Oh}E$t^Z7o&Xk?%&8-bGSO( z{c#uiVEP4fRdNagVI2z2*llK7PUD^gDh^M5Cuk=M^t6O zVopU-XBe+Jx|f#a!|8nw8Q~iw9`@{+3!`_lehk|t7okKb2zq)xt)g~ zulr0T`>*lv@eWW01@ZclqbPp!D)+)g6uAYh0rEi}3y~I0<44TkjU1E=j)QKLWWK}% zgV#|2gQzdI;0aJrKMnn+{a~nhuGPTt??1xuf9mA6@w9yUg83ZFoj}tRBz-Y5tM0a~ za{{?TFAfbdpWO1`jit0yQ-P$q;v^N+f5E7+wPx~5W3w0sWKMbBAFYNsbsAz&7N>xc z<4ClV2V|4{Y1q#d>ZiuWvjH2<7CbUcp&?I;Q)b~i`Byv|1xQXQ2|dZ+UThIWOg%@Z z4dZ$-tMj$YS`Imj3Tp+C{Eq*_+&f3-y>@G(jcwbujmBzhHFnb2Y0$W_ZL_g$n~mAn zYIL48z1KNk-*MhCzWrC8jAV>^K0i!c^P2O*l9!HP(&yZUW45dTw>fl0Ps$o+#b)4J_6ENboKK?P{oO|a$wH5qyL1PTZ4oTt7l5oX zJUAm*cp4aLiL9`^pyje8eb={pw`-l2POKquqyembbWrkQ<8!KZr#c4%$j@G|Dp~=` zGZGRQX_+#P6hbM}}YYI`*S% z?p=hT5?jH(V>p!Og?vo-&Qp94oJQ47u8f&Cm`44GzVpmSec8c~R!N-GXTk4&ud;`DO@oxG}=n3>8BhY;>EoPr8D#W|VJfu*z_GP_L1fT8jKbX2Ww~k0va-O(bgT z5D1Yn-x6|Y0;qO>(LMy6+K!t#wWX7d@!_sa24KTR$OulVNTu9WsW}W)1I2LI6SVF! zvf3HnLwPmmefosnoK^dq$`lV9X?^6x&#g7zE&V0Aj==|~KoLTvZD1>OcAl)pnJ`9? zW_iiODu(nR(l!Ehgh=nzkaFV7@gwiKB%Ma_N&BMxlwBAip`UUS-+UaHXlXDyuPyea z)qMvS&`j}V88f*hspi9#1yc`oVa0;6S{>6ZCI7oZ*v5&SdW1{1&MGBMmJ%|)(2j6C z96rOZi#C>LWu)!ry0q+TW_3tiTi>7OnIrMo=@zFkVXIhankkh0hOUaTt<6nV44a7x z(1V&iwD8&;HSV1J3)ccG6H8z+*4v&_!u<{CME6m~U`?FVTlw1?$u8rAFPS#gKM2Y~ zD|b9Fo1#7tzSHd679!J>J&c5&30&eZDkQjs$2Wlh&u6D2h?4iFj4E1h1U==wkJ9^w6|1b(%pg#H(;6e6qua6Ee_2II@rm-{#HR3*b*^RA3sOM zEQjjGeIAN(M^~FZkK}&)u*WQM0U^6@!`O7ka*uC|8f&Telqu&vPj)uVZFacp$um3Q zn89mnINq|Q7~v#UJHUuG-}!lfDhUBjib-q?3(j8WXB+Dnt9U# z-F#;}q=ItN4+nObdC?k^te&%pU#QU0G{^GAebVrORj@lAewW@Y)6GyLMQviv3!K{t9B3^SS>4U^Fb-;5 z$r;J4K8SRK5mw*F?b9yRFi~6zvV%%hQW+$EcOVJnc=^Fc0m>~tGTK~5+bMmp*DI|% zuH^|feqs1GYfD;LXo_J%ax;@leF|FMRQKJ#RJJ2V^=cw0Ya?>m0o`AjFEE;KQ znXcPsAdFl{CxZ?ctw2zl-+LxPVYrH!O~8_u&xA)0jLbG(kXZ0ld|B2~C<(D(Ff|kvo=O z^(A7WTUrYa&v`QZpu2+mEp}Er8Rc{El6Ig6kYYq>bb=tCXKQBrnRKlG;-Q+*Qk=rs*D-&DOT1E?w}&;EUp5`emfn z!_;aH4#^@OwoRwh8)r`)={NJs&0^ZnDrKw?j4-c!W^0CRz^;M#Y#Yxh+|AH|F0YtI z)FUuPAOQ?3fNmO#u4yv+Ojg_cm~c8f*Xjliyg?cS2~$@hC>2VRsguNf?C z55n%4TWl&1Nad~tk`7UOuTP)Qx z9%SXVm&o0{14=ma*Q>~?hEJW{+2IJ*bO0iyoj)GgueSFTZF+b_zI@?F*YyUWJvF*h zJG!Mv8a2rVeY{aH>!{k|VG5=#e&V+6o8+!2fv37F86*??U|brZaQr|~nJxW9G$&iP z5)rW`k4LjkA!V7YfQiAi*0c{dqGSEEC|_|!L#4(m(D9fM;dc1Vu_wuE?S-D|^E5NW zTh0M8G>l7e2y}#@UG*><(bR9 zMn&*E2y)xn&9QkXXteg56bDJMO0r2^7BkU$x|{(uaXM4gqs(!pWaKh?JBA0P$qC>= za|OAWlQA5M%d*pN^HNWZOQcQMR(w;2RE4-TJItAPdKw$v2tB3E+mIdM1`mV?1GL4+ zDnOFA&qp;crrZ{o4>r!_$Wdyc4e_4Ms-5Ma6n&5D4B=oD5SDGxl(vc$@D?ATT0o_JDD{bvwP7w65uP}k}LKf@5rWaP(K^l=g1^T zdRm}(lk8H1u}+3r#f!a~;0sjK=3gP+`Q^aKA14g2so#9P{!;L*MlM`Pi(T=fQaU}? ztEMptT+7_~^k#lD(%WdK9Pt}Gy4#X7IN-0VC%`+9bNYbrW`U|rwI*W>8 zVzW}`6nBnj@s`zL`w$-j1-I_AZ?7Qxo)gOdkWjJwYMB0SN~nJ3N&hXO`qy9(6BFC7 zgz7J(=STPXUy#L5z~lei!22;o4Hyh+e^mR1AVL0wzc|B!_d|^NNsb55(cMWBZiAQ2%~+`Cis+ zpoBR>@dW=o<{oNfw&qPay^Jz*g><@Zt`QB9`LC3n+ z(+>X2oQ`5o2T%R^{CPyCGl6qZ;i^ky76cEkSN{XV+d_q-&4ZEi3qHfGPRy??;L~-0 z=^(n)Q*f8mkV!}<4zq)fCbhng_qa2s9#e@9cQ;dYcMc;&^~k4zay>H$EkP6<9azfr zd7r+E>5Wm)C*c-qCA;o?D!<>jX7gj4Pw~UF&7?t#dpzU^hE@@1~cN#mc9t5RowS;14YGjY_Yl92Y-uCw5%(_d{!B z&~A)`IOBi8qXj;@Qn75r;=~qOiZ?j}vuPDen&KZ6H8s|AHWn>7AFN}ZQ&2tHSdxxo*e!zm# zbk=nG8j;3;8Ga@gY)s9Od+w#egK#F>Y6-PAFZNmAjBSl1=q~0a>6^1qQ9@PZf?K0Y zQe_Ym#fJczET4Kq%sdt<-9XsDO2`@N(>Ey%#b=-lZdRSW?VG23yM%qg#7A}_(N-+( zv86j_TC<jAbD^QM=u(D5q^wH;vH>XgF zp{93b6-u3LW9HnLS?R+ftK^Vu@^s&Y=SuIIWO&sqWksPVYt#bUGWC3anH;8$Oh#LY zMJsbdI`Fe|v>wx&Ssa065+B=ZqRI)1l#qJP3Q=_r~_@|p>EUpoZi|j{M}|Ehgc0gMh^s9TOXjnA}14ike^^<78ncZAA^{e;(BMU1j|tqDH&7Lx=c8X(+|uY8Qj z-G{`3%bp+)sDtbd7~-vocLGq=RqKNMK=uM1tH2e~rZ#9RO<>DRikJ~X2`ZrFjG9br zDW4G}gT8s~)>eEOZ(m{qo=b3jUKw3tou_gJ>R2U=tCBXI@Xsqq@;|wtJ9)p=B5jiX zma$RH-wn-=t;mKbu5nd83MrIb2C|(`XcEzwtq;TtZoj71Y1(w~VC`ixAFWTjM?rgK z61SQ-88c`#bPmV&!m0rzSMXRLaO`CJ4x6B+^yyC8Zd2nnm z27*jV@DN*NS#)$~IQrg@qjqQ1NC{&pw|z5h^^lEku5XjPibQTbEhheH6F!63)IkK# z(ZV)`23HQMub8m(jYk?Lk&*H^m&L)yljiKbqwiO^-_f#)J7IsS$ca z%eE-u0L@k$4igyPL}|Jr#(+?Th^ZA2t!h3n&BxtM>}C6cW2y(ts&d~0pB&6IkYUZM z&f#};aT=($aoNR-*~stEROhrRpzzqSsd(63)1g^H74kzevzFly?G6Z;=|@|QE|E6e zDJx{kqma4KYfGhG?3PK+4{%JcRH0LqxL-d<)e5w~b(~Z~^r|DG2g+~E<&2REvu!k zd9nex7aJhx-+VauKyhY^0Wnu07)bFoW2 zg!iV2_AfNZ&JnWgds9EjJ;Eq(`~s3Qg!oS|6w5C%)&Huj>5t~m-y1zFe-WGje8gYl z)GWVXw7+FdKO15H=d5W?Wh?@P3ATNo>IoRRMmXJax4^ z9X0u&yV4AabsI_d5@S}))cx}2jsfWz9BCmqLexaW0(l172+IqJzl^Zj!d~UZ@{uug z?EyK&oyOiJW~aoc!4G1wgMC|fi^o?g1MHB-*9p5(y#7EFxYBcwg8V?h5D0)xpxgYxhC4+bPsiUxO!*?6M7Jmh(%7*b+!#-Xa0IEQG&G38=~oqSkbu$ivv zF(<+~qvuMc@HbI?v1A>YEs(ZgF)FqhedSUTpcg^g5(u`q*i+Y3K!3g6>zhI0-@fic zsZLGL(w*s26`Pa8D_8aTrvl^`$M=8LtMo^A_`keLe|1OMIDXN#S%1|}zeQ1IW(RN= znE@PSPI?Z2ZY%2#mgNspFeiXz$^2WyO6EV?x&K3hgq8KL3h6hQxPKo0mo02eT=anE z_kYNiUmo(8hXD*(0-Dpm;bBz&@GuifJ7DaVJjs&8*;45*gmzj*z4~<&h_+c0wwpJ0 zTQa6GGTCNws}}570|J>R3^oct-uO|kO@fCrO^-|ZG1-@&>W5XjAz03-i6NFjUuvMs z3v|;}s1E1u%xV@VYq#?!ckezN8s6m^Cc_CrvjPVK?T(y<=!S&18Jx4F)9QxryC$X3jWJiW!&j=S2%CjAuwIT zQ+vd!AZ0XdDG=Tg1(dby#(J%ZKYD$n?Ks~MLB%{VXLb1o%rXTR;o$eH+4(%dYvE0^%eDNck*QapXRPV(G1GKr!J(L#0RATdfEJ~(ga50TF$)?g~Cb10dNVgh8*(a2lN(50& z32Pc#_O8)1&akBf6J`*Ck zn9ym(F$_PXMGqR59HQ!;@Vy>7(>D6$w7xgyqx#x_pBe^hl9mJ2S|hF9sl(=KSTe!K z3=T4oFc9h+c;W(yg`6L*XU_31jd%l;r zyaSr*C?syg+5xRF-e(2V<*8AUEFjXi(R;8lVR#pYS3SCL=Nn2*OF>^gF=x`N{noBW z`2#m|g?xbbm8x=b;2Nb}=~8nv>d_Cj%s;r&zkK~~y3)T6|78seU`x9`RCA&dqL=BEL>9kn|K9;|()&HuG_eJOSPQ1K9<#K$~Z zBf(6XJnw$H+g-bRKD{WS8uz$Sg_L*~ByH3bOyrK|hPci5}Qd7zdQ_*x#KS zZb95PES4c5mW;se*tO1xxVh6AgKB;LEeN_BU-JsX^mFTdSV95uRJ_Aod~+i3*lPaL!z} zW*`Drik$4kRi1VID34=m|IN@N20nZ^K`U4`%i z=C*|#aF9L1(8bqpB(L6-VDv5i72oV}ZsP6Hv6{95i`_O@x}{A3l%RXtnf22C1;DaQ zG>fJ~UO1cvIiGP$!H>y{o%7cSOEd3Vk8MSlLTR{K9OiaFnt0`%dWtaG=^?)!X=f&hsXFED^&IMPLADkptx_tVkMpw=?+eql<@MPnU6HA-3R^{Vf6k#>f7e zZ~9*pfd0tZ{|o!^r^EWMt%QFuH@TR8Q8NIWKmPhczvX1v7?}Z*eLu#MSO7Ua;1o92 z9}`>v$p>b7E*3^WZ2FzKI;KC?aQs6E0*rJ1TlO#kM%e(T1IEYzwlD!g00%&Lf}Qa{ zW6Qr8oc}uh4`Y}CmH{*!|6|7d^_2c*Y-VL;rUw8X%m9_cAA;b3zznFkSQwe;xwwA& zF8v{F{ZDu4*K6=wPt6~9iTTI4E?^Q9pv?hz7MTI^ApZ$l0F!zD))T|b4#=1YnYaKY zC}6w}a7~y1SBRAmkWA471`z=d_U}Bvtn5Ge!T)e+evZ=qNb`R4KK*(8-|S%n*vI~# zv*+I|k6D;G=mBph6C>cgVrKlYCkP;n$wmlxW9c~oE1iFD43gfUEyo1^bU3K|75|Z3}AOAOiQ=--v-E*I}MpAA@^hjt&J5 zKr{e7Zmn}PWJ!q0QyIIx?U^YWqLs|^yCBx3H3|tI@D>QZ7r@xL9r(cD?Tz%1ve;_u z?l99w5Eq`g8?!AFaG$vbP{*`dufK>{dP(Vbd{656nV_fU;;zHW+x6kAbZY@fB95uw zXT83cU6&5Ghl732d$}L~`_PT?VeIVwc_i{;oxWb4n|_Z6Roiat>5k++vgUb_5K~`h zn#FK<*R@I}iYCwidgcVejQ;SB+rWM*s2qKDEa!3QV)?tOYQw2;@jS-il_zuJc2k`vR%Q$D-Jx*o1* zii5)aJ;u3S*8MhW(sbzJjH~dkt!|{fkfP zLmvY4b)}LRb8(}0+4YeG)&X#(Aa%3v4&+?JrKfX-RuwiC_4Juje8Up{C5}yxHvXE1 z6}8v?O-kHztl}6urBl34{)9%jdD}1(U2J@JOg>eP$ptyn)p=Oq#;3j7b=t@%(kGmZ zN+h{hwT;8L0*TmN$DWe)P|x(8tcTj+2Ac>+Ywc|hclX9ig#_zSMJz8Sr(Pz0aJ+qiVPT zG~P6r>0ym!yHTt~9L$T8dn~s)ploy=sl%6>xW`nYnOls3gg?JT$$DHlO2I z&ZwE!@#2}b)Q?-$;;iP^Wd9QESr`s7PP{u(G|FPSW-+@ogkdvuTW~{I3j`r}^06$s?mc;>e8Y~y6>Tz}I}Db| zsN!0uP!LbXG~@|ZryOD?jwXIMo@vkD?l@Y#!bEDFqJaNS0eq}TWcN6u8(q)j4VOdC4#Mxy&JBaulSDJuQzwvR#AhLFpw z8~dH7DA@4%Bb?6fYIFU9NRRT|oK+;C&W*ATn!q+%uIQu7*5w+dJU$()&}w%XO`?KI zP_H73jrE^{IwEWtW>Tq?SZb`|0qNAZX=C^jMe#>p=3uiCh$}?7#BWw6>61Tzw&e{Zu zDL)I3o_t1aH8J579oY3LbQ(QsUd-qfWzh$?bjq+j4Ma7FZYkj)@^O%;8`@+4*^f2D z4RZPhoh_~lXk3LQqIY?f=?c`6I%H~2*|%80Qt#f?T(m~Zgq7~jBxAFKms1$3(^gC8 z5H6tS!8JrxqnjwZ5d;b)$}!|J7liURjBhgm362H<;}o+8QFO$W!9+O%T9mgc!p0_0 zbseIP*AaE_{r&2XfDr&So%n`s85TjVA+1>;-Cds-!`lh z9?vD$7EwZ>Oq8uI%Qyk1V;IGk`S#_`=Zj61V8VK-+me?Oyy=3)7!t|oN7DX+l}2tN zV{{a2Lfqcet}TUD!c_2m4hBNelcm-MiM27uFta3<`YZ7615$aYKC6hu@ZdLP*N;UW9Y^~f4mJbDV-LbzG#JR!QS8!>18#abPObQfFZtB=yas6T3MBVi_qJJw zr3%WwMkWS-m5n)Ym4x5?!gFiq*(>5U7WSF_puc3_F^j0=gli`GG0M7KtHIgq8!X(R z#*v3%OPChv^d$(L=VzEr;m6^K_J!#zUvvm>o1@y^BRuBZeWmbd=YivseS0fMdy9!I8}nG>jRVO%OM4JZljKw7W%1G zS>dbsvIvdp>X2|a`wHBJvL!625o>TH0!&v*uAgv&GC>1p=3=7I#liUsYGFOWDNmE$ zvftG}KCam92EmLrjStZ4W?J_r+M*8+J_qktbmSKMX$?Ek2SvA)fYbxY-g#p)G%vyP z6s#7{i|>cq!p)l$FBkUgrYHv2&stL06(wUe`K^(-j9r|H;16L_u6HvFHf|IVN>cLh zWy>7AF&=ubxsm3+vsnB5`D3$X_|9p|nfj@oI#G~VyKTjH7L)5Doye;KogJ2`_pV*j z$u+3oGc>!3AgSn39uPo-4=VcY%yCh8#Z-l53bxI{;ajASk}ljJ5;29u><>UkQrUYU znMYI9=k^_HzcZq44n)j_7zi4uQl@6lUjRsK8rK5X8C|pEb$U0)zLSDpuFdryZWctE zZ$ggS+eM$3$?`BU4@~qbFy0&4G(Z+$*mu^5t2Z}|)*x2Ycf0Yd@vCq<9&G{_WzMjG zD+WMGT!tYnLA9c<(z{S5!Z}sk?E;i(MI{DzVA(KqZ0I(o9%ZO7hEkVSxz2BRw+~E* zuj$Wru6@yS&3lg%cG@o}I4#}G?7aNl`4^^M{3y-Mu;M!I`*rw8%QR=&qr+A)IF6Nb>mE2Tpi%5Gi1 z@)62NJ9fKRJdL%wJ&f$2E!$V+aiQCwy~{GZmau>8>H{Eu0~@o&QQ zEP%@c;At?kGt)ByfQla*VL6z8)Zfe;07MD!*!@l&{{LQRa{QaHz~9dQ%Ob#S;{0Pr z?SICizdBq$kb%E?2!Q=dzg26_X^&LkG$E}X(R_yp+-&)|b*BwFYLyhc8gtabkMuLA zVD->hP^Cd^8F5R#CC&wGe~gw@wYt;c&{lB3qqjHmOXS?pZUaN2_j?gf@`N$wwzAcp z%($D(gQ?+U`xk;X$gw<)cG?q?nkSZ4C9ml7F>hAG=k?dBr`^lS&)x-ii7=*qFs6W7 zQ_j2b>9W-Oq4FhKcl(oPlUMuGDbdMR!i4w8^+34I=<+ULN-Y1_508aW2TCJyBb6ij z0=jDg9^ah{p!4}ky%Fo@{b?$eZgUYc&NsMuB~0?In22K1a%Wr9cK6605{&7luY7#Z zwadbfja@YbqVn4_?gvpyW zF&R!9zA{!ZJ}n35y;>SrUXczld+{^yMi>o5s%StKJP*<~X0<3hKVfVp)5(~`j+YF+ z^$$ z*E?&e4|;ze7o^oI+x!XmlD1OZf~FR=uPUfYaF+SQ(4TZC+){CEyW~qTf%WjeVdl~_+a$X} z#taY{Xy3_7PavaZvnF+!NOS>!JK>!v}Mo}Z=>B}V80MG z2?5j8Em@3IK)hUzdgPf90!yS=mp*g_#) zPH*o671$tA6~BRI{$@?7exdvNR?{ZpAPWZiiiPvbAXu#VvLYp79ZK2@T_nr|K{C!A z=|Fa@{L!${B4O2@%_WJ047m11;h^@)^eqx^nt{}u(!hiE_sY(4MJ7oh@YL9Es#dBs z^JVCTaaajz&>s+^8c)P9d(JQwQLbb^oxm6PIx^6O1^Os->(76LrD_pC-H0q83Pcz% z-k^O8c_JnCqO>h++k<<@@S(4J&VBy-=^f&V@t5>TODdXdE-A>^#jH@t`$ZFeW?uZZ z_o2k&3KA!DJm-X^OcC4$)!*j@%3GH~X>qig5+ey0;Zl%0896XgSa7D^j!q9{i->6@ zbVlSM(n%AmI%kM%rj_I2^|m59_DzU0utSxNRVXM&$h4{u!?N)0Dbz6fE%~S`eLLTp z@*GMFok!^0tM+=M<&X+#`fUeNO;ztDS}zye+f-@9HSdjz;McBXSdi?~?jgj8H!dvR z^@AyD3Gvr7cc#uBe%r|%+0B%asYWUges6g(YO?verK{v>2;VpWlo8%h)`c6^6O~lN z%M0>ZEeCCm4LiX*K&0LcnbtDL@RP=p)QDp0*>CTMT?mdhzjs6Ap0CKc84jI^4po20 z;AC$RY;9?y(y?ZV6M^aa{M{BE5j14j@U2M8X+~MNjj0JmIUl+g#{M*q{3CtFTwrC0 zOQaE2vD2DZ^6K3l=O$4^ z88ySA)7x;8)95g-ZxUdBdqOY|r=*Ykwg`CC`T+wMQoiD-plL^hZ#reLfa;F*jyOmg z4VI{du&cm|^J4_vu&HF`3_SO=0*AmxQe2R+I>LHuSt_iPY{_t`=|;jOt*K0z<)&8&N~crA zrIH#5WN9qP5-a^6bkZT*9%PqeG?AchhxZkaG&|fLlJk|)NEisyO3PUWbB`j2RUQJD zI9<6J!yfnw_fczK`Pfc{%x@(|qP5DSKn(O zN{xl_WvqBVa7mxYDyjkgG2syR5g~e`+La+l;J3neXtEfGnzu($-ESBZn#yS$WU0p} zl`$7eAZt7^-x}Ucb+(bddR9JU@9--cxtGfH=1d;GK{Xx-oCtC@?tjwaD41u9D+=9* z&2EuR@*bwb!;V+8<{IC%g_Ygs_1RPOwO*eIrdE=Kz4b*g)od6@*2GvS#EPb08NAEd z2w>5*B9=Ui3@_To18@I~8B{#T!L+_;yKBfJfzm<<`FNul9VC8^LTQ4c3?s3D2gdOR zqCZMeF|^cQFEz7rQ075F$gJ}nh5$P|H zRlqFt3FX;UaMkdXo~f`g=U%Gas{FBv>?Vq4zEa>jLn5h3w+2?T9~Y$%gdjI$`Fe)8&nqO2&L*uy${#(ZyaV29$|ZVj?fFpxg&D@u zkUY{n3r!uTUP=W)N%(ZijUN36mb~>jii`mc(ex{me75xpuozP2v*W-(G5mW?qQeHr9Lb<+SAmQVZ$uVLUYpO>v zQ46;5gNs>z{H9fS;aBK7yN2;!bqjP_{bT$4s+UeCC1cDj~jY7GETwO~6%i8d!6hWi3iO z6y*$Sp%{C^AU_lZGBi>+;M*h2Q;0ioJRe8{A8oX*%0no)C^%dDNN zvS*u$VA(LAsmzJd9t%atwA7x=G2BtI<9FU2!#O2mHO`y^%A%YwC5p&lYg$}h8;OlB z3JYzAEgUVS>gDjl3Ea9UnV>c))>j4ZRPXR&>odF2i?{yGdpb2*B#s$w#cu7boN^I2 z)X6KV4eKq$1~$Vl=}nLFKwp}s-Z~?Not*XFMIxX!>1knF7SZk5G9@_a4cQMa(xw|$ zJSTjkO}^cbhMlL##W^WfvwvWI=?(#09xhxL;!No?Ty=yR0D`yWbSKWWw zi5Pc1satFe8~u8&{F9q3*VGs@QYE%hEbp%HMHTSs5#x2;Yi8hOnFHt|{AuwdQ#Y!= zx#%3V)IyRZ`xy=$w`9VW<-(0HYPp)Oz4po+DigfgJ11kX{;S!*sx%gbQ$uC{%F{6trGjRl1;pg9(x6n>UsVqc$jHsGpaQ~b=DKQ- z#&sX>gAMpmlu^O@(E^UznLPX1RoWgDY|mV6S8Z_9Q?^g&0bz6d<6 zwO0jW;mdVHo!Y@RiGNSa`&#S#RcbqkWRc~aLl}$el1G>94?LsyT|En?nlpqp{K8aA zS?YWBo_Fub#>F1r&}RD~nRUGg=spm9mXZHi8ap`J8|z#D02h9)dH`_I{sk%gESP^l z1%E;ZKPyDQ?>|ekzmY0_k}dvdnf~t~Rs8%S{|zbtP?vuY=l;&>`&qyJu$_gO`4>ML zKtlM{<@{Hv_nU3SlfSK$qIF1w#Qgh8DapT9N*Ps2*v-tdu=9SgzLux6D|WABj~;`p zdtGOIEaXUg`tJCBzjp(l{VSsD{>J1MP))#FD1~3bzMAGeMEg=O1nph+oscb(ehUpD4U5yxKlE3AZ#D z+@^>lK*i%OAKFHFIFI(no2J5bT2VsZA?dihNtM;e9E!_`&TV>m~#vHBaU2S|x-T0UstDQ0?XxbX>Vmo71 zD~3n>v6f2s>xulia7WlSJwdWm-e1?QbD9g24|mlVJ~|H=?tR@RoPs84K4A`Xn!Xir zO^ftN{t82WJkTx5@WPYC%Wqn`_hPY8MBDGE3=;(P8NH{r0rm@K1XE6>!KY;FVNt|y z2ge67Hz~HQ9`55Ajq3K+pAK~{=6o~(`)CT3(y((K^a7mNir>1K>cH3X3juSEDw!=~ z@u}a@HQEKws6^KFTXfZYS;8VUY$Nwh%Y(53ERxFgwIc?Xe0fgyyo6>nhTwuLI>8o| zpYBI8SLw?qiVxGZVbUwHJ5fgBcN4gjYa{SwfFk&~;uZ0-YofpDe%U@iPll_C-c`;x zjf|LWTSFBm9i*YCk(PHFas>8~Pw$&Bmf9_wpq3r_yhGj_}|nR z?uc3pl<`#|L3^;lHQ7*3D+1mU4WJbo$t1#*o|`)*qMf%84GqdC5wMv|wV2oylO)f8 zDa>N$mrkV0?4;|cALzdO_$ zdFak=SdEu&uH}5I9<43S@h&*O=N%W^+@n<~sp9L~5f-xzSL(LSNmxgG+eY%e{AjCA>d=0+Q&aJ&9l<<3JeB^WBG^hK zCtSV!qhDEWt4Z>URhz6v@NE5hR}$He%o1|4ur`XN zFWe9LYK@3PH#7@U@CH1nFErWqV)IeTP`1CWpeCn;gB&I-vXIDZ>68Tm`#cP9p0HJv zrS{6vRjWaM4G{Y*lP|?Qpjf3$bRIZOoQhVK+RD+lgDf06gA};t$Ht3D&Qu&cH*$>rN)k7u@pEwa_>y@fcS_lvuz0g_5!0~;Jm z)pgk?tea?9$CnTcTB|@ zJs8uV2|Az@#0%S|igGj+rkE^}BZB4#ds$(oAg8!^)wz3f&pF%bh&i2+%T?;3$8GPO z#egRub2N%o)ET&gMarrSVs14AXttz%;2u?o)=5&&>p)eF ziOv@oO#IRhQFq`lg$i405ZyP0&+d-#+FFTT8lwbxN7>#6$@>_sdm&IDQgU6n<6D)q zikW9uNv;^OlSQbz3bxeZ6UiyCz+b#YCJxSDErXwG6Mtkjzr~Yd zVgIRX!44o>0VFio7`XtDI3YXpPlDR-!Qnr1jDMh|ar~RTg1^rG(-JlSmyz{9V+laF z<5zC<8;kIn*#Hd!K%0P#o{I^`ZzA(IaIlzz)1#2spR4M4l7seUHRJE#0h6D_B5QscYfHghsK8|$ginLRpe@NC{ zalC>s-mY7*Pb)@zJrFe`AG`Fz`jEU!aFBc&?(cHJ92TDW+Wz#go5^sI0k2J;21W0O zc9bgc^0K@CeyhhjykYb*6QjM#LU&t^L7=ZA-YVPCXb%RtqS55#2=Qemi~t9egpibv zrC=q3VH_t~mkhbd2mh)$}x52NA5Pjy*Eb23B2ebvkpwN<{ zc|m!gRdw3wmQD6hnqwxlQ6v+3xC3@+)h9@zdr+Zbmai3s(Q&%412Fm$LX_<21>_S) z)iC$+tzy?g{hHoUhb%Oduujp)h>k?Hc95uSl72;?e6W^h4oWUzQz`XBi^)d|hPzr8 z`W%Ofhh^)Y?x3v@81drRrlxPq2gM&O^e8HRU;z>%0b_z_DvwZ_LS5MFTN>Are3>^R zbCZu9oVve>?}~HUKJO$v@W8g3E9O)LgwmoMQ5gqBPQ63fV>tj+P^Fk*1hv9Sfru#T z9Mw^F+KHz`zaI0hci~Gjs#Bj@Z^v04ib-t9Fl&jLiBfzi|B2#k(pks6DDsZir5Fg5 zCmZzWsP8$wlbDj~7;tg7QVQX+209tu>;J>tI|f;{uGzv_Y1_7K+pJ`zZQHhO+qNrh zRNA)f%*rqK-hI&bo-g{`h>qy~HCN17E9Sd?&GC$9fTdj|&jj17EUsK(dn~<{b<1}h z`iHCR`VW!-;d;CNPNKs52?qs??hZ_TmYnY@ap{4xMxpd+FS}lDp%BOpqM$U%KA-L3 z!tFhd(HnRuGJ^O$1X@gH=?d-4CL+oM^kr(4#qrNL#f`MNUL?=t%%(_8&5iE4c?Aq3 zmBv%S+hJsmruDy@eEOKOz~crm!P5~2dK+R9w!kP62Tb=({94l-+ug@>=k6wBf^lF;&2X&jxbIXVsbxkXeY264NiyZ2O$I@R;UGtyZy(}*bf0RlGkM*^iR|9 z80XJ5Rxu0>7=DPTXHb)H7jX(gN3hsaVLeSXd@n2+phGSgY?yInqdoMC6IsGCh|s=7 zSHM5pM)x+PXeNE5?`jjt! ze{M)=HxgRjtf%0lL3{9EIFme>FY8(nf??)8t3v0yz{qgVS5*BvB0sP~q%JJ+5My;A zhB!+3fl7hj;yVp)nHF;zRTtisTJ@3!ZOO(yQ}pWv03;vjAt{MsNA(<`6Evpk$ zO?XF5o#V`6v6{-OX7Z%iob$os&|TerTC+G`4ec0(ae@swDo;Ts&^Lm!RHZ0>f@_ZM z)^FYfNg;%{k||3;24+ig6S0+u2EW~Qu_GcU3OIzC*9CGcpx$vVlYs|qR>weMd&u8g zI(X!~Xpx6hT?Q%Q>#SUpQbQ=XO(beCTF7~AuE%SzoTA_mHYXcJmi$mwB3^o`s60|xpx25zXtnH4p3#~7BvtCp(|DuS-~}J|CuN0Iq!T;V zqfRJKB2sv(N@Mv8)(9a74^*|7+*RQFqJ8Q|dw5RZFJD>;3XqB(ZoE}5N3zJum?>th zgqB-3G=LfsJw-IeMhzNkD~5GVKrsx-pG%$0;Sw!%f+kuk5xx&tv)VNNv&KKX@oqKD z;LlYWyXDRnCdQ=7aDdahHuS&hF_7?$d-c^hafU^N#=yj|Xkg$@e;xM1B%>x6T~ z!j3OruWRx5<+psvfi?ip`r7>7)3^)4d&8IrTXlJ0>&_hzd$|u6vdGWIyrq}p=}hix zn-_b!?gN6;P4{u9owdsWr+pUxj2EO&F(EEpZ(0BXYVTuOQ=1h{UGitjXv}qvB8I6* zoVMDXfQuE$lTo5}f?~{m#rl?g`--2ZZN@28n`{LeO*?A3=8c;E`@0&bLoI z*B>|49UxAki4jzO;bP&l8T{OEvI3N}3>SMFezBGq(i&oRYsz0iK>}bq{oWorZvexJx`0J)bzY?bCi2YVKKd?87W8II; z_`5tcU@X$L3+C2gSw@`%1uv+BW(OLW= z^o#R37kk3B(n*F`4o{IWb6!d^W34|7zJb~APbVr&q{58-mP1&CGSO>K` zmBxfD%CD%gE=e1C>^08|CDzy|yz=IiHJ@svsz$8)tuzEmGEo#AlvPKi6EoPu&CN&kObg9Z{e`DYcT1n;lfsa{_!=Uj$iG>f~70#kpdKpfDHx`j?;j`mdMH z{=AOo#BXl#shta(fT*RFKQ+j?pq0r`0_@i_Sd1F6gKobJ;|(@g-EL>V+8(@!S;4Ds zO&~)7&`2-SzoCUhIiRYsd@ZO7)Do5pvN9;ybVONwd`=ZtP>!6@gNBuOHDm~T76$DWBn!Cht_UV zv0@~t$Fg4f`u!H{^Bo#oK&+v5%q2=)kU4+eaf^)XXiB znNB9WNB60QhQ><+Q~Nrw6h9$2pAD!;UwzDw5;2%X2+vx7B`xQ6?0RtF!0XL%2iR#A zP_ftcBwxuZ-Lt_w_P?5p{)uP(k4`)0KQaCnzxpS_{^R-=UHNxO)|Vsp@6h{yew_N7 zeVXkrf!Tj@uYLKZ{!gOyPayoqDD^cDu>GBGX8+sR_0O6b_CKX-{|08(l!!TRM(BR3 z`Gr?IA(IFW3}@;zjeb2j3c!KR%K>gb0u`(HyIUfBuqu3>k!jkE^{`9>Dy6)pTV0$5 zFZJUS%=$Ae3f=qD{p~91&B0UkzBIUv^Ce*Zu{A4wg*@s*4n{LdAF~_wpv>&K#e?(> ze>;H(`Dyj)6Z5zC+w^3%VsMyWRHj{l+w1jGj`h#q#(2L&cvxUQJL*Jhx?_HBc(+yA zwBYFk;Z9sXe$`*{%^1zQyS{P0zoHH8kD+%kktXtB4!N?|AB^kLF`dBKzcQL0@UB!h zzx6ptuT2kjWv<24JU&Z{(KZ(#>I82Ex8&H+**JSjlxk8^on8r7zVwhN?%j4ld-eyE zUH1fGpjksIg^r${;ocuMa)%VWd9)f-59^p`%ml{-u7nz87GE^-w81QB(G+X@Yy|6M zt{67sOhbhcVAOdf?070YPT}L45aAv^0;N1ohezv z2A{!T;4%!iA*`YaZ|ucoOj$9zRPU-B_lT!DP%V1RgG>fN1NJJ>v(zEImtDIqb?8Q# zT)|rn@05`qTg|jfuS-3vh&(S~ z!7SA7W&E)ISlT9(wo72|qqtAP~VZ=mz=0u!&sQ^g(UBS4V9I zMfoY{7sQ>$6yZ6f_b&AkaySV@iWkWRK96MFSzQ?ebr`+{VoK5nKRtwVd0(o^eP+Td z;K&8hB9R7IU~cmJirE{|cHknW%Vxe)AL1n4+H#yQiy&I_4XGeK*dn4qFN3=Z)y#nS zevLr8eTP4Dm6BDRENKk{UM^m65eD-lkWgZSG<$2$##5z@IJxN>NGDh%mV|6?1~ZoIUZd<98PE0?Wp_Ml93!de|#uSn2W2!?+l7Q0&L?@(|pER~aXp7w$2 z5xEX3#8L9vZ@GA>r35HSkP;1qZitr0qw#W3==nq>=N14zm480@y6V#7u>T}*7{Hg2 z8H!6iUt!72=yyRDNMc7KT^D02A#|KbD@}w3G?)f$a?s<+Aq!89;bx@RHSG>dN0$IT z^gAku+FNc)`2kSOx6pr2lql+XVRU@=LHXuT)->FOKLEL-G;u=U=ey3k|MZJ1oZQ5;p8 zqWqdJL9L+qFzg5TMm8|ND0Gm87z7$@D}_HN>f_+A%JXl9ewpa7NAjt6!tvwrl7itb z;7R?K;YTFIpyWpOW6DFT{M6s9d&whu*~ZshFY2K%I@?dpX?DOb%pAb9`8X5ykR-6g zD;?kXsntB>@oGlXR1%$7TP@PFRQF9aQz_#*dHW9wqqc$`AS22;EZPk@!#waP3@S}| zr>aZJM(W^>fG*fGr;zQLhUTgw1Bnx6*Z4v%&vZwG}AD@E)w6zEjobhnkaNEBgE>BlQEZlM{ysY4ri}xPZwOc|6{N z;$M{yHgf=QG*!7Cs% z?md*B=El2&8rNhRle`>G^}}URI)tDNUxAFEg_z&V>j0|U^P71o@6mScOS*_4}3W4B7MgsgBxP*gRX;b+)8J_k(&#()QK$U4lb*H;&>u%v;{zHcw>Q}LRnQ~ZM=Ll zqzLjidazkLuICXB`b{3cWL1P|Hn*ykBaX(XicJyDt}B>kHI%2Ga*IV5+@!{(W`@?P zW=#r72_uJY^g?E{7w8bLw|eZX+3z4?*az-@v>c7$FU{lnf|0zp+llymMbyR}X~t{g z()Y{3@&%H?J3SAkqzCCCtUm=_DwUBtQrBp8Awof%txCLiJ-gbwg2e}P-SR?1W402Q zIgG-K6pZw*FE zPu_5+V1Ln9vz^T0G+|d23;Q-l3INHa9&NreBs~ZVr?eTVcg_^xNsZn#aaL~NMYqLj z?v>^BBg&Dhwh>LQ1N)xrLZsIlu)-yKNCNVQ44C*FEb-QF(GFfsP+ocCs;)1EJ}cS8 z9ec&3;EW@07}D|x>K^MXA|Q1IiFQ=%cas6SiKkNID!5t@)`V zz7~Q};SK6h9YA8-w}?xLPxLEpNDv+gkwIVywYU0%&SD;p*(T9Ynd>z;G%pN=fZ}fXZal3F{2fmY+Q) z*=a~UMv~w`GqeptRQ;b|T-k)gfZHoOxgDUe1r}$LC#$ni^%gG!=(v?-H|B(5+P=Qj z!0)!I5VyT`(n}k2;nb@rjo5uO;G)N?iW3Qvp@O6SstY1__-xqsp4Vc%e#Q`}5$vj6 ztTW8&CZ|cY0Sz)aScDHIp@{mEgg>Q>&$No(?3T=@ zp&~>AH+HWtGzM=97cjLotZJG;i_w2X|Elg_VnEeGHe=rdlVm)pw={7(`M&OG47)&D zLW;@)uVX4Z}Wr z71X&D*f6$7U~?nhF!4k`lbswYQ`RCv%Da$goBDPQY|f7jO?zGH4FyHY!hIab{ht zWa-0*^R=t8nD|zeeJeER?uO{BwnJo+DebL}8c;RW+axpl%3ArVw3-b05a;M#ieb>w zAY4uTVj$JOZO|VeI9dP6rBlm02p8&9i)ta&o7FztWX;A`dc3p+MUA?s>j75}v3q5F zsE3fAetpl!T{vW#4&zpd-J}GcU?M56Mr^m}Q5Iz!-TKBo?_LAMa`J@BmfAftae`ac zb#2q(qo4(2QekmFW!er44We155)Z+&Pk~y7#OS3U3jGI%!_Ro4o5q@N#ZN=A@O$+i zgmO|tU44SDAX$6>WS^k||6=@M|A)Zhe}0nr$71NuapXTQhW;Ez{+wGl{%JA9{?F@} zzj6J4l}-QGbIZk71Mgn}-q&!#2iGKs3hw*$YNR={FvrCxz5qg z<;+`Q8t-6!o10eC40Q~WVMYD<+3U^m?$pD3(5l-B1UuE^c{2wW0*7aJTeDoW@)NAP z-eP(0sQ<11+41?38rtFfglQBHxhad`{3OlmIopB5ehO?VsBh5@cHaK2=bAMoFYeV3 zwbBIjmUK< z*pKaRfoIgM&?tfhKS6IZp6unSKC!(z?)TmpjUxl95m@`2)rYOmBlBN7zT_cG#3qwZP#AQ*HB z83FZy?Sysg0x}p5Fo+}XT{(>kqM5h0a2mL>rEu3oqw=1OBh~ex3(p$2r_$DI5rt&Z zay!LR*wp#bh?n)W`>v-jB6c*Mht_U7G3vlom~qo-AeTHq)g?pb0rJ0!e)x6$<2p@D zFLF_@?Md^s%Xv^!CUiwxSL%7jBFHYg|_#l`PT82|} zwc;d73dQ(IgurLwowWP6CKpd6UXiNgCt*0Vci)G`N=%=FqRZ6@Kz8h8*A;b*XTftj zgfv%b5(1z;O5rI&tM&(+*x=FmQ*?Veb>ryl;`C_EzM}<{_=?@5*thJN%qYTHEHlg&< zK$QKV%0cI;nov&olcLX$(0`JFsnURZx8b&}IqS^if{nlpiV)z{@K~P;e<{ag>19yk zyF@H_#?wGNnie#u*(jaTr6=V@E_K7mK59z>65X0%@T{UgF%qLBQs+j^oov!8^d!SR zmg-)6ScLhdI7Om;aEg&}rZg;Mog>;1WL2|ags){hZGL6;lRdX1&8%HwdIEN_V9++> z`BQ*P4&1Idcm5UkvH<-g%G(j!BL`_0L!gaU9YRqtQIA0oI$Z<17>cK&dyIb+>#RyZ0LC?N1@jXyPg(FGe zFHfeP$E)mEQ&7^oGGs@(R=Onl4Q0|bHb$yP=2GT%(r$ZMEG@%F5Hg_xoC$zL2Qi(g zI$4~zqOE~;*Y;cP!Q-$PC6|yEU##!Gy$=lz1cxPX@it1a(`#dJ#Mt$Z3}T01()Qv) z*EP!D-y2mMN`TpZm6X*~syZ;WF9vp7577W(Ucp}=%_+my6{F+YR*Xqg4=);;jE^!R zv0L;6JTsheAn^vc)KlC)7tn9piLILy)reE@;WSMhtk$tty5qJCODk9EEG17ty4>E3 zI!UR?7S#zE6W{=mPf>053ytD}txxh=Oto^ii`suj)K=k@RX&uo6qg?wN^Ya28mUk; zB!?IsE<3h1pbJm;r$K%hrkN>PC3^i7j(K{aCSTVql4N05z$G#&)Ez;>*x*`tm0&E$ zoF;2xQ66;HSbT3!x6u6wIp>W=u#tl>Yf#fP`&cmo=nPl2;ao_u03%1J9sFR!qi?nQ z>mq+#Ca4>KoT@t{<@6c>8MfX#@)zjEDbTd#!s(2Ol;g4@)Me9im7GaUOXs?frpu38 zwj&c>o~jJ9TYKoDi4JZa%LB0@XB5e;bSg|YVjpNv&Q!UFDUi>Xwv6Ai9mkg%4l)j5 z`Js|3Ub9!6*fuz`NgXxi=I_D?l2xbE2R)J6d(8Y!ljXtUHVBQ z5w8fxH(9YsILDKTggmTgle5+@&$}V5-I-bBT)#RdsXCI5G=(xbPxIeb2G}2YJS;4%e`qqk+?Zdc$$vLN>HlAO z!0``d%fF=z`71$*nTh?6v;2{u^cBX<%={Gw`QLGte}Jif?=1iE_`eRr$oQ2M^kr)O z?>fxCVsttFT}D@3%4Yqm+T`ks(G6wvlmrF@s?f6eLPnU!c_U?3vqFlwZTD9x*!JY{ zLKpqcnjJwzRmAak&xaX1LeSfvK4kBF2?_l+Ixe5*z`RKPmSQ~8ll?AZuNI!ny``C- za&Uq%v(P#ruW=Z^A+5r(BwT(gc%Auta=h2Sc^u`Kf!X`Y``W5hvhjV?zC9$^ym$B* z2K%_wGEhd}++FTjyDfL|NpQ99>^Q{Zp=60!goM=e*Wdxn0|Iyelzl9G`@&i;*4H%x zJ0fWvy{EQEA>ms^&bl974^{BLANOm9A1Dnw&E42MF>$@uH~3s%R0<%Ay2`df)ueh+ zj_tgu{KdFiLE!}3?NF-)gP1pU-u7Fz4=A+yw+J+)_`EF*hBz6V`$VS-7;fr(&_!Tu zs20|8Ct%-G6{l^K221-9tM!5+@;SYa{l7Ajef($=n5#($}G}!tu9qNYK z5vihB5;E!sMvd?fj0_+k?SZ!FQ__QbV_Z8{c5@a!?p!EzL1@}y8VI({ zh}%vr1}pQ|tTVy0Pl>sCM0Su6V+!hmOMPICH{h zB+sF*K`2EFMmOP*Ckzy@y z%Rw+DMR9CiQ4j(&GdvBv*u2x=l%Ua3nO8%7&25y#^{W{MRYGp#o_3d)ux`p@X&jXt z5V0XY^X^34**MY5hg3wy&jU%wpZ>Y6$U&!oUxt11HJ>{USZooI)`c zH^fZ${vtqO(3KSN=2Ezz0^WW#!I1Qopi9^3A2;JP>%R^q2kz#&%A5qlMu3lqY0Y5F-MPojpJe26tL z*mG9iHrlNH9z8~v32C-T>_Mj0&ev%3OT>`z6|e3uoE8*3gm`ygZ$Da<^);?1?m(Ne z#@-;s?|DHM3^Z)!;b79bAHA;xwbBKiLln&=XRR+PzCfN7rK9fiDl8ciOC=gX5aIqF zmC#{ezKb?aX=y1R7O$)eDBDx7h!MBaD)qx`NI6xHnd9}wHeYuVyv<_3+fT2?ftZ)a(J8Z? zF?DmT0xG4iP4hC7&61;+w+4f_uRnVu85bKsmIa`7A8}IIa#oX!0+q#@R{8jMn!>D0 z*-^1zxFBHpF1=jpIDQX;!t23`L4h#Uw{6u=Rcc3U%3fyJE={@h$dgZquBE%70{+!| z2oay>$`qoa#sXO55#>p!NoLb%9+VGxLmI6{?1-A9r0te)c~Z10!I@J)o;}5A;rdQV zeDLt8PF9HnbyeYy8sC9<%VO42+445Kg}pwktw7Y0hligR<&YCfJQmM?cJWChy*gSBPT-7Xyx)n3f zdv0^u@uMHZI0&q?W08rWVUEb!e9fiiiNicN9qPDd=wLOfmcq-DLQq8+ zha2oUmQYFE3D4AwL1a}j!;p@wsl#X0nJ@H>-1m4~${OdJGXo5w-Q7i;QH)&X-p+;W z>%HBd{Gp`sDWz}1!H5SwiC?<~;X%8W) zUxIi{B|Ic{+(u$4t*}xbGJc`D(Dm!IaTV!ly=qQb(v(U>AxRE`oXcUcCOtsd4P@!B zot-s;N^c5YUQR>C-R&m}AGO7^XZXqWa$_F7Y5dR%xA(Rny0-HzxENcOYdLa zzg1SNbZP~R>HmdsCuK0SP57P1VL>rNT;2+BIoGjB_dZY?8)0N#QH|Zo(6|!0gC?AG z^9gS92H_y0!tr+zyBJ|q=OKRBtaGN945};5cwgmsCENu<}R#*Cqm2%^$>E- z9k(>A$qYCYVB~D_efVj(3Y|-noy+#V@emgxlMY2qb zE+zk3YH|(q6#`_gBI(a(8K| zE$(_{#;_J$ag5~Xr^3mbIBnjPY4R)$xZD)K@r2W&AO8h-|1*v84@mr#^YSMU{t^fL z2|)k2{sI2}lNswD`rQ9{YVB_#f&a*p{7)i*uOyZKQzY;wPW+Q>WBNzNEz4JE6&Z2(1Ir*aKK6vW2pONXFuHV%++EZW{_2>Pj88^ z_=kF)h7OQ=3DVo;cxf+UK85+~u-+{f?B5OA(my?UKD>5!aC0)#77Q~ot_uBFH|s5v zaetSFRj3`GoGES1&gHNdx5A%5rkB%sej2=<+%G{~QcMpF7*Dmbd3HVTbj(fX=v~*? zO38g@FAr(-b9r-nani_@JjL`$d%M31-i8FVucV%woZa7n4ej@#d+17&oAMZBsvq*o zUZ;-!692Gcgsj0*a_2P-${63zn{+?M!^YC2ufU)<&ZHu*IT(xJ_iXk#s zvM{?=^Mxm62dJB$0tPrEm+QuDd8v*iu5)96nL?mwcYti`q~39*v$OBC9DJB;9Z~m8 zjEVL88U}5VXoyrJ@uO>T*q#@PV+91|8cU=W&ZPHlP84_qXxpL%qN<;b`K_!XrT8p* zJK0!j5jADfYF!&?fhUc{0b$ROgC{rHZMQ_(dMSYCofk#2PHKa3*0zyl==JE^B0>WX@pU=5r4x_F;G8(`bEX-)Qk&uSg=0<1gmx^XbHa9k2zb#ba4muGEC_8G?4z>$mRf@J%dlW@`c6l$c$6d#j! z&jde0vjQg3BG~nDVpxcC1DDpDRR&7^V_s=Rz?b`zf!&ep0RftXAS=L7>`^~_4 zJc zEY-2-Vjxb=)f-Nl=jC*`P!v10Z4`A5jJ~?8O=Uc8dKGB;|WYkuq}$$R{+FnU(f+K0T4%TfJ|+P0N7M=*n8TK(by7On2D;G2^_qeepGHqcXC%@ zSCJu(>2)UT;+kWa@U%dM;O3m6r1%q9VO`0@@Xl_AKMtGaU@JM1Kr%VX3{D%jG{ciFDc1??#Bh-SEZ6iln?JTL zHbFZWyR}S5KXzmoK^~bsSMp9M8s0wjE5>IneMR=392%RQIG}U zy==X?JfyTj*P~Y1w60ueE{f`Z=gPu}6WdUTQI7T2AXDj#BS(QkhnFP8p}!xjGnv=d z`{>XAA*t-9HdG2FLtd@WAe>K_|c24U4w4a~o!ParmOW&93AqYcb&UwKG$# z4JjS6V1bF7u>#&#Hf#r$3j=+Ev;&~@3uQRS2{F(16OVL1Bk+(!mzFCt{zWt8_^mrg zb;r#N#wGUt&+QnOwd*=MbM6pll27ax!f4-^mRnpMLlG~c1s=hiajW0OES4j>s2Lmv zJSdZ3lfegogR;#x6HM)y1l!z)u7~SCLkS425ZZH=_WO$mikc_!6{wfFbr~))-DJ>M zNA|;SPaYw1zHx$ssR4l)vMBhj@@_go}sDJGudemNsW-ITODI4}qd&2&pqvK`n7E4+u_qG9L zBZm`wvce~rX0)FomzS`oT` z>g4g!Lq36^qhD)q@>?e`$M*M>NDOfdeA|`!?Oi^SKR`&q(`6kq#}gX0lt@lHSfheU zLH6y_C-!<+jOF9@;QlH>+Q}Z$nl-_O(&rcKnC8J?CDA)m0&_$CTuRuFm6M$168G;1 z5Ri+go1Y9H5BD`l^J(Ps#Kshcj`m*9cX)DqKK@fa0hC-HN5rhgG7j$t_j4!jp0E80 z_KKO=J|wSmg8k>~_wPopFJc7uYT!5W;6}NTg5s1S&-A?}d5U=#A)^?c{$=)Dr)1dN z4b2LDdq{~(O^K8#qF$-IGSfbs8`*x{C`x58{2#KqRS-*k6FXh-*#`uyxA@AL0g=*_ zi6Guy#N7lbJW0m;w2|70gzSGAL^xp!$v57e*MX-qF6`$H~w}fY-sRKsy@=LtzJ2lHO(Oi3?>YhMIdB#i1f${)PA^A^MT#tZ-mN;7#Vg( z%;!em2B zZ}MI~7=^z~BHI8V*kVi)4q6$BoR&x6=vvOSMp~9(QkASIOd8O~9nWtC!DTC}5OzelN@r$wqW@UYHO8rTS4PNU}(eqBVGcd$c?OLmoU1Yhlsq4OR~# zmx(KKjT4k3fn7(~`;$VXT-nlV?MZXCbpXzO2osZzz--} zs-2#yieZtW`b_lnT;*s1>lKX?su-*_QfyfF!^yd#t3ulAxitCO9))EcV^lE8H2)%y ztUOx3NxQP+8On~HP?;#RUg|2-cI6tH2_PUHaoCEJ<76`O9N1e$8)XMFXwu3oqF#GDf#y zRqa!EmaQN1xCHPN&N7^)xMvdjl%I!Ap=fW7+?f^_pD97_)Wvcwa963cjAkYZGXz1O zWT`!8hPYLsomsjbA5uIsj?jZETxK14lO}Az(ni(p@0}<(dRgzeuTN`ZF91Qno1LgJ}CJ{c*7YS z<>&)^@7!42m5xKGyZjQ$j$C~La7n;lN~WgJJpPR0LP`#-jhH7AEknYiiL{hkZ(Amz*X9TTm@oc&*s_t67hMl;r{9ID+aZzzR*lT>xZ(fzsO&LqVhsR zLL2g|?pWravCi1dwAEiMST@zUDIdpTK1tTsf}(S|(_J`spQ!1TkXs&I&tEoY%h)dP z=_Lun35q40z!Zonz~H1aw9IcAzb3{TnW9V{P!(vI_P5S=2C!P%`Egr}LlVF(m$RTp z(V5Lgb79ckOrsDzto*xpw#z)Y;|XkV`xlT%U(au$=hxY_DDg5{6iQrLVQYHlS^KrN z`5ikGi9nWXEfvY3b3AO%%Z41${x_3=LX2H~nq^#|=C#r&u0iia#s=eh*=baQum_IW zd}RS@HVJue)&~|!deMMh1x*hEO`G+-WQ&-C?={$uGy{a3>ZNXgU_Wi3{X;`v zY`~m&_Ah)EFXheG6x;Np#l3jA&Z@B}SxI@H=tZ?~)sf)x3hVUuOft<+&&`jnf*nk) zNcF+|j0l@n`(am!gd~k8F>0ksY1*8W*Lcm}_Xgoe!6ujAdCt1O@@X62ERL!nq?QF$ zBukZ-=w=_-P!3mcoTu}IZO_p?q$zkcYB~Ny1d_wF7Yg+#s%^C>8Y9B zy_J=d>4~8<78LM`<=2FqiBy;VB~CkrYrX*+J2x+_>hzZ|so`0k)KKf6@rnMex_Tpo z#WXhS1kXBAsW3EtsgJy{Ri$L}Q}m{S3ZcQZ6OVXSPuMyHx~Rfd4v?Ey)IXyGX>4P- zS48&4!`7`;uBQEs4M^;W!I>o7L)!Efy*%FpI7Y7rp?wcD!)uI5+;#SCuFU-ueD7mJ z$Z6PN)D8M;`)UI^zc@_ZQeiltt_(D;RSJQU__TQ-Fb5IuE0ir5w?Mhq*HRbNFF#U& zaF)5?ccd${Lta*hG;|YC9EL}(iq#-MG`j}1aDlvv5GhApnI1NhD#YCn57b7spTw+8 z2UFw@Gu3<6mY)#2ty#1dxXi7hpFduX-t}#5j=D%o{s|}aVu)TvYrzhL&q1}s!yh!pZ zV0;+i`fsVy$iRo>L~FjBpq16W(kPmI&c6a)%zZyJBY{RR8?T2}bZ)Rq+8e2eCP0kB z>4BD4BI)L;;G?d5(}60o)r$hMTvb^4HITARQSR;-)%k!<^?VyqpPnpgjduLNo{wEC zAE4w?RggS+w|A;));fAU+|b}cur)UMz~Z&SqYinqLhU2$e|zX1tjDOpH5J}z3* z3AP?V77DE&W``$^@1GRuSyD;J z&VW2U>>YKoCC^GFz?Z5`^4YXwI3AAS_r^vMrDs{e;H{_xgzQwtYJ=9b+obUh;0!~66GGHvG0@8@>-HUviWat7VJB~G#P4o-Sn+6zT29TAcPs~?aXL|4`1FD4O6 z7@+z^Fo2_uqyT0a7#nq>1uk6UB;JjH#<1^mB-9^Ia`ey9PP%OQ* z3aMgb*&Vfk?c70^6cty)|%KBg7^x@M4yI0Cm7dJ@?i7knvd|YmI{eB z#ESjZ!zB>a`2&TzTvaAUaUDuI_0+6VoPlAihKZHFp93=l4=_rI#L5i%bmf;N0?YhLXGxckB^tmAEMz7|4I=~->n>Q+>6`}Ld2Dv5mwgI9 zLz=`knk1gg%qKRnBCR@iczelYM5u@5=xQ%p6$h)-Hii#==PQcPtj(4o3ReX)SWFr` z`kTp(aVe9%rMux(t{=UAQ(b>O>zqni&QKvv>D+O0H%X;PiSO($2gpCf_09I^Nm&8x z4{IE~9jvMh#}-A2hCdf5f83A-RV^V!cwZ(6W3SZkz)I$=tBcP{&XlfG9<+MpcS5cu z>!Si$^Xxd=O3@K`<_E=62WO4j!O%$1rSQwj76Q&~sYQ;dzmDM2SttyU?Z1%!9p%LU zrZhCU)+y$Aye)EC`$RCW100mddap8*Zr1@U;)TugWU z_$CS@bS!3f>sv}H8%tP6O72;}C!R47EQnL~0Ub~12Im=6S`41!XFXtrzUnCj ziC%0&7)VlMyhiyFnIMzpz%jZJ௿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%0Dk;LtnZw1DAH#GssTfWnjvIB$+z+d%-trD1Qt zQi_Slbs(!Hf+Pyw-qpc!Uv;5*5G43j&9d)+xxlApvrScRw2?(l-4`bCijFzcC+Kfp zVQvsbNOpA4u^7L0&P`@aWOsNDWs&d zWuja+>-&!QK=>TBQ@42oVHiRvKn|1;;T-!8^T3-%izZ(2a|ZqDh7d@fM&T5cr|k zn^biu4;P3Z)`-XomR5tWFZy&;rI3xRg7Qg8DH#k;2NIm%O32Gk43$|EEFO%R<_zvq z3@q_2*-p565=J;O9xQYFlafYwyR>UkkA$g(c=pMY0aH)rLs%z+SY>^n$3|jnBNLsV z=>;DQPmyU0TwmZKlE5Uerd1bXF-=TbdNizprCbvBLuN)9A345(Nx|OXA;-fBaTE_J z3W1n><=P7CL}@TIituZTZ;N&soFWd(Fc}L9tM0h(I5 zbe%R!U6jD+Vw)~{dE2r;>x;nfr!enS2O>JLV_A&$0@d77cK9_~1V|X`+<3imOQDyz zy&_OPow^Pk7^5~9H80w{+xzs`5H{y7^6_!ft!*j$<&Fwm zu~l%dG8_iwSX1v96Z11m#OPt|iq8wFw(=ek-6O;h4V&1ab+oNeNM(|x5=ut!m5fxd z5w;u62=R7QaY=2e{%TQ^Hn~XE63mKRJDiq3&CRRZRG$KAH8fn2V)S0z03&rRQcRwQ zN?oepJ{+Bj`)+>!YP^BRD2x$aim~EcbN=9`4-->T({7*H0){2A)IT(r)%R&W3_o>p zbp(#|qBYe0z@g@VA4joQeIi zCZX4t`CoWbt>MesFYCpe=ZL&rieFYV5@-bVh*a4n#5yue(sqxjDynbHq*F%{hoOaW z(i`wt?gSQ&J|52y%s``@hTJN^woM+-%WCw8yt4K$CKnie@A>fv@{ZwLb*cWg$mw%~ zI_R_24b()dPLEy1^3653lTgL(=H3LG%Gx4cc5!p@ihx}Hh2gbe4EV-2I&qo znxluHd-FCcv@I(&0vRksw9#ZO!?I3Z7(N&ngIksZeYoIg6tL{{rlT@$r7nMeAY&tZ>B%@ zQQCqTxI(TcAuc>pH3uKFs1B5TREb*4$M#>!dnDBlVI(A-#jjcufEQb?DE(rmCz7`n zA8pDY(mPaji%!BZTil%mq*;S`#HjqN>{w@#A#<`K;Fc^p(=FBLaY4uhPxH_tWB=o8;7kHW?-YZ52GvZFPEFH(%mW6uUvcvWqJ1XG{FnIQHxct+6+!b4 zQ1Cw_UB4i~FU-Ks^e6nl^luI(F#KV=#RwQfU}pZAyTb4@_LY(Cr~fhg-x`x(`-jK% zUx>Px{)NZ>*4**$tN)`I=AVf)09Dt2sF=U(S^OHwSNPwN)lZ)3yD;J}Sy%t}b}>`p zmS*hW6@JP0lc`^@;9-#+w(f_*!YUnVO1QPwvIST^uQUm_yHpwGK6ZBh_+vieB{>mM;ESi_=j4^($U)}U(ubtmh~>;A>a;klwqJ~s*o z4#&>=#qC}JzD$P~Y??Phi;zM}A{v8(|?ZKBdL;`f5P zoEX>}L5@b~6^hsa(oO4pv#iG4_*}-MtA$Q(@A2~U`WgUPv>9eieX;&_&3F*;EJ@YJ zr2UVDf|8(2%cw~rja!T_j=(6|!YEz$9t+&-uhptkR3*!2V}h0V{0rRJ@s@-@Z~d-v4| z(yE)9JH@N$8@~veH$W096#7p0OGLP~o%PtoV{SH+Qg?(rnkFn`(&YkQpsX2^=2saz zG-_t8-btTjOC>=O0XhFd8Nz5}#p)D=x=KcShH`kdZH7L=#fq++BZb%0An$Zb0GD1R#9v4Te9Di6l2vM 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

s`RDR_6zI^h{?dfGnb>lzY-!Wt?uwyRWx6!xA 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

cR_n*<+Qr9**Um+kRZf>T zz}ly^&fe$Q2qP(4J|MI#PZB6-r9B)p?)v*K*VzaUNZc5W92CG%E^Mwg$d)y*ELA@; z4d|32@J|?0bY5pJpU#vI6buqMBJROx0W+|xoIp-eUkw?bKuy4SK9OI(*f(NT2@G1< zY@T)pcgLymt_{j#B~0yMSKnAWLRj(`M>3t0iN$9%NBQzDRGm7W>>F zMjMqI&Za+1+f~WG1kRg0E_vi9)#$)al4VbxG`LAz^(F1!x^OC|PtuEfSCSI>yJUtoMhm#7PFaJ~Nmk*p>=h-yVL4M_IgGNI9Xh^G zO#zpTx=d}p`qD6Vi)sbExpk9L2a-N!FzQtL!`oHn{3(xr{(68Lk&Px{d}JhBBW9V2 zs=AI>&*zOSc^4OR?YUI0d zy~o_aEkg7ma%AwNy-`&j0^v@n#1(wwGjjBCOd}tsJ7k3wI4Kn(1d0?TyMA6leEAGIQpR4 zBz&Y@xFEq@&CYRVLhXl6X;eQd&8liksYaBvejSDYhD_(|Dyb)mSIifO*7VBeE_zbi za#k%U7MD#4oDg(Q3DC5v%WFrGU2kD4EeM^}vv&60c^k88<%g`Q5^8Ux9_%|0F-LTC z;t4Z~EZ9{ti8N0w5tt1vQD_3bv2fp`x(8pVcXtFRnccZcfIO zU9t;TI*vmmvuw2M^Vuf#Ev8W}Z@AaI?wc40gnK`pUL<>CW2*OC-&LvYX;*J|f;~!n z%!kud6%vh4-lE;MC4N4#rbW0Kmr5t+$)*1mrkGrX76ww*2wdTeV?~->ZHeutDYU4_ zL3GI!A3OfNf*d)Rk|wW5tBgPtqy6Ha+ux?g?5P*&ViTR2_dSSab@!h9xqBbyJ$qto zCgB$mzBjr|d}5MP*#Bzo%mXi}syjbQT+#-{F{5S#^@j)nlwZH9_o`l%v>H}LAqc22 zvNqUFT9(%CMv)~D*AY=vP+0^95y>P95imN68V6B9J1ja95mW@lH4#N65y^bcefPeq zI^Sx475*CdbG}0<*c(V+~(pHPk#PuAKK~T+g$X}&AZ+6>>phDm|tFg*WK@W+|v&F%8{?${mM_= z^WD#_f9D(C`nvlbSi9v88^8DZN1pbq4OZR-^U6-G^i zbMOxz^U$a6e)sz?`t+;*<;vs#Xp4_O@$mZopFH=D+wc7RwR_+6;P=ir=8C`h>NEEJ z{@yno^4xbFb?198`rX~z+_LXqZrFIukH3FevDwBwK2d%6ra#{9z4sjbsh|Azktg1M z%DJ!K>582nbH!e(zkS{%8*hBZH|rg?yZW2wU%K56uXxrC`yaFJDI4FhX6=jL^5}h@ z`{^6^yze8g{MWyD`M!6(`;ymR|MV-b`r&CS{@}n5y!?yrKk4IFufFTo-}uFmw}0f6 zRVQ5gz`I^_@sTgC&pq^a_kZelyZ!6ITdcj|*ToAjxNUO#lb-g2bzi&j<^TNj2adSz zeP@5^OXX`0F0a_)XXos8-`0m*x62`Kyx{qdTYbKIyNY{`{YP@~l^HUVroQ7r*GI%P)ERCr`ioAO8LBM{Ic1 zCpZ4^8I!FpzvYa_Tztqe|9SJBEu>qa318dnxR37qt)q`v^Ofi2C*S$wtN!+lPyFYvp76I{IdK2m-}%&I{_@o~efO&K zF1qYn-#Y)CCw$`6>rQ&zq4(atgK|IX~2TYu=FeO7<|#(j49)m=Mo{6W3GSo_suzkK3u>!#;C>E87(-}?GXF8JQx zT>OTEpYontuK)5?s}4Hu3-{K0T>Y9GZ~W|&b~yaZYwusN{p&t(&ja`V>7_Tk=z`)| zhrjKO>#D`=pY^3ZZ#eYBt5>}B+SQlu_od69^0lM?@w~e?-d1dN?qC1oPB+{({psPC z-Fo@$`~Uit`<{Q`$G*F6?aQv%@zh%ndG-m9deen>9B|n~r+n@HH(z+$N1lDg;V194 z)9b%|?MMG=&DS1$@wMmtW~)E><)IIL=l0Vc_0_-o`s@4Rm?5O6iJcJpTRP_b+tI2= zY?dGK(iJ!V!|6{Q-SzmlKJrQb>1Wq&_Kx13?9s3$P}oFFEpWMHcBeOTIwZAI%%7s^ zN$rpwASmflI{}!cq{XIxt4vt>|0b_93$-ra{lJCMvgHRZ9LyjOPLFnxD~XSn{YQUF zz9dX-nyC2`Tx4gM)1~*$q3`+DtKKwv{9FFz)HD9~9fv*p#~0o4<~_DQc-dk1|JiX* zU)b)_&Ac8&>W7_+MRc-M$Z=egDg!`?5Vxe&KiSTsY?bn_qS5R`0y- zo@eg*#tX~6KD*gvmz}lyzTbS@1s_`Z$%|fa)~Ty*f5flvxNN&EcYegJXZ<`oX?ooc z_S<~(=biq4UVFpm>No%S1zVJdf8wN#-#Gi@&;O@O?|avNTfF0guRH1F|MKgX-T&Af zest`!o_PK>7k^^qgIC_Y{_h{V^Y=dRn}x@``O+so;lj~Vx4Z4xyZ_;B_dfpnAAIP_ zi=MpV8`u2e;7@-1Gn?=CgzvxZnonPP>i>M#SI*sH?=yb%!VQn#`%gc-%>lb?ICICN zuek8M#l1ha-MJrJz1xN}c6`qtp7&q(d(Dx%Ua`l<_r0z7<(YfE`>FSR?#V~JZ?nS= zegE0(KmY3I9KPtAB)sr@M8sE4z=rRqi=VY9tI zDc{+TS@W=!_FpJx9fiHZZ!;=kw)S6$N!#hH-E`J2N~UVou9`8(vuV~tHN&iCnDwl8 zlF#jw>gfZFqTPG>@F-VS525Wgh+>wgtb( z&ht99tK+=ZGy3Cf#_BlEFajX7ACG5DkH<55V^ZZtcT7$({ERa@o+-VB@k}%FGvY^mv%6xG$?nw~Fgu#r3b^ z`d4xNt7^ta758Tq>DF-{Ai)El^=O7y$N8<}eyHPqsN+1>aUa%kAJlOl*701|Wju>P zwsH#7*_@w4>OyQ{IEd+F#x6OMv$^0Ov(3Xl5)PFnvsSZLY-v7wnvj3Q89@HdwhI49 zUBpQM66s`ddHETUv$(O)r?Zvi9|<|ige;4L&c@kn7lIPS$0SM9N!$P#dTz$5Rn!EY zCsFielf>#I@so~CW@R#le5jRRMV(_^n5&_T+?R)7k6? zd}fm0=M3+O_Q~S0oBh48-&^!*exDt`+24)cY!!^%NF| zPdIkN{x8^dA*{1uHA`mP&E{rd`JbO~96EPII~Z8lKHI^Tmi6lXo~PgQ+26L@5QnervR3}hkY|d%qguNbF9Y@yZyiOuu&TJ6@b6(2` znDaV~fH|{O1k9POBVf*JHj0pj)yOM{H_c*XmVJ~Ukz1rnf<$)NkO>m`WlJVVWEc^Y zAdzFXVS+@K*`o;(c}8AENFI4ca3x6O8AXyHX{qNt=aJ{}oaa39jM_=9BF_lo1c^K& z8xth*j3`Tx$TMm@K_btb_y`$Co;h0y5_v}HCrIQO@tYu#XB1(AM4qWUOpwSkvN}N` z&z#!?i99206D0DCDV89SXOwz`Od`*iM+p*n#s*E0$TKn_K_bt{^8|@Jqs|f}@{A%+ zkjOKtI6)%Mi24MHJfrp#B=U^nj*ueqj9y5P$TL1!f<&HC^9d4pMu{XyurW#k#Po*aC@=VQX!ihZN zdL&5X880M3BF~t?2@-jx7BE2~&zNEf5_!hxi;ybvj2Vz1k!K9I1c^LjVkb!C8EYg# zBF{KM2@-j(=R8-DXH3n66M4p1PLRlRJ?FWKJYzscoI3K1X_p|8XY;laC^Bu1R{}+@ z%?C@M$aaQVoGMmd4RinOPb~OKE0l94)n(rExTh6N5aCtx=uW z<`LE?&n!>lz}`&bP5P6#S_4btXjEvHr*Sk&G|SUC8Z}BpDfQc|N1n#fsM0J?<7kv= zmb9t45sANX8b_m0VKw&As8m9F3D%5boW{|p)oh%`(I{5jm(;e|SK~B}M!9C=G>%5S z!fI;U?5m_scX&j9T z&WbdSMhRz03ulcQhSk(>vmQwkXN@Y($~2Bf8E0i0N289jGL55A$XS`j(WvCCOyg*j za#p5sG-?@EBY%xz&dRhNjcSI~gx8ECY3Hm_&$xvVuTjvrf&msB;^YyVly4lYS(ay) zqc*Hrd;GHH2P`aq!P=LuUABDpg@a?@a`{33{S^yUxyTKbI$O*ajz8hpV?){~1$Bd? zm;AN=0J&l^U97Tc55dMcPQln-{(={~urz-IhwI4^dRW9Jkny%Y-SGR^i(%Y`y`r2f z)`U)!;4lV-;G`}WbCih^Y^z3B8y+Y5v`4y*Luh&FG3PPl-OwvJ z%su-$d{1Toy%_#&=#3}EVp&ak&dPY8L`>iVntt~1;07&k%&axsjf)XRgUntQQd0xi^H$O(*b5oYhe58Wvc(C! z_|?tAG(QZ2c{y5~PO2WUm5038(j-&XyP3oOG3WTrLr$F1D@Ntw2<7Gn4cmh#raW@P z;kZ{O*tPZ{9Hu;cLyt@9J!iNGdD^9CFx3OJ=vAY|0#)fpY!~VWaVV0XocbcsOCdO~ z)cO6QUs)Vylf|;=lFsZtS2T3%z2JEoMYNb>;ktj-rHmmp5==dm0ZzDUJBOY#_sQKTj)vYxg_WL~3P?R}e7c*!Fc^^+X$pK@1yptW0c}oDh%fQ7EDB0b`C8eht0;RVfDgd#Mt&p*N|gi_`|n zBvu2}XsRh~C=#t%BnaU*qS>{B6iTdRYzSIB5+hv+4l}b;wQWN%?=`-vff12Z&DzlG zmo^ne7()h}s$d&>I72;qhQ!+-da=m1Ay<|qK{T1aY@ll<^oj{CJ>f0CAY|ws9)sf= z-;wv-`gk0;X}r-u)(*R?FYHi;64|AX-b4dcy-s~S(6C8G#?87EB)C*G)C0Fo9gCA& z^m^5NJunZDilZBP{i25O$*_G`%LG#I-Z$WZk=Im(-7q*Qa$*iW3SbmcYfG>3yf(X` zIUeDV7G;kUKoVk@2bs#y8=}N977G-ooS4zTGd-^qZ)lpgV)aNubD)tE4r|*aA+WN@ zwIC&ku{=bM3Bep!gIWP&5E`>AE;1Nmdozw}_D*&8FuvVoC(^@@rqA=;j$85mJbSDzXV`}5As?XcWKx+B#PnvTeY7y*J+YlUfXwogMhTx_aWuR6_*S%T<(KIU0sKy+~q2xIGbpm2)*c_^D7PNKG zzR3p$VbJu}b^EmRM`1`z4&xDucKF*A%}nVPW%T((w7j z?iq^_FdC@3=J!QgE7Mz9LXrM3hpvYr$x{mWdO`vDz?!5UnifB*dLo%vlfw*)`3=`* zu4~(PDFS0ij3ko}^?v~X?=M0@pu>i+azR0H@`c4i-iNoeIU9fLB&2SgTW!AIN zhuZsMy5!VwR-=AKhYI2J06@bi7RBPUHxY)e$pFt$OVBduJ7#a@a%9W>R1+Dgl7#;XfO+L__m_1OD zM!n~nb?bTAhzkp*8J5}O7xsG@YKr#fJ%)vJ!-s^+Ab}HVQkT{-C$3wydfA9~CU{f{ z!4d!C13306oYe~fM(TZP71s9O!tn`)MBwZ@n3aomVD^jcYx^&?HISX3E)4n1$Q-OP z2et#lJg_)<8#XO@jE045!$za=So$Tj=Xr*?sg?D2+5)qHs)w0=@50JZ6z5=}0@T5R zf#qPORo`@B^;qVB>uOeP=SNkZ5x(Vb)oB9*A~!d<8iaeuB&%oe0OT(_thvbLvdoeEe{(>zu-;nnot+7 ztnB5e4vb~<^E|HU*NuZC9fBLatz~<)JddF13DphZ7T9WDHrb1pUSFb-xm+)OOf3i& zMi}h~;!RVt6g#jYuPw>chCwfc$J?+`!PN?f2aGaXX&Y`^xVGHB>Eh8g7=&#+`t6x} zF0sk{am?M=rbs_agtzI@M{WL17slg-ZtiKTXNyY)7A|pZ8E_Y7Cr0Fb!6hn(M-4+^ zX_hv<>9n*$nGOuR@Jv}74_K&?YQtz7Ud?O6MhIRxzXh(28wcZ^%9$?M2o4W=9R4nU zw5^B-JD!mo4v)4|-5cXjo8@?}bZ-!ma%;}s2$criwq+>WbTBk#mp|IFnq3%WuM^!H z7;$b6Xls{Y+;~eagbJ+kdxJh|-3KIzWo#Tc$1?>gxp_g|v9WMY$73^K!3bXPZ(ZBc z*){AoY=q_!9a=CgZvL#TIa{tRsXBr2s%;m>dW2^JU0Xhl z*u{ev2GWI1E3#j*532BLWtSde!_5J0LkPs-g-oY|jqQ$B8)j11UV3c9Mg_`3WFkk} z@n>yyu4<0I(5wB~x4DviiZv-V9938TOw+dVb3jA&tJ=tgYW`v<(-ET-(yGhw&`7PdT32Q>?CS zZRzYb44oHVJZ{5As1My6laR1)3D(yy;@$Hy z8CzP|@n=_791PVXc$l4TUPg7PbBeT**dcE(%UP&vf-Sz^sp|c@MnZS-s7OI5c455b zBKi$HjPEWUff1QM!}GEZJkdRPLiTa+&Rp><&B(_d*c+wyt)Lh3A?>-hwpO0mg~76$ zd)kIqxE)^Y?K%pI#kK$@`j>uliM>v_%Oi7zfR?%EVwT%~&?8#l$HBoAJd-+IJaWM# zFVJdCHk6-G6#$1`ii!*~@-`Y701 z9*GyU(J5zv@?lHWcH0u>^7{qT$LksBi7fz(gYM|rG&`L~ z)S~jbmgUg1kW=d7`6E>*X9hff26+WCT;lJHjT7kgG(`uY zg|}k~)`@R#Fp;OkRK5QO9(6_CewllMpj{YvA;H<1E6NSz{1WE!IUsB)B%7ya(Q6MQ z{pQDO)kK1aneF8Z(HyZE@KQt$naL`=aE|<*WS7cXas$zi4SSpJS0GgTGgVnt`}3rckT8evk4P9|%hdIt6Dd8Vzm&3H*vbu!}K+nCIO#K$QY zlDsak@a2&1I8f6vSD0L09~Ioj^6N%Iz}xp+)*xl!)}z1;b$$w}XVTM0?qd|BtS8>L zrw<0=`oNF(`30L3@jsBn-bN>N++(ke!_~~r{NZ!TzNf9|cp_TfSA$r%+t;O6 z;`#Wo;r{wHB5EeGgmky)X%>Lu4lC40Q2sMDY6l3=OA)E1x%-v@g#l&*IBMWy(0 zP=6q@sib7W&jC>eucN55;l`^Q8+bm(2%h8;_*jVeYKABKYC0h(vH zqP?YUE%v=lmh@5CTg%;bBa$Zmf(6+8Sw%eC9qi8Bqw>U$BAV!9^+fBCY~8l7H{ z?K#D2S9yR|6`g1I@7y@h(y-(EpxnZrH{#TO4j3Df*SAGk2+srt{NAWYMEJdiR**eZ zao<$vQ9tDOWW~1kePAMqZx5d6ik=t>UYVXtLhIg#1yACW_x13r^@rhk`9}hck30Idlz1vV5jWcFQ%xSyaG>j88Cu8-F|`T zn)8KDZ^MBXZg958kz=^anSnd+&sce#oI(3~nBRX^hUfSr=PGqjcp6i0hXJ!Ec8tAw zEhjKtb5b#04{{Tc5bJaH3wS;Af?*l_5p1r&QII$@SkfdIc94sGBGDEFXKg&D6Ez}j%(`m0)0q+noye9To#7& z@o``h4+9n+RP2n6awL(bxV63}3qeA1+s!i%_-WRs;f z6qwj0=y>tt$?%~teZQ0+c)Mgwa76K>o|^Sl`;?klv2%DI%*U0{zi4IQMe3Uf&`Q1n zM(}o&=cqZ?wf5mwsz6V~Jejadq*mt(|KDFr@BlO1ez?MJ@RAK@LOY8aWJ+ zousy9A5e25>wz!i*O$9I;S1dDIR!>UqB~x@njwB8kzt>QCCMpuctqQAN<2Mk5xp!f zu?hViFR=;zTv=VDKj*j_zOIjcRd?g7`Ssu>Z#}=@iSKObH^0X#&bfynJH_Uwt=~g< z#1aD~y;_UD1W)FQl2qBJ6&I*BwOXPId$fU09Nn&%p-Yl<3NcsIjC635@ z+!P%LsRSplf=l9H#*6GpwzK%K+*cDHo2p^))rb>{ZHBcga){a}Id6CdqL09nvqg4G z^giNLdNeOQsIC|l;N?jOrE$$3L52Lj^f55`mEL>Zu10abbvI$ z5xu-Oj=e0QU#VZ?K?lj3f;aJd9GK1(l?MJy(*Xfg&$Bso9!Aer3fmyZL}mZY$2Yjs8*#t!#(9mc7|%yFls zrUN{QnVb9Td4{|2UVCS3v=yE$&F;r$CAh*fO=V6|(*om?gkKM?jrskDD_;AU7LQfo zj=T9IZsucx;7PpQV15pmDKch`9s3BKQ#9zEVf?h51fFQT*U0`0n5h<;GE{o8E~WSkK4w!Q&#X&=X&h?M#KN!{ZGL z(fi_Fnl$CE^)1VToj|7O)2yw9}1q_!6(rn^3UQRA`=OviLS8grhcBO zACmQ;e#qOl^g-6k^NbTKFkDz~tC;%rd$Od&(9bD%uw<`sVq{JU*9kr1@;>fukzqOK z7QgrBjVcB2JJVM82DL)6mfS%Q*-pG&>47HWCF$ztkBp7Z3k4E>{_ys7UT{-99$MeW z87u-I{8dyeJ9$d=n%uo+(_7DB~cX;`c5-yR3)Z z5B2MdMJQ`tsejJ1W#M~09odd%^sxs*pi<+?t!TMVVxdxB<7#-`KL<~JL~d@19LE>; zF+oD5;)l`)E8^zVd~rX276KI*1r1*AvaS5waWW1*mgZpa zLgc4AHjE8?{1^da$f`yjbrbHnp?1mW?_$1(_eOD(M7$(-Wvdm98i z$vLp^@d({Gh$;9zPTTPD!1j3qCb2JINElBKwczH3ekGs6*rZOM{U>#$;1OMyKBQ&> zJn`+JC-KP%fq8$n;7@EWYwPV7lSAI`0k8CR|G?O6o@dI2-MmoAr27vQg9o%KAva7-f|X5%K5qsn^TcFmiY5Bk&M63yTG&D z?;*$_`2f}ui^z`yS6t?b0&?kB>q?=AHuLldQTY8wXwKVuxOtMt#%+{b0(f$73`K^* zbp3+o^X%Z|BCmMv#^*4=BZTGY;j{ZWAk^pWFfNJ69X2YSAn56lI`;EoN7e5aa_X|z zs1Eb70xn@lT|K;rt!#MS-vc&pZ`!K70_baJ0Li-xT&)tD6{AyZF7U+Pvg=W@ zugK|fnRg*M9+|l_Gh1HqU3)`xk`Nw z{i>`(4_y=Gw$zbA>Ii0;O;5ZOscRpg(A`usf8RQ5CK(&r$# z{DDMub47Kr?0a^L$OCqt=y)R}-CrB_Osp zwZGnPM8v8+Ztj+!mx>62hhd5O_#|&7QgrO+l%wzE2B9<`Q$S>kzmF(pK^#3`B1`Ov zOU08nW}qiE%+%pYUK~8Br2{5)&A>>udH(Pc{hlOjAvPuvX_4coH=k3QP)+0QM0hTh zo&_>JFF4eG-70GRyd1)VmA%1pT5^7C~rWmOfqrj0;U&dbE|;19)VRx_H1Sis`~= zEAJPBhmqOE1IFQw+uy&bHB{T zwCp)NIs06V6y1Y_@cACnGx8RQrEGjmfj%U!3m%trx^n=G#J#|J)`)zHJLmL4nS*az zO6@*Q9>EO3!)g^6FQIi|)`!jkZnxW4^btNe*4g9s+=%p{?3?VYDSc)P>O&%Sm8z2L?PIi|}~HjKJjHj%6l%EDc`duD(@;i+)3uiLOQZNz9Gf zBhiB#Y28DVv$}I+ym*+sg6nw(CU5BhllSI;NevJ%9_Q=Ml|9|-L+<+0R_@+lXUiKn;K}`8U~<=&wo*fYfR%T~fQc^zOzvs{lRLb?KGADdfpM3K8~fyo=mz$D)TjK^`Mt=#{`UywTuwB>@lw3WNaw3Ry? z6ynIcWx(|N22?C6e{2_LThLZ=RKO%308IQ}n`dvwf+w*Io>3?0>&I&kwg`+epe~F) z#0G|*$WCCQKWIz!LYJOB>F#wSFuC7|#>27jZMjb8&M$q4Ek#?B<B4A>N7#kY zR_auNiEP3Ek@ygJ@|FOjkXWg;)pf(Pb$W}o@`fL6vEn?>uXj}>scOx_;?MpdQfnHaKPBfKrYpP4ARLrDpX+*tu8d3#`t&i8AV zC=9UciOA3xw>Yl%G|CviZet$bU;o-_A$1h1u`2z^^hdi~ia% zqcXgf=y}n%fxshKBzTBpfeA0HIR`}WR3FOLqLBJ%}0Zi@z0h9Yj zz=+rhFX7|Y9lMivw`9C{l0H7kX_I$Xx#cA_$9D5e^hb$}>F1Q=Cg+1}t;lC!VyoCw zyM7N5(USE*?faM(u~MBsV8S!%L(T^pS-I|jYm$ORt*XPinC-)72aaqRGL$nLeT1Npda)%9=o@v|m!n3}4hFwRN z)boM~;?E$dJCU7SnDns`JLa;72x=)kjC3z|VMc6G^7gXV$PbF0L-fzb*Ep&Ym%<2> z_%3)77qFMSWj&~+^YLBqs3LXqhc)SAxh8VNwqWkX-lb&6$C_y?aZzAu^HJ?)pn~5UT*dS8CaSqGf;~O< zi`NTyram_YCkQcV%M1#P$d8BNHVPh-;AJt<5*;tWO}|EDG)1S7`4oE%JUOf2`C1Ju zGm5bt&vYy2h-c}%O+x@c-c6w}o(h;QJzhVRdU?b1zB712k3w;R1wv2cn&Ejn2Zb!> z7d)w{EHSTqTp2u(_uxrB3Ow1T1fb;JJ20`wEh6pf34uwiBru7=^O&Xhm%tDbey(_0 z)5EBA_GgB%$sV_>06snhp2XXM5moj5>ig(c4eb4WV7#vB+7kZrb_7lt2CB!yk#gq< zo~2G2Q%~OUGMMZ?q=xKW-q`Z8n6~0;0299gn7oP44IRn%0Ha#Xj}0G8VWe^dPrh$} zyplKN$q7Pizc2d^mkIuv-3Jp@c@z!`Mg4wb!P@VLP?%yY-+!EEexz}`N)lL%VG*W+TxF0fJ^p?_-9IibL?(3z1$=hSVq-GWv1w?)hFu7z-DY_H9 z9$7;4&--db1SNI@jL4Mlm%=nz5A=teBjVm(W)t_;{lYVM(w2fQ85=IA!bDG#WbfG< zn6|Q(R`le@Mp8+}i_@tvwTmfb_jwX~f?d~*a$6ZM$4JJ;QYx(H?DyD&l+x)r=fkf` zPio`siFn!1;ewBwD{elBoo%ICeoncME#u{akDNEle`s3_1nF1q`LlCXf3TZ~Rn>ifVD^J^3?X9ymZX#(RCw1<(t^m9MqJ#H^ItQ67jQ!YCA+D58H)fVMGyU19~ zAs^SXN>iOv+$b3@BGK=Ayy+g8+!ds7i&8B=2gFchEjct^UQO6ovL4uG(w1-K34e5~ z^wf6b*%{@JQVs1_;(AmpN{tsVsTBgI_8R#fu`RfwE%MX~$YpGZ5`{_4i9LBMx|=r) zd~69kc@G)bMC7CuRLedkU@UvQM~+iStLwpCMs2G$9NA0JDY%0^re$7_#4_-R#m6QR zF1{aM84#P0dkK0jxi>54oU#!ahvw9|%_QIM0w(!4U?fTXnb8_tyB+2IJYZ6%08G9e zY`5}#3?7)&9RicLkAca(ZD3Ll0!(8;_%Spai=i}K{Lhoa9z=)i= z`D2TVU5u8IwL~b2%}O*vbT_a1iHzm7uO67>Sj<9_cm%lwe^(VesnxXz5Yc?O1=>(DRp1K z4JPXW%;!@KPv#VuuZaOq?vfeI=hY16<(k2~e*{eK zWE!l8XUT&ZUJuV`2DiT4mX!4c*26QYac$efv&a&7LD)%KMyxQAIkfdL6zJ($0M^4Z z+oS1Y!@8Agj$O5G*@_j*mLIU@q*V*V{jz1t_g}kq!vf-JVgF^z_d0&{+69_~fA79< z@QPi= + + + + + Chapter 9. Using Cursors + + + + + + + + +

+
+
+
+
+

Chapter 9. Using Cursors

+
+
+
+ +

+ Cursors provide a mechanism by which you can iterate over the records in a + database. Using cursors, you can get, put, and delete database records. If + a database allows duplicate records, then cursors are + + the only mechanism by + which you can access anything other than the first duplicate for a given + key. + + +

+

+ This chapter introduces cursors. It explains how to open and close them, how + to use them to modify databases, and how to use them with duplicate records. +

+
+
+
+
+

Opening and Closing Cursors

+
+
+
+

+ To use a cursor, you must open it using the Database.openCursor() + method. When you open a + cursor, you can optionally pass it a CursorConfig + object to set cursor properties. + + The cursor properties that you can set allows you to + determine whether the cursor will perform committed or + uncommitted reads. See the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide for more + information. + + +

+

For example:

+ +
package je.gettingStarted;
+    
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+
+import java.io.File;
+
+...
+Environment myDbEnvironment = null;
+Database myDatabase = null;
+Cursor myCursor = null;
+
+try {
+    myDbEnvironment = new Environment(new File("/export/dbEnv"), null);
+    myDatabase = myDbEnvironment.openDatabase(null, "myDB", null);
+
+    myCursor = myDatabase.openCursor(null, null);
+} catch (DatabaseException dbe) {
+    // Exception handling goes here ...
+}
+

+ To close the cursor, call the Cursor.close() + method. Note that if you close a database that has cursors open in it, + then it will throw an exception and close any open cursors for you. + For best results, close your cursors from within a + finally block. However, it is recommended that you always close all cursor handles immediately after their use to ensure concurrency and to release resources such as page locks. + +

+ +
package je.gettingStarted;
+    
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.Environment;
+
+...
+try {
+    ...
+} catch ... {
+} finally {
+    try {
+        if (myCursor != null) {
+            myCursor.close();
+        }
+
+        if (myDatabase != null) {
+            myDatabase.close();
+        }
+
+        if (myDbEnvironment != null) {
+            myDbEnvironment.close();
+        }
+    } catch(DatabaseException dbe) {
+        System.err.println("Error in close: " + dbe.toString());
+    }
+} 
+
+
+ + + diff --git a/docs/GettingStartedGuide/DBAdmin.html b/docs/GettingStartedGuide/DBAdmin.html new file mode 100644 index 0000000..5aeaa3b --- /dev/null +++ b/docs/GettingStartedGuide/DBAdmin.html @@ -0,0 +1,157 @@ + + + + + + Administrative Methods + + + + + + + + + +
+
+
+
+

Administrative Methods

+
+
+
+

+ Both the Environment and + Database classes provide methods that are useful + for manipulating databases. These methods are: +

+
+
    +
  • +

    + Database.getDatabaseName() +

    +

    Returns the database's name.

    + +
    String dbName = myDatabase.getDatabaseName();
    + + +
  • +
  • +

    + Database.getEnvironment() +

    +

    Returns the Environment that contains this database.

    + +
    Environment theEnv = myDatabase.getEnvironment();
    +
  • +
  • +

    + Database.preload() +

    +

    Preloads the database into the in-memory cache. Optionally takes + a long that identifies the maximum number of bytes to load into the + cache. If this parameter is not supplied, the maximum memory usage + allowed by the evictor thread is used. +

    + +
    myDatabase.preload(1048576l); // 1024*1024
    +
  • +
  • +

    + Environment.getDatabaseNames() +

    +

    Returns a list of Strings of all the databases contained by the + environment.

    + +
    import java.util.List;
    +...
    +List myDbNames = myDbEnv.getDatabaseNames();
    +for(int i=0; i < myDbNames.size(); i++) {
    +    System.out.println("Database Name: " + (String)myDbNames.get(i));
    +}
    +
  • +
  • +

    + Environment.removeDatabase() +

    +

    Deletes the database. The database must be closed when you + perform this action on it.

    + +
    String dbName = myDatabase.getDatabaseName();
    +myDatabase.close();
    +myDbEnv.removeDatabase(null, dbName);
    +
  • +
  • +

    + Environment.renameDatabase() +

    +

    Renames the database. The database must be closed when you + perform this action on it.

    + +
    String oldName = myDatabase.getDatabaseName();   
    +String newName = new String(oldName + ".new", "UTF-8");
    +myDatabase.close();
    +myDbEnv.renameDatabase(null, oldName, newName);
    +
  • +
  • +

    + Environment.truncateDatabase() +

    +

    + Deletes every record in the database and optionally returns the + number of records that were deleted. Note that it is much less + expensive to truncate a database without counting the number of + records deleted than it is to truncate and count. +

    + +
    int numDiscarded = 
    +    myEnv.truncate(null,                          // txn handle
    +                   myDatabase.getDatabaseName(),  // database name
    +                   true);                         // If true, then the 
    +                                                  // number of records 
    +                                                  // deleted are counted.
    +System.out.println("Discarded " + numDiscarded +
    +                   " records from database " + 
    +                   myDatabase.getDatabaseName()); 
    +
  • +
+
+
+ + + diff --git a/docs/GettingStartedGuide/DBEntry.html b/docs/GettingStartedGuide/DBEntry.html new file mode 100644 index 0000000..01992c9 --- /dev/null +++ b/docs/GettingStartedGuide/DBEntry.html @@ -0,0 +1,303 @@ + + + + + + Chapter 8. Database Records + + + + + + + + + +
+
+
+
+

Chapter 8. Database Records

+
+
+
+ +

+ JE records contain two parts — a key and some data. Both the key + and its corresponding data are + encapsulated in + DatabaseEntry class objects. + + + Therefore, to access a JE record, you need two such + + objects, one for the key and + one for the data. +

+

+ DatabaseEntry can hold any kind of data from simple + Java primitive types to complex Java objects so long as that data can be + represented as a Java byte array. Note that due to + performance considerations, you should not use Java serialization to convert + a Java object to a byte array. Instead, use the Bind APIs + to perform this conversion (see + Using the BIND APIs for more + information). +

+

+ This chapter describes how you can convert both Java primitives and Java + class objects into and out of byte arrays. It also + introduces storing and retrieving key/value pairs from a database. In + addition, this chapter describes how you can use comparators to influence + how JE sorts its database records. +

+
+
+
+
+

Using Database Records

+
+
+
+

+ Each database record is comprised of two + DatabaseEntry objects + + + — one for the key and another for the data. + + The key and data information are passed to- + and returned from JE using + DatabaseEntry objects as byte + arrays. Using DatabaseEntrys allows JE to + change the underlying byte array as well as return multiple values (that + is, key and data). Therefore, using DatabaseEntry instances + is mostly an exercise in efficiently moving your keys and your data in + and out of byte arrays. +

+

+ For example, to store a database record where both the key and the + data are Java String objects, you instantiate a + pair of DatabaseEntry objects: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseEntry;
+
+...
+
+String aKey = "key";
+String aData = "data";
+
+try {
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+    // Storing the record is described later in this chapter 
+
+

Note

+

+ Notice that we specify UTF-8 when we retrieve the + byte array from our String + object. Without parameters, String.getBytes() uses the + Java system's default encoding. You should never use a system's default + encoding when storing data in a database because the encoding can change. +

+
+

+ When the record is retrieved from the database, the method that you + use to perform this operation populates two DatabaseEntry + instances for you, one for the key and another for the data. Assuming Java + String objects, you retrieve your data from the + DatabaseEntry as follows: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseEntry;
+
+...
+
+// theKey and theData are DatabaseEntry objects. Database
+// retrieval is described later in this chapter. For now, 
+// we assume some database get method has populated these
+// objects for us.
+
+// Use DatabaseEntry.getData() to retrieve the encapsulated Java
+// byte array.
+
+byte[] myKey = theKey.getData();
+byte[] myData = theData.getData();
+
+String key = new String(myKey, "UTF-8");
+String data = new String(myData, "UTF-8"); 
+

+ There are a large number of mechanisms that you can use to move data in + and out of byte arrays. To help you with this + activity, JE provides the bind APIs. These APIs allow you to + efficiently store both primitive data types and complex objects in + byte arrays. +

+

+ The next section describes basic database put and get operations. A + basic understanding of database access is useful when describing database + storage of more complex data such as is supported by the bind APIs. Basic + bind API usage is then described in Using the BIND APIs. +

+ + + +
+
+ + + diff --git a/docs/GettingStartedGuide/DeleteEntryWCursor.html b/docs/GettingStartedGuide/DeleteEntryWCursor.html new file mode 100644 index 0000000..7fe87f2 --- /dev/null +++ b/docs/GettingStartedGuide/DeleteEntryWCursor.html @@ -0,0 +1,122 @@ + + + + + + Deleting Records Using Cursors + + + + + + + + + +
+
+
+
+

Deleting Records Using Cursors

+
+
+
+

+ + To delete a record using a cursor, simply position the cursor to the + record that you want to delete and then call + + + Cursor.delete(). + Note that after deleting a + record, the value of Cursor.getCurrent() + is unchanged until such a + time as the cursor is moved again. Also, if you call + Cursor.delete() two or more times in a row + without repositioning the cursor, then all subsequent deletes result in + a return value of OperationStatus.KEYEMPTY. + + + +

+

For example:

+ +
package je.gettingStarted;
+    
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus; 
+
+...
+
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+    // Create DatabaseEntry objects
+    // searchKey is some String.
+    DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry();
+
+    // Open a cursor using a database handle
+    cursor = myDatabase.openCursor(null, null);
+
+    // Position the cursor. Ignoring the return value for clarity
+    OperationStatus retVal = cursor.getSearchKey(theKey, theData, 
+                                                 LockMode.DEFAULT);
+    
+    // Count the number of records using the given key. If there is only
+    // one, delete that record.
+    if (cursor.count() == 1) {
+            System.out.println("Deleting " + 
+                               new String(theKey.getData(), "UTF-8") +
+                               "|" + 
+                               new String(theData.getData(), "UTF-8"));
+            cursor.delete();
+    }
+} catch (Exception e) {
+    // Exception handling goes here
+} finally {
+   // Make sure to close the cursor
+   cursor.close();
+}
+
+ + + diff --git a/docs/GettingStartedGuide/EnvProps.html b/docs/GettingStartedGuide/EnvProps.html new file mode 100644 index 0000000..c9cbc09 --- /dev/null +++ b/docs/GettingStartedGuide/EnvProps.html @@ -0,0 +1,263 @@ + + + + + + Environment Properties + + + + + + + + + +
+
+
+
+

Environment Properties

+
+
+
+ +

+ You set properties for the Environment using the + EnvironmentConfig class. You can also set properties for a + specific Environment instance using + EnvironmentMutableConfig. +

+
+
+
+
+

The EnvironmentConfig Class

+
+
+
+

+ The EnvironmentConfig class makes a large number of fields and + methods available to you. Describing all of these tuning parameters is beyond the scope of + this manual. However, there are a few properties that you are likely to want to set. They + are described here. +

+

+ Note that for each of the properties that you can commonly set, there is a corresponding + getter method. Also, you can always retrieve the + EnvironmentConfig object used by your environment using the + Environment.getConfig() method. +

+

+ You set environment configuration parameters using the following methods on the + EnvironmentConfig class: +

+
+
    +
  • +

    + EnvironmentConfig.setAllowCreate() +

    +

    + If true, the database environment is created when it is opened. + If false, environment open fails if the environment does not + exist. This property has no meaning if the database environment already exists. + Default is false. +

    +
  • +
  • +

    + EnvironmentConfig.setReadOnly() +

    +

    If true, then all databases opened in this + environment must be opened as read-only. If you are writing a + multi-process application, then all but one of your processes must set + this value to true. Default is false.

    +

    + You can also set this property using the je.env.isReadOnly + parameter in your env_home/je.properties file. +

    +
  • +
  • +

    + EnvironmentConfig.setTransactional() +

    +

    If true, configures the database environment + to support transactions. Default is false.

    +

    + You can also set this property using the je.env.isTransactional + parameter in your env_home/je.properties file. +

    +
  • +
+
+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+     
+...
+
+Environment myDatabaseEnvironment = null;
+try {
+    EnvironmentConfig envConfig = new EnvironmentConfig();
+    envConfig.setAllowCreate(true);
+    envConfig.setTransactional(true);
+    myDatabaseEnvironment = 
+        new Environment(new File("/export/dbEnv"), envConfig);
+} catch (DatabaseException dbe) {
+   System.err.println(dbe.toString());
+   System.exit(1);
+} 
+
+
+
+
+
+

EnvironmentMutableConfig

+
+
+
+

+ EnvironmentMutableConfig manages properties that can be reset after the + Environment object has been constructed. In addition, EnvironmentConfig + extends EnvironmentMutableConfig, so you can set these mutable properties at + Environment construction time if necessary. +

+

+ The EnvironmentMutableConfig class allows you to set the following + properties: +

+
+
    +
  • +

    + setCachePercent() +

    +

    + Determines the percentage of JVM memory available to the JE cache. + See + + Sizing the Cache + for more information. +

    +
  • +
  • +

    + setCacheSize() +

    +

    + Determines the total amount of memory available to the database cache. + See Sizing the Cache + for more information. +

    +
  • +
  • +

    + setTxnNoSync() +

    +

    + Determines whether change records created due to a transaction commit are written to the backing + log files on disk. A value of true causes + the data to not be flushed to + disk. See the Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

    +
  • +
  • +

    + setTxnWriteNoSync() +

    +

    + Determines whether logs are flushed on transaction commit (the logs are still written, however). + By setting this value to true, you potentially gain better performance than if + you flush the logs on commit, but you do so by losing some of your transaction durability guarantees. +

    +
  • +
+
+

+ There is also a corresponding getter method (getTxnNoSync()). + Moreover, you can always retrieve your environment's + EnvironmentMutableConfig object by + using the Environment.getMutableConfig() method. +

+

+ For example: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentMutableConfig;
+
+import java.io.File;
+
+
+...
+
+try {
+    Environment myEnv = new Environment(new File("/export/dbEnv"), null);
+    EnvironmentMutableConfig envMutableConfig = 
+        new EnvironmentMutableConfig();
+    envMutableConfig.setTxnNoSync(true);
+    myEnv.setMutableConfig(envMutableConfig); 
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+} 
+
+
+ + + diff --git a/docs/GettingStartedGuide/Positioning.html b/docs/GettingStartedGuide/Positioning.html new file mode 100644 index 0000000..1741ed9 --- /dev/null +++ b/docs/GettingStartedGuide/Positioning.html @@ -0,0 +1,691 @@ + + + + + + Getting Records Using the Cursor + + + + + + + + + +
+
+
+
+

Getting Records Using the Cursor

+
+
+
+ +

+ To iterate over database records, from the first record to + the last, simply open the cursor and then use the + Cursor.getNext() + + + method. + + For example: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.LockMode;  
+import com.sleepycat.je.OperationStatus; 
+
+...
+
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+
+    // Open the cursor. 
+    cursor = myDatabase.openCursor(null, null);
+
+    // Cursors need a pair of DatabaseEntry objects to operate. These hold
+    // the key and data found at any given position in the database.
+    DatabaseEntry foundKey = new DatabaseEntry();
+    DatabaseEntry foundData = new DatabaseEntry();
+
+    // To iterate, just call getNext() until the last database record has 
+    // been read. All cursor operations return an OperationStatus, so just
+    // read until we no longer see OperationStatus.SUCCESS
+    while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
+        OperationStatus.SUCCESS) {
+        // getData() on the DatabaseEntry objects returns the byte array
+        // held by that object. We use this to get a String value. If the
+        // DatabaseEntry held a byte array representation of some other 
+        // data type (such as a complex object) then this operation would
+        // look considerably different.
+        String keyString = new String(foundKey.getData(), "UTF-8");
+        String dataString = new String(foundData.getData(), "UTF-8");
+        System.out.println("Key | Data : " + keyString + " | " + 
+                       dataString + "");
+    }
+} catch (DatabaseException de) {
+    System.err.println("Error accessing database." + de);
+} finally {
+    // Cursors must be closed.
+    cursor.close();
+}
+

+ To iterate over the database from the last record to the first, + instantiate the cursor, and then + use Cursor.getPrev() until you read the first record in + the database. For example: +

+ +
package je.gettingStarted;
+    
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.LockMode;  
+import com.sleepycat.je.OperationStatus; 
+
+...
+
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+
+    // Open the cursor. 
+    cursor = myDatabase.openCursor(null, null);
+
+    // Get the DatabaseEntry objects that the cursor will use.
+    DatabaseEntry foundKey = new DatabaseEntry();
+    DatabaseEntry foundData = new DatabaseEntry();
+
+    // Iterate from the last record to the first in the database
+    while (cursor.getPrev(foundKey, foundData, LockMode.DEFAULT) == 
+        OperationStatus.SUCCESS) {
+
+        String theKey = new String(foundKey.getData(), "UTF-8");
+        String theData = new String(foundData.getData(), "UTF-8");
+        System.out.println("Key | Data : " +  theKey + " | " + 
+                           theData + "");
+    }
+} catch (DatabaseException de) {
+    System.err.println("Error accessing database." + de);
+} finally {
+    // Cursors must be closed.
+    cursor.close();
+}
+
+
+
+
+

Disk Ordered Cursors

+
+
+
+

+ The previous example shows how to scan through the records in + your database sequentially; that is, in the record's sort order. + This is mostly determined by the value contained in the records' keys + (additional sorting is required in the case of duplicate + records). However, you can use cursors to retrieve records based + on how they are stored on disk. This can improve retrieval times, + and is useful if your application needs to scan all the records + in the database quickly, without concern for key sort order. + You do this using the DiskOrderedCursor + class. +

+

+ DiskOrderedClass works in the same way as + a regular cusor: you simply open the cursor, then retrieve + records one after another using the + DiskOrderedClass.getNext() + method. +

+

+ You open a DiskOrderedCursor + using the Database.openCursor() + method. This version of the method takes a single parameter: an + instance of the + DiskOrderedCursorConfig + class, which can be used to configure various aspects of the + DiskOrderedCursor + class. +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.DiskOrderedCursor;
+import com.sleepycat.je.DiskOrderedCursorConfig;
+import com.sleepycat.je.LockMode;  
+import com.sleepycat.je.OperationStatus; 
+
+...
+
+DiskOrderedCursor dcursor = null;
+DiskOrderedCursorConfig docc = new DiskOrderedCursorConfig();
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+
+    // Open the cursor. 
+    dcursor = myDatabase.openCursor(docc);
+
+    // Cursors need a pair of DatabaseEntry objects to operate. These hold
+    // the key and data found at any given position in the database.
+    DatabaseEntry foundKey = new DatabaseEntry();
+    DatabaseEntry foundData = new DatabaseEntry();
+
+    // To iterate, just call getNext() until the last database record has 
+    // been read. All cursor operations return an OperationStatus, so just
+    // read until we no longer see OperationStatus.SUCCESS
+    while (dcursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
+        OperationStatus.SUCCESS) {
+        // getData() on the DatabaseEntry objects returns the byte array
+        // held by that object. We use this to get a String value. If the
+        // DatabaseEntry held a byte array representation of some other 
+        // data type (such as a complex object) then this operation would
+        // look considerably different.
+        String keyString = new String(foundKey.getData(), "UTF-8");
+        String dataString = new String(foundData.getData(), "UTF-8");
+        System.out.println("Key | Data : " + keyString + " | " + 
+                       dataString + "");
+    }
+} catch (DatabaseException de) {
+    System.err.println("Error accessing database." + de);
+} finally {
+    // Cursors must be closed.
+    cursor.close();
+}
+
+
+
+
+
+

Searching for Records

+
+
+
+

+ You can use cursors to search for database records. You can search based + on just a key, or you can search based on both the key and the data. + You can also perform partial matches if your database supports sorted + duplicate sets. In all cases, the key and data parameters of these + methods are filled with the key and data values of the database record + to which the cursor is positioned as a result of the search. +

+

+ Also, if the search fails, then cursor's state is left unchanged + and + OperationStatus.NOTFOUND + + is returned. + + +

+

+ The following Cursor methods allow you to + perform database searches: +

+
+
    +
  • +

    + Cursor.getSearchKey() + +

    +

    + Moves the cursor to the first record in the database with + the specified key. +

    +
  • +
  • +

    + Cursor.getSearchKeyRange() + +

    +

    + + Moves the cursor + + to the first record in the database whose + key is greater than or equal to the specified key. This comparison + is determined by the + comparator + + that you provide for the database. If no + comparator + + is provided, then the default + unsigned byte-by-byte + lexicographical sorting is used. +

    +

    + For example, suppose you have database records that use the + following + Strings + + as keys: +

    +
    Alabama
    +Alaska
    +Arizona
    +

    + Then providing a search key of Alaska moves the + cursor to the second key noted above. Providing a key of + Al moves the cursor to the first key (Alabama), providing + a search key of Alas moves the cursor to the second key + (Alaska), and providing a key of Ar moves the + cursor to the last key (Arizona). +

    +
  • +
  • +

    + Cursor.getSearchBoth() + +

    +

    + Moves the cursor to the first record in the database that uses + the specified key and data. +

    +
  • +
  • +

    + Cursor.getSearchBothRange() + +

    +

    + Moves the cursor to the first record in the database whose key matches the specified + key and whose data is + greater than or equal to the specified data. If the database supports + duplicate records, then on matching the key, the cursor is moved to + the duplicate record with the smallest data that is greater than or + equal to the specified data. +

    +

    + For example, + suppose you have + + database records that use the following key/data pairs: +

    +
    Alabama/Athens
    +Alabama/Florence
    +Alaska/Anchorage
    +Alaska/Fairbanks
    +Arizona/Avondale
    +Arizona/Florence 
    +

    then providing:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a search key of ...and a search data of ...moves the cursor to ...
    AlaskaFaAlaska/Fairbanks
    ArizonaFlArizona/Florence
    AlaskaAnAlaska/Anchorage
    +
    +
  • +
+
+

+ For example, assuming a database containing sorted duplicate records of + U.S. States/U.S Cities key/data pairs (both as + Strings), + + then the following code fragment can be used to position the cursor + to any record in the database and print its key/data values: + + + +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus; 
+
+...
+  
+// For this example, hard code the search key and data
+String searchKey = "Alaska";
+String searchData = "Fa";
+
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+
+    // Open the cursor. 
+    cursor = myDatabase.openCursor(null, null);
+
+    DatabaseEntry theKey = 
+         new DatabaseEntry(searchKey.getBytes("UTF-8"));
+    DatabaseEntry theData = 
+         new DatabaseEntry(searchData.getBytes("UTF-8"));
+
+    // Open a cursor using a database handle
+    cursor = myDatabase.openCursor(null, null);
+
+    // Perform the search
+    OperationStatus retVal = cursor.getSearchBothRange(theKey, theData, 
+                                                       LockMode.DEFAULT);
+    // NOTFOUND is returned if a record cannot be found whose key 
+    // matches the search key AND whose data begins with the search data.
+    if (retVal == OperationStatus.NOTFOUND) {
+        System.out.println(searchKey + "/" + searchData + 
+                           " not matched in database " + 
+                           myDatabase.getDatabaseName());
+    } else {
+        // Upon completing a search, the key and data DatabaseEntry 
+        // parameters for getSearchBothRange() are populated with the 
+        // key/data values of the found record.
+        String foundKey = new String(theKey.getData(), "UTF-8");
+        String foundData = new String(theData.getData(), "UTF-8");
+        System.out.println("Found record " + foundKey + "/" + foundData + 
+                           "for search key/data: " + searchKey + 
+                           "/" + searchData);
+    }
+
+} catch (Exception e) {
+    // Exception handling goes here
+} finally {
+   // Make sure to close the cursor
+   cursor.close();
+}
+
+
+
+
+
+

Working with Duplicate Records

+
+
+
+

+ If your database supports duplicate records, then it can potentially + contain multiple records that share the same key. + + + Using normal database get operations, you can only ever obtain the + first such record in a set of duplicate records. To access subsequent + duplicates, use a cursor. + + + + + The following + Cursor methods + + + are interesting when working with databases that support duplicate records: +

+
+
    +
  • +

    + + Cursor.getNext(), + Cursor.getPrev() + + +

    +

    + Shows the next/previous record in the database, regardless of + whether it is a duplicate of the current record. For an example of + using these methods, see Getting Records Using the Cursor. +

    +
  • +
  • +

    + Cursor.getSearchBothRange() + +

    +

    + Useful for seeking the cursor to a specific record, regardless of + whether it is a duplicate record. See Searching for Records for more + information. +

    +
  • +
  • +

    + + Cursor.getNextNoDup(), + Cursor.getPrevNoDup() + + +

    +

    + Gets the next/previous non-duplicate record in the database. This + allows you to skip over all the duplicates in a set of duplicate + records. If you call + Cursor.getPrevNoDup(), + + then the cursor is positioned to the last record for the previous + key in the database. For example, if you have the following records + in your database: +

    +
    Alabama/Athens
    +Alabama/Florence
    +Alaska/Anchorage
    +Alaska/Fairbanks
    +Arizona/Avondale
    +Arizona/Florence
    +

    + and your cursor is positioned to Alaska/Fairbanks, + and you then call + Cursor.getPrevNoDup(), + + then the cursor is positioned to Alabama/Florence. Similarly, if + you call + Cursor.getNextNoDup(), + + + then the cursor is positioned to the first record corresponding to + the next key in the database. +

    +

    + If there is no next/previous key in the database, then + OperationStatus.NOTFOUND + + is returned, and the cursor is left unchanged. +

    +
  • +
  • +

    + + Cursor.getNextDup(), + Cursor.getPrevDup() + + +

    +

    + + Gets the + next/previous + + record that shares the current key. If the + cursor is positioned at the last record in the duplicate set and + you call + Cursor.getNextDup(), + + + then + OperationStatus.NOTFOUND + + is returned and the cursor is left unchanged. + + Likewise, if you call + getPrevDup() and the + cursor is positioned at the first record in the duplicate set, then + OperationStatus.NOTFOUND is returned and the + cursor is left unchanged. + +

    +
  • +
  • +

    + Cursor.count() +

    +

    Returns the total number of records that share the current key.

    +
  • +
+
+

+ For example, the following code fragment positions a cursor to a key + + and, if the key contains duplicate records, + displays all the duplicates. + + + + Note that the following code fragment assumes that the database contains + only String objects for the keys and data. +

+ +
package je.gettingStarted;
+      
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus; 
+
+...
+  
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+
+    // Create DatabaseEntry objects
+    // searchKey is some String.
+    DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry();
+
+    // Open a cursor using a database handle
+    cursor = myDatabase.openCursor(null, null);
+
+    // Position the cursor
+    // Ignoring the return value for clarity
+    OperationStatus retVal = cursor.getSearchKey(theKey, theData, 
+                                                 LockMode.DEFAULT);
+    
+    // Count the number of duplicates. If the count is greater than 1, 
+    // print the duplicates.
+    if (cursor.count() > 1) {
+        while (retVal == OperationStatus.SUCCESS) {
+            String keyString = new String(theKey.getData(), "UTF-8");
+            String dataString = new String(theData.getData(), "UTF-8");
+            System.out.println("Key | Data : " +  keyString + " | " + 
+                               dataString + "");
+   
+            retVal = cursor.getNextDup(theKey, theData, LockMode.DEFAULT);
+        }
+    }
+} catch (Exception e) {
+    // Exception handling goes here
+} finally {
+   // Make sure to close the cursor
+   cursor.close();
+}
+
+
+ + + diff --git a/docs/GettingStartedGuide/PutEntryWCursor.html b/docs/GettingStartedGuide/PutEntryWCursor.html new file mode 100644 index 0000000..d7af94b --- /dev/null +++ b/docs/GettingStartedGuide/PutEntryWCursor.html @@ -0,0 +1,186 @@ + + + + + + Putting Records Using Cursors + + + + + + + + + +
+
+
+
+

Putting Records Using Cursors

+
+
+
+

+ You can use cursors to put records into the database. JE's behavior + when putting records into the database differs depending on whether the + database supports duplicate records. If duplicates are allowed, its + behavior also differs depending on whether a comparator is provided for + the database. (Comparators are described in + Using Comparators). +

+

+ Note that when putting records to the database using a cursor, the + cursor is positioned at the record you inserted. +

+

+ You can use the following methods to put records to the database: +

+
+
    +
  • +

    + Cursor.put() +

    +

    + If the provided key does not exist in the database, + then the order that the record is put into the database + is determined by the BTree (key) comparator in use by the database. +

    +

    + If the provided key already exists in the database, and the database + does not support sorted duplicates, then the existing record data is + replaced with the data provided on this method. +

    +

    + If the provided key already exists in the database, and the database + does support sorted duplicates, then the order that the record is + inserted into the database is determined by the duplicate comparator + in use by the database. +

    +

    + Note that a version of this method exists which allows you to + specify a Time to Live value for the record that you are + inserting. See Using Time to Live + for more information. +

    +
  • +
  • +

    + Cursor.putNoDupData() + +

    +

    + If the provided key and data already exists + in the database, then this method returns + OperationStatus.KEYEXIST. +

    +

    + If the key does not exist, then the order that the record is put into the database + is determined by the + + BTree (key) comparator in use by the database. + + +

    + +
  • +
  • +

    + Cursor.putNoOverwrite() +

    +

    + If the provided key already exists + in the database, then this method returns + OperationStatus.KEYEXIST. +

    +

    + If the key does not exist, then the order that the record is put into the database + is determined by the BTree (key) comparator in use by the database. +

    +
  • +
+
+

For example:

+ +
package je.gettingStarted;
+    
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.OperationStatus; 
+
+...
+  
+// Create the data to put into the database
+String key1str = "My first string";
+String data1str = "My first data";
+String key2str = "My second string";
+String data2str = "My second data";
+String data3str = "My third data";
+  
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+
+    DatabaseEntry key1 = new DatabaseEntry(key1str.getBytes("UTF-8"));
+    DatabaseEntry data1 = new DatabaseEntry(data1str.getBytes("UTF-8"));
+    DatabaseEntry key2 = new DatabaseEntry(key2str.getBytes("UTF-8"));
+    DatabaseEntry data2 = new DatabaseEntry(data2str.getBytes("UTF-8"));
+    DatabaseEntry data3 = new DatabaseEntry(data3str.getBytes("UTF-8"));
+
+    // Open a cursor using a database handle
+    cursor = myDatabase.openCursor(null, null);
+
+    // Assuming an empty database.
+
+    OperationStatus retVal = cursor.put(key1, data1); // SUCCESS
+    retVal = cursor.put(key2, data2); // SUCCESS
+    retVal = cursor.put(key2, data3); // SUCCESS if dups allowed, 
+                                      // KEYEXIST if not.    
+                                              
+} catch (Exception e) {
+    // Exception handling goes here
+} finally {
+   // Make sure to close the cursor
+   cursor.close();
+}
+
+ + + diff --git a/docs/GettingStartedGuide/ReplacingEntryWCursor.html b/docs/GettingStartedGuide/ReplacingEntryWCursor.html new file mode 100644 index 0000000..b55061d --- /dev/null +++ b/docs/GettingStartedGuide/ReplacingEntryWCursor.html @@ -0,0 +1,123 @@ + + + + + + Replacing Records Using Cursors + + + + + + + + + +
+
+
+
+

Replacing Records Using Cursors

+
+
+
+

+ You replace the data for a database record by using + + Cursor.putCurrent(). + This method takes just one + argument — the data that you want to write to the current location in the + database. + + + + + + +

+ +
import com.sleepycat.je.Cursor;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus; 
+
+...
+Cursor cursor = null;
+try {
+    ...
+    // Database and environment open omitted for brevity
+    ...
+    // Create DatabaseEntry objects
+    // searchKey is some String.
+    DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry();
+
+    // Open a cursor using a database handle
+    cursor = myDatabase.openCursor(null, null);
+
+    // Position the cursor. Ignoring the return value for clarity
+    OperationStatus retVal = cursor.getSearchKey(theKey, theData, 
+                                                LockMode.DEFAULT);
+    
+    // Replacement data
+    String replaceStr = "My replacement string";
+    DatabaseEntry replacementData = 
+        new DatabaseEntry(replaceStr.getBytes("UTF-8"));
+    cursor.putCurrent(replacementData);
+} catch (Exception e) {
+    // Exception handling goes here
+} finally {
+   // Make sure to close the cursor
+   cursor.close();
+}
+

+ Note that this method cannot be used if the record that you are trying + to replace is a member of a duplicate set. This is because records must + be sorted by their data and replacement would violate that sort order. +

+

+ + If + you want to replace the data contained by a duplicate record, + + delete the record and create a new record with the desired key and data. +

+
+ + + diff --git a/docs/GettingStartedGuide/admin.html b/docs/GettingStartedGuide/admin.html new file mode 100644 index 0000000..60c0ad0 --- /dev/null +++ b/docs/GettingStartedGuide/admin.html @@ -0,0 +1,237 @@ + + + + + + Part III. Administering JE Applications + + + + + + + + + +
+
+
+
+

Part III. Administering JE Applications

+
+
+
+
+
+

+ This section discusses concepts and mechanisms + useful for the administration of any JE + application, regardless of the API used to build + that application. +

+ +
+
+ + + diff --git a/docs/GettingStartedGuide/administration.html b/docs/GettingStartedGuide/administration.html new file mode 100644 index 0000000..63aff79 --- /dev/null +++ b/docs/GettingStartedGuide/administration.html @@ -0,0 +1,181 @@ + + + + + + Chapter 12. Administering Berkeley DB Java Edition Applications + + + + + + + + + +
+
+
+
+

Chapter 12. Administering Berkeley DB Java Edition Applications

+
+
+
+
+

+ Table of Contents +

+
+
+ + The JE Properties File + +
+
+ + Managing the Background Threads + +
+
+
+
+ + The Cleaner Thread + +
+
+ + The Checkpointer Thread + +
+
+
+
+ + Sizing the Cache + +
+
+ + Setting Disk Thresholds + +
+
+ + The Command Line Tools + +
+
+
+
+ + DbDump + +
+
+ + DbLoad + +
+
+ + DbVerify + +
+
+
+
+ + Logging + +
+
+
+
+ + Managing Logging Levels + +
+
+ + Managing Handler Levels + +
+
+
+
+
+

+ There are a series of tools and parameters of interest to the + administrator of a Berkeley DB Java Edition database. + These tools and parameters are useful for tuning your + JE database's behavior once it is in a production + setting, and they are described here. This chapter, however, does not describe backing up and restoring your + JE databases. See + Backing up and Restoring Berkeley DB Java Edition Applications for information on how to perform those procedures. +

+
+
+
+
+

The JE Properties File

+
+
+
+

+ JE applications can be controlled through a + Java properties file. This file must be placed in your environment home directory and it must be named + je.properties. +

+

+ The parameters set in this file take precedence over the configuration behavior coded into the + JE application by your application developers. +

+

+ Usually you will use this file to control the behavior of JE's background threads, and to control the size of your + in-memory cache. These topics, and the properties parameters related to them, are described in this chapter. + Beyond the properties described here, there are other properties identified throughout this manual that may be + of interest to you. However, the definitive identification of all + the property parameters available to you is described in the javadoc for the + EnvironmentConfig class. Each property has a + String constant in EnvironmentConfig that + describes its meaning, default value, and so forth. +

+
+
+ + + diff --git a/docs/GettingStartedGuide/applicationoverview.html b/docs/GettingStartedGuide/applicationoverview.html new file mode 100644 index 0000000..f5347bb --- /dev/null +++ b/docs/GettingStartedGuide/applicationoverview.html @@ -0,0 +1,628 @@ + + + + + + The JE Application + + + + + + + + + +
+
+
+
+

The JE Application

+
+
+
+ +

This section provides a brief overview to the major concepts and + operations that comprise a JE application. This section is concluded with a summary of the decisions that + you need to make when working with JE.

+

+ Note that the core JE classes are all contained in the com.sleepycat.je package. + In addition, this book describes some classes that are found in com.sleepycat.je.bind. + The bind APIs are used for converting Java objects in and out of byte arrays. +

+
+
+
+
+

Database Environments

+
+
+
+

+ Regardless of the JE API that you use, your data is + stored in databases. If you use the DPL, you do not manage + these databases directly; rather, they are managed for you by + the API. On the other hand, if you use the lower-level JE + APIs, then you must manage databases directly. This is not + difficult to do as it mostly involves opening and closing the + databases, giving them names, and so forth. See + Databases + for more + information. +

+

+ That said, JE always requires you to use a + database environment. Database + environments provide an unit of encapsulation for one or more + databases. Environments correspond to a directory location on + disk, and in them you will find all the files in use by JE. + Environments are also used to manage JE resources such as + transactions. +

+

+ To use a database environment, it must first be created and then + opened. In order to create a database environment, the + directory location in which it resides must already exist. +

+

+ You open a database environment by instantiating an + Environment object. Your + Environment instance is called + an environment handle. +

+

+ + Once you have opened an environment, what you do with it + depends on the nature of your application; that is, the + JE API you are using and whether you are using advanced + features such as transactions. (See + Berkeley DB, Java Edition Getting Started with Transaction Processing + for details on using + transactions). However, at a minimum you will always have to + open your environment before you can access your data stored + in JE. Also, before you end your application you should + always close your environment. +

+

+ Environments are described in greater detail in Database Environments. +

+
+
+
+
+
+

Key-Data Pairs

+
+
+
+

+ JE stores and retrieves data using + key-data pairs. The + data portion of this is the data + that you have decided to store in JE for future + retrieval. The key is the + information that you want to use to look up your + stored data once it has been placed inside a JE + database. +

+

+ For example, if you were building a database that + contained employee information, then the + data portion is all of the + information that you want to store about the employees: + name, address, phone numbers, physical location, their + manager, and so forth. +

+

+ The key, however, is the way that + you look up any given employee. You can have more than + one key if you wish, but every record in your database must have a + primary key. If you are using the DPL, then this key must be unique; that is, + it must not be used multiple times in the database. However, if you are using + the base API, then this requirement is relaxed. See + Duplicate Data for more + information. +

+

+ For example, in the case of an employee database, you would probably use + something like the employee identification number as the primary key as this + uniquely identifies a given employee. +

+

+ You can optionally also have secondary keys that represent indexes + into your database. These keys do not have to be unique + to a given record; in fact, they often are not. For + example, you might set up the employee's manager's name + as a secondary key so that it is easy to locate all + the employee's that work for a given manager. +

+
+
+
+
+
+

Storing Data

+
+
+
+

+ How you manage your stored information differs + significantly, depending on which API you are using. + Both APIs ultimately are doing the same thing, but the + DPL hides a lot of the details from you. +

+
+
+
+
+

Storing Data in the DPL

+
+
+
+

+ The DPL is used to store Java objects in an + underlying series of databases. These databases are + accessed using an EntityStore + class object. +

+

+ To use the DPL, you must decorate the classes you + want to store with Java annotations that identify them + as either an entity class or a + persistent class. +

+

+ Entity classes are classes that have a primary key, and + optionally one or more secondary keys. That is, these + are the classes that you will save and retrieve directly + using the DPL. You identify an entity class using the + @Entity java annotation. +

+

+ Persistent classes are classes used by entity classes. + They do not have primary or secondary indices used for + object retrieval. Rather, they are stored or retrieved + when an entity class makes direct use of them. You + identify an persistent class using the + @Persistent java annotation. +

+

+ The primary key for an object is obtained from one of the class' data members. + You identify which data member to use as the primary key using the + @PrimaryKey java annotation. +

+

+ Note that all non-transient instance fields of a + persistent class, as well as its superclasses and + subclasses, are persistent. Static and transient fields + are not persistent. The persistent fields of a class + may be private, package-private (default access), + protected or public. +

+

+ + Also, simple Java types, such as + java.lang.String and + java.util.Date, are automatically handled as a + persistent class when you use them in an entity class; + you do not have to do anything special to cause these + simple Java objects to be stored in the + EntityStore. + +

+
+
+
+
+
+

Storing Data using the Base API

+
+
+
+

+ When you are not using the DPL, both record keys and record data must be byte + arrays and are passed to and returned from JE using + DatabaseEntry instances. + DatabaseEntry only supports storage of Java byte arrays. + Complex objects must be marshaled using either Java serialization, or more + efficiently with the bind APIs provided with JE

+

Database + records and byte array conversion are described in Database Records. +

+

+ You store records in a Database by calling one of the + put methods on a Database handle. JE + automatically determines the record's proper placement in the database's + internal B-Tree using whatever key and data comparison functions that are + available to it. +

+

+ You can also retrieve, or get, records using the + Database handle. Gets are performed by providing the + key (and sometimes also the data) of the record that you want to retrieve. +

+

+ You can also use cursors for database puts and gets. Cursors are essentially + a mechanism by which you can iterate over the records in the database. Like + databases and database environments, cursors must be opened and closed. + Cursors are managed using the Cursor class. +

+

+ Databases are described in Databases. Cursors + are described in Using Cursors. +

+
+
+
+
+
+
+

Duplicate Data

+
+
+
+

+ If you are using the base API, then at creation time databases can be configured to + allow duplicate data. Remember that JE database records consist of a key/data + pair. Duplicate data, then, occurs when two or more records have + identical keys, but different data. By default, a Database does + not allow duplicate data. +

+

+ If your Database contains duplicate data, then a simple + database get based only on a key returns just the first record that uses that key. To + access all duplicate records for that key, you must use a cursor. +

+

+ If you are using the DPL, then you can duplicate date using + secondary keys, but not by using the primary key. For more information, see + Retrieving Multiple Objects. +

+
+
+
+
+
+

Replacing and Deleting Entries

+
+
+
+

+ If you are using the DPL, then replacing a stored entity object simply consists of + retrieving it, updating it, then storing it again. To delete the object, use the + delete() method that is available on either its primary or + secondary keys. If you use the delete() method available on + the secondary key, then all objects referenced by that key are also deleted. + See Deleting Entity Objects + for more information. +

+

+ If you are using the base API, then how you replace database records depends on whether + duplicate data is allowed in the database. +

+

+ If duplicate data is not allowed in the database, then simply calling + Database.put() with the appropriate key will cause any + existing record to be updated with the new data. Similarly, you can delete a record by + providing the appropriate key to the Database.delete() + method. +

+

+ If duplicate data is allowed in the database, then you must position a cursor to the + record that you want to update, and then perform the put operation using the cursor. +

+

+ To delete records using the base API, you can use either Database.delete() or + Cursor.delete(). If duplicate data is not allowed in your + database, then these two method behave identically. However, if duplicates are allowed + in the database, then Database.delete() deletes every record + that uses the provided key, while Cursor.delete() deletes just + the record at which the cursor is currently positioned. +

+
+
+
+
+
+

Secondary Keys

+
+
+
+

+ Secondary keys provide an alternative way to locate information stored in + JE, beyond that which is provided by the primary key. Frequently secondary + keys refer to more than one record in the database. In this way, you can find + all the cars that are green (if you are maintaining an automotive database) or + all the people with brown eyes (if you are maintaining a database about people). + In other words, secondary keys represent a index into your data. +

+

+ How you create and maintain secondary keys differs significantly, depending on + whether you are using the DPL or the base API. +

+
+
+
+
+

Using Secondaries with the DPL

+
+
+
+

+ Under the DPL, you declare a particular field to be a secondary key by + using the @SecondaryKey annotation. When you do this, + you must declare what kind of an index you are creating. For example, + you can declare a secondary key to be part of a + ONE_TO_ONE index, in which case the key is unique to + the object. Or you could declare the key to be + MANY_TO_ONE, in which case the key can be used for + multiple objects in the data store. +

+

+ Once you have identified secondary keys for a class, you can access + those keys by using the EntityStore.getSecondaryIndex() + method. +

+

+ For more information, see Declaring Secondary Indexes. +

+
+
+
+
+
+

Using Secondaries with the Base API.

+
+
+
+

+ When you are using the base API, you create and maintain secondary keys using a + special type of a database, called a secondary database. + When you are using secondary databases, the database that holds the data you are + indexing is called the primary database. +

+

+ You create a secondary database by opening it and associating it with an + existing primary database. You must also provide a class that generates the + secondary's keys (that is, the index) from primary records. Whenever a + record in the primary database is added or changed, JE uses this class + to determine what the secondary key should be. +

+

+ When a primary record is created, modified, or deleted, JE automatically + updates the secondary database(s) for you as is appropriate for the + operation performed on the primary. +

+

+ You manage secondary databases using the + SecondaryDatabase class. You identify how to create keys + for your secondary databases by supplying an instance of a class that implements + the SecondaryKeyCreator interface. +

+

+ Secondary databases are described in Secondary Databases. +

+
+
+
+
+
+
+

Transactions

+
+
+
+

+ Transactions provide a high level of safety for your JE operations by allowing + you to manage one or more operations as if they were a single unit of work. + Transactions provide your JE operations with recoverability, atomicity, and + isolation. +

+

+ Transactions provide recoverability by allowing JE to undo any + transactional-protected operations that may have been in progress at the time of an + application or system failure. +

+

+ Transactions provide atomicity by allowing you to group many operations into + a single unit of work. Either all operations succeed or none of them do. This means + that if one write operation fails for any reason, then all other writes contained + within that transaction also fail. This ensures that the database is never partially + updated as the result of an only partially successful chain of read/write operations. +

+

+ Transactions provide isolation by ensuring that the transaction will never write to a + record that is currently in use (for either read or write) by another transaction. + Similarly, any record to which the transaction has written can not be read outside of + the transaction until the transaction ends. Note that this is only the default + behavior; you can configure your Database, + Cursor, or Transaction handle to relax + its isolation guarantees. +

+

+ Essentially, transactional isolation provides a transaction with the same unmodified view of the + database that it would have received had the operations been performed in a single-threaded application. +

+

+ Transactions may be long or short lived, they can encompass as many + operations as you want, and (if using the base API) they can span databases + so long as all participating databases reside in the same environment. +

+

+ Transaction usage results in a performance penalty for the application because they + generally require more disk I/O than do non-transactional operations. Therefore, while + most applications will use transactions for JE writes, their usage is optional. + In particular, processes that are performing read-only operations + might not use transactions. Also, applications that use JE for an easily + recreated cache might also choose to avoid transactions. +

+

+ Using transactions with your JE applications is described in detail in the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

+
+
+
+
+
+

JE Resources

+
+
+
+

+ JE has some internal resources that you may want to manage. Most important of these is the in-memory cache. + You should carefully consider how large the JE cache needs to be. If you set this number too low, JE will + perform potentially unnecessary disk I/O which will result in a performance hit. If you set it too high, then + you are potentially wasting RAM that could be put to better purposes. +

+

+ Note that the size that you configure for the in-memory cache is a maximum size. At application startup, the + cache starts out fairly small (only about 7% of the maximum allowed size for the cache). It then grows as is + required by your application's database operations. Also, the cache is not pinned in memory – it can be + paged out by your operating system's virtual memory system. +

+

+ Beyond the cache, JE uses several background threads to clean + the JE log files, to compress the database by removing unneeded + subtrees, and to flush database changes seen in the cache to the backing data files. For the + majority of JE applications, the default behavior for the background threads should be acceptable and you + will not need to manage their behavior. Note that background threads are started no more than once per + process upon environment open. +

+

+ For more information on sizing the cache and on the background threads, see Administering Berkeley DB Java Edition Applications. +

+
+
+
+
+
+

+ Application Considerations +

+
+
+
+

When building your JE application, be sure to think about the following things:

+
+
    +
  • +

    What data do you want to store? What is best used for the + primary key? What is the best representation for primary record data? + If you are using the base API, think about the most efficient way to move your keys and data in and + out of byte arrays. See Database Records for more information.

    +
  • +
  • +

    Does the nature of your data require duplicate record support? + Remember that duplicate support can be configured only if you are using the base + API, and then only at database + creation time. See Opening Databases for more information.

    +

    If you are supporting duplicate records, you may also need to think + about duplicate comparators (not just key comparators). See + Using Comparators for more information.

    +
  • +
  • +

    What secondary indexes do you need? How can you compute your secondary indexes based on the data and + keys stored in your primary database? + Indexes are described in Secondary Databases.

    +
  • +
  • +

    What cache size do you need? See + Sizing the Cache for information on how to size your cache.

    +
  • +
  • +

    Does your application require transactions (most will). + Transactions are described in the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

    +
  • +
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/backgroundthreads.html b/docs/GettingStartedGuide/backgroundthreads.html new file mode 100644 index 0000000..8759981 --- /dev/null +++ b/docs/GettingStartedGuide/backgroundthreads.html @@ -0,0 +1,187 @@ + + + + + + Managing the Background Threads + + + + + + + + + +
+
+
+
+

Managing the Background Threads

+
+
+
+
+
+
+ + The Cleaner Thread + +
+
+ + The Checkpointer Thread + +
+
+
+

+ JE uses some background threads to keep your database resources within pre-configured limits. If they are + going to run, the background threads are started once per application per process. That is, if your application + opens the same environment multiple times, the background threads will be started just once for that process. + See the following list for the default conditions that gate whether an individual thread is run. Note that you + can prevent a background thread from running by using the appropriate je.properties + parameter, but this is not recommended for production use and those parameters are not described here. +

+

+ The background threads are: +

+
+
    +
  • +

    + Cleaner thread. +

    +

    + Responsible for cleaning and deleting unused log files. See The Cleaner Thread for more information. +

    +

    + This thread is run only if the environment is opened for write access. +

    +
  • +
  • +

    + Compressor thread. +

    +

    + Responsible for cleaning up the internal BTree as database records are deleted. The compressor thread + ensures that the BTree does not contain unused nodes. There is no need for you to manage the + compressor and so it is not described further in this manual. +

    +

    + This thread is run only if the environment is opened for write access. +

    +
  • +
  • +

    + Checkpointer thread. +

    +

    + Responsible for running checkpoints on your environment. See + The Checkpointer Thread for more information. +

    +

    + This thread always runs. +

    +
  • +
+
+
+
+
+
+

The Cleaner Thread

+
+
+
+

+ The cleaner thread is responsible for cleaning, or compacting, your log files for you. + Log file cleaning is described in Cleaning the Log Files. +

+

+ The following two properties may be of interest to you when managing the cleaner thread: +

+
+
    +
  • +

    + je.cleaner.minUtilization +

    +

    + Identifies the percentage of the log file space that must be used for utilized records. If the + percentage of log file space used by utilized records is too low, then the cleaner removes + obsolete records until this threshold is reached. Default is 50%. +

    +
  • +
  • +

    + je.cleaner.expunge +

    +

    + Identifies the cleaner's behavior in the event that it is able to remove a log file. If + true, the log files that have been cleaned are deleted from the file system. If + false, the log files that have been cleaned are renamed from + NNNNNNNN.jdb to NNNNNNNN.del. You are then responsible for + deleting the renamed files. + +

    +
  • +
+
+

+ Note that the cleaner thread runs only if the environment is opened for write access. Also, be aware that + the cleaner is not guaranteed to finish running before the environment is closed, which can result in + unexpectedly large log files. See + Closing Database Environments for more information. +

+
+
+
+
+
+

The Checkpointer Thread

+
+
+
+

+ Automatically runs checkpoints. Checkpoints and the administration of this thread are described in + the Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

+
+
+ + + diff --git a/docs/GettingStartedGuide/backup.html b/docs/GettingStartedGuide/backup.html new file mode 100644 index 0000000..fe21ef7 --- /dev/null +++ b/docs/GettingStartedGuide/backup.html @@ -0,0 +1,291 @@ + + + + + + Performing Backups + + + + + + + + + +
+
+
+
+

Performing Backups

+
+
+
+ +

+ This section describes how to backup your JE database(s) such that catastrophic recovery is possible for + non-transactional applications. Note that this same material is repeated in the + Berkeley DB, Java Edition Getting Started with Transaction Processing + guide, but for transactional applications. If you are writing transactional + applications, you may want to skip the rest of this chapter and go straight to that book. +

+

+ To backup your database, you can either take a hot backup or an offline backup. A hot + backup is performed while database write operations are in progress. +

+

+ Do not confuse hot and offline backups with the concept of a full and incremental backup. Both a + hot and an offline backup are full backups – you back up the entire database. The only difference + between them is how much of the contents of the in-memory cache are contained in them. On the other hand, + an incremental backup is a backup of just those log files modified or created since the time of the last + backup. Most backup software + is capable of performing both full and incremental backups for you. +

+
+
+
+
+

Performing a Hot Backup

+
+
+
+

+ To perform a hot backup of your JE databases, copy all log files + (*.jdb files) from your environment directory to + your archival location or backup media. The files must be copied + in alphabetical order (numerical in effect). You do not have to + stop any database operations in order to do this. +

+
+

Note

+

+ If you are using subdirectories to store your log files, then you must backup + the subdirectories, making sure to keep log files in the subdirectory in which + JE placed them. For information on using subdirectories to store your log + files, see Multiple Environment Subdirectories. +

+
+

+ To make this process a bit easier, you may want to make use of the + DbBackup helper class. See + Using the DbBackup Helper Class + for details. +

+

+ Note that any modifications made to the database since the time of the last + environment sync are not guaranteed to be contained in these log files. In this + case, you may want to consider running an offline backup in order to guarantee the + availability of all modifications made to your database. +

+
+
+
+
+
+

Performing an Offline Backup

+
+
+
+

+ An offline backup guarantees that you have captured the database in its entirety, including all contents + of your in-memory cache, at the moment that the + backup was taken. To do this, you must make sure that no write operations are in progress and all + database modifications have been written to your log files + on disk. To obtain an offline backup: +

+
+
    +
  1. +

    + Stop writing your databases. +

    +
  2. +
  3. +

    + Run Environment.sync() so as to + ensure that all database modifications are written to disk. Note that cleanly closing your + environment will also ensure that all database modifications are written to disk. +

    +
  4. +
  5. +

    + Copy all log files (*.jdb) from your environment + directory to your archival location or backup media. To make this process a + bit easier, you may want to make use of the DbBackup + helper class. See the next section for details. +

    +
    +

    Note

    +

    + If you are using subdirectories to store your log files, then you must backup + the subdirectories, making sure to keep log files in the subdirectory in which + JE placed them. For information on using subdirectories to store your log + files, see Multiple Environment Subdirectories. +

    +
    +
  6. +
+
+

+ You can now resume normal database operations. +

+
+
+
+
+
+

Using the DbBackup Helper Class

+
+
+
+

+ In order to simplify backup operations, JE + provides the DbBackup helper + class. This class stops and restarts JE background activity + in an open environment. It also lets the application create a + backup which can support restoring the environment to + a specific point in time. +

+

+ Because you do not have to stop JE write activity + in order to take a backup, it is usually necessary to + examine your log files twice before you decide that + your backup is complete. This is because JE may + create a new log file while you are running your + backup. A second pass over your log files allows you to + ensure that no new files have been created and so you + can declare your backup complete. +

+

+ For example: +

+
 time    files in                    activity
+         environment
+
+  t0     000000001.jdb     Backup starts copying file 1
+         000000003.jdb
+         000000004.jdb
+
+  t1     000000001.jdb     JE log cleaner migrates portion of file 3 to
+         000000004.jdb     newly created file 5 and deletes file 3. 
+         000000005.jdb     Backup finishes file 1, starts copying file 4.
+                           Backup MUST include file 5 for a consistent 
+                           backup!
+
+  t2     000000001.jdb     Backup finishes copying file 4, starts and 
+         000000004.jdb     finishes file 5, has caught up. Backup ends.
+         000000005.jdb
+
+

+ DbBackup works around this + problem by defining the set of files that must be + copied for each backup operation, and freezes all + changes to those files. The application can copy that + defined set of files and finish operation without + checking for the ongoing creation of new files. Also, + there will be no need to check for a newer version of + the last file on the next backup. +

+

+ In the example above, if DbBackup was used at t0, + the application would only have to copy files 1, 3 and + 4 to back up. On a subsequent backup, the application + could start its copying at file 5. There would be no + need to check for a newer version of file 4. +

+

+ The following code fragment illustrates this class' usage. + See the DbBackup javadoc for additional + examples and more information on incremental backups. +

+
package je.gettingStarted;
+
+...
+import com.sleepycat.je.util.DbBackup;
+...
+
+    // Find the file number of the last file in the previous backup
+    // persistently, by either checking the backup archive, or saving
+    // state in a persistent file.
+    long lastFileCopiedInPrevBackup =  ...
+
+    Environment env = new Environment(...);
+    DbBackup backupHelper = new DbBackup(env, lastFileCopiedInPrevBackup);
+
+    // Start backup, find out what needs to be copied.
+    // If multiple environment subdirectories are in use,
+    // the getLogFilesInBackupSet returns the log file
+    // name prefixed with the dataNNN/ directory in which
+    // it resides.
+    backupHelper.startBackup();
+    try {
+        String[] filesForBackup = backupHelper.getLogFilesInBackupSet();
+
+        // Copy the files to archival storage.
+        myApplicationCopyMethod(filesForBackup)
+        // Update our knowlege of the last file saved in the backup set,
+        // so we can copy less on the next backup
+        lastFileCopiedInPrevBackup = backupHelper.getLastFileInBackupSet();
+        myApplicationSaveLastFile(lastFileCopiedInBackupSet);
+    }
+    finally {
+        // Remember to exit backup mode, or all log files won't be cleaned
+        // and disk usage will bloat.
+       backupHelper.endBackup();
+   } 
+
+
+ + + diff --git a/docs/GettingStartedGuide/backuprestore.html b/docs/GettingStartedGuide/backuprestore.html new file mode 100644 index 0000000..7140ec1 --- /dev/null +++ b/docs/GettingStartedGuide/backuprestore.html @@ -0,0 +1,355 @@ + + + + + + Chapter 11. Backing up and Restoring Berkeley DB Java Edition Applications + + + + + + + + + +
+
+
+
+

Chapter 11. Backing up and Restoring Berkeley DB Java Edition Applications

+
+
+
+
+

+ Table of Contents +

+
+
+ + Databases and Log Files + +
+
+
+
+ + Log File Overview + +
+
+ + Cleaning the Log Files + +
+
+ + The BTree + +
+
+ + Database Modifications and Syncs + +
+
+ + Normal Recovery + +
+
+
+
+ + Performing Backups + +
+
+
+
+ + Performing a Hot Backup + +
+
+ + Performing an Offline Backup + +
+
+ + Using the DbBackup Helper Class + +
+
+
+
+ + Performing Catastrophic Recovery + +
+
+ + Hot Standby + +
+
+
+

+ Fundamentally, you backup your databases by copying JE log files off to a safe storage location. To restore + your database from a backup, you copy those files to an appropriate directory on disk and reopen your JE + application +

+

+ Beyond these simple activities, there are some differing backup strategies that you may want to consider. These + topics are described in this chapter. +

+
+
+
+
+

Databases and Log Files

+
+
+
+ +

+ Before describing JE backup and restore, it is necessary to describe some of JE's internal workings. In + particular, a high-level understanding of JE log files and the in-memory cache is required. You also need + to understand a little about how JE is using its internal data structures in order to understand why + checkpoints and/or syncs are required. +

+

+ You can skip this section so long as you understand that: +

+
+
    +
  • +

    + JE databases are stored in log files contained in your environment directory. +

    +
  • +
  • +

    + Every time a JE environment is opened, normal recovery is run. +

    +
  • +
  • +

    + For transactional applications, checkpoints should be run in order to bound normal recovery time. + Checkpoints are normally run by the checkpointer thread. Transactional applications and the + checkpointer thread are described in the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

    +
  • +
  • +

    + For non-transactional applications, environment syncs must be performed if you want to guarantee the + persistence of your database modifications. Environment syncs are manually performed by the + application developer. See Data Persistence for details. +

    +
  • +
+
+
+
+
+
+

Log File Overview

+
+
+
+

+ Your JE database is stored on-disk in a series of log files. + JE uses no-overwrite log files, which is to say that JE only ever appends data to the end of a log + file. It will never delete or modify an existing log file record. +

+

+ JE log files are named + NNNNNNNN.jdb where NNNNNNNN is an 8-digit hexadecimal number that + increases by 1 (starting from 00000000) for each log file written to disk. +

+

+ JE creates a new log file whenever the current log file has reached a pre-configured size (10000000 + bytes by default). This size is controlled by the je.log.fileMax properties + parameter. See The JE Properties File for information on setting + JE properties. +

+

+ By default, log files are placed in the environment home directory. However, you can + cause JE to place log files in subdirectories within the environment home + directory. For more information, see + Multiple Environment Subdirectories. +

+
+
+
+
+
+

Cleaning the Log Files

+
+
+
+

+ Because JE uses no-overwrite log files, the logs must be compacted or cleaned so as to conserve disk space. +

+

+ JE uses the cleaner background thread to perform this task. When it runs, the cleaner thread picks + the log file with the smallest number of active records and scans each log record in it. + If the record is no longer + active in the database tree, the cleaner does nothing. If the record is still active in the tree, then + the cleaner copies the record forward to a newer log file. +

+

+ Once a log file is no longer needed (that is, it no longer contains active records), then the cleaner + thread deletes the log file for you. Or, optionally, the cleaner thread can simply rename the discarded + log file with a del suffix. +

+

+ JE uses a minimum log utilization property to determine how much cleaning to perform. The log files + contain both obsolete and utilized records. Obsolete records are records that are no longer in use, either + because they have been modified or because they have been deleted. Utilized records are those records + that are currently in use. The je.cleaner.minUtilization property identifies the + minimum percentage of log space that must be used by utilized records. If this minimum percentage is not + met, then log files are cleaned until the minimum percentage is met. +

+

+ For information on managing the cleaner thread, see The Cleaner Thread. +

+
+
+
+
+
+

The BTree

+
+
+
+

+ JE databases are internally organized as a BTree. In order to operate, JE requires the complete BTree + be available to it. +

+

+ When database records are created, modified, or deleted, the modifications are represented in the BTree's + leaf nodes. Beyond leaf + node changes, database record modifications can also cause changes to other BTree nodes and structures. +

+
+
+
+
+
+

Database Modifications and Syncs

+
+
+
+

+ When a write operation is performed in JE, the modified data + is written to a leaf node contained in the in-memory cache. If + your JE writes are performed without transactions, then the + in-memory cache is the only location guaranteed to receive a + database modification without further intervention on the part + of the application developer. +

+

+ For some class of applications, this lack of a guaranteed write to disk is ideal. By not writing these modifications to + the on-disk logs, the application can avoid most of the overhead caused by disk I/O. +

+

+ However, if the application requires its data to persist persist at a specific point in time, then the developer must + manually sync database modifications to the on-disk log files (again, this is only necessary for + non-transactional applications). This is done using Environment.sync(). +

+

+ Note that syncing the cache causes JE to write all modified objects in the cache + to disk. This is probably the most expensive operation that you can perform in JE. +

+
+
+
+
+
+

Normal Recovery

+
+
+
+

+ Every time a JE environment is opened, normal recovery is run. + Because of the way that JE organizes and manages its BTrees, all it needs is leaf nodes in order to + recreate the rest of the BTree. Essentially, this is what normal recovery is + doing – recreating any missing parts of the internal BTree from leaf node information stored in the + log files. +

+

+ Unlike a traditional database system, JE performs recovery for both transactional + and non-transactional operations. The integrity of the Btree is + guaranteed by JE in the face of both application and OS crashes. +

+
+
+
+ + + diff --git a/docs/GettingStartedGuide/baseapi.html b/docs/GettingStartedGuide/baseapi.html new file mode 100644 index 0000000..ad504a1 --- /dev/null +++ b/docs/GettingStartedGuide/baseapi.html @@ -0,0 +1,382 @@ + + + + + + Part II. Programming with the Base API + + + + + + + + + +
+
+
+
+

Part II. Programming with the Base API

+
+
+
+
+
+

+ This section discusses + application that are built using the JE base API. Note that + most JE applications can probably be written + using the DPL (see Programming with the Direct Persistence Layer for more + information). However, if you are porting an application + from the Berkeley DB API, then the base API is right for + you. +

+
+

+ Table of Contents +

+
+
+ + 7. Databases + +
+
+
+
+ + Opening Databases + +
+
+
+
+ + Deferred Write Databases + +
+
+ + Temporary Databases + +
+
+ + Closing Databases + +
+
+
+
+ + Database Properties + +
+
+ + Administrative Methods + +
+
+ + Database Example + +
+
+
+
+ + 8. Database Records + +
+
+
+
+ + Using Database Records + +
+
+ + Reading and Writing Database Records + +
+
+
+
+ + Writing Records to the Database + +
+
+ + Getting Records from the Database + +
+
+ + Deleting Records + +
+
+ + Data Persistence + +
+
+
+
+ + Using Time to Live + +
+
+
+
+ + Specifying a TTL Value + +
+
+ + Updating a TTL Value + +
+
+ + Deleting TTL Expiration + +
+
+
+
+ + Using the BIND APIs + +
+
+
+
+ + Numerical and String Objects + +
+
+ + Serializable Complex Objects + +
+
+ + Custom Tuple Bindings + +
+
+
+
+ + Using Comparators + +
+
+
+
+ + Writing Comparators + +
+
+ + Setting Comparators + +
+
+
+
+ + Database Record Example + +
+
+
+
+ + 9. Using Cursors + +
+
+
+
+ + Opening and Closing Cursors + +
+
+ + Getting Records Using the Cursor + +
+
+
+
+ + Disk Ordered Cursors + +
+
+ + Searching for Records + +
+
+ + Working with Duplicate Records + +
+
+
+
+ + Putting Records Using Cursors + +
+
+ + Deleting Records Using Cursors + +
+
+ + Replacing Records Using Cursors + +
+
+ + Cursor Example + +
+
+
+
+ + 10. Secondary Databases + +
+
+
+
+ + Opening and Closing Secondary Databases + +
+
+ + Implementing Key + Creators + + + +
+
+ + Secondary Database Properties + +
+
+ + Reading Secondary Databases + +
+
+ + Deleting Secondary Database Records + +
+
+ + + Using Secondary Cursors + + + +
+
+ + Database Joins + +
+
+
+
+ + Using Join Cursors + +
+
+ + JoinCursor Properties + +
+
+
+
+ + Secondary Database Example + +
+
+
+
+ + Opening Secondary Databases with + MyDbEnv + +
+
+ + Using Secondary Databases with ExampleInventoryRead + +
+
+
+
+
+
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/bindAPI.html b/docs/GettingStartedGuide/bindAPI.html new file mode 100644 index 0000000..12601ad --- /dev/null +++ b/docs/GettingStartedGuide/bindAPI.html @@ -0,0 +1,792 @@ + + + + + + Using the BIND APIs + + + + + + + + + +
+
+
+
+

Using the BIND APIs

+
+
+
+ +

Except for Java String and boolean types, efficiently moving data in + and out of Java byte arrays for storage in a database can be a nontrivial + operation. To help you with this problem, JE provides the Bind APIs. + While these APIs are described in detail in the + + Berkeley DB, Java Edition Collections Tutorial, + + + + + this section provides a brief introduction to using the Bind APIs with:

+
+
    +
  • +

    Single field numerical and string objects

    +

    Use this if you want to store a single numerical or string object, + such as Long, Double, or + String.

    +
  • +
  • +

    Complex objects that implement Java serialization.

    +

    Use this if you are storing objects that implement + Serializable and if you do not need to sort them. +

    +
  • +
  • +

    Non-serialized complex objects.

    +

    If you are storing objects that do not implement serialization, + you can create your own custom tuple bindings. Note that you should + use custom tuple bindings even if your objects are serializable if + you want to sort on that data.

    +
  • +
+
+
+
+
+
+

Numerical and String Objects

+
+
+
+

You can use the Bind APIs to store primitive data in a DatabaseEntry + object. That is, you can store a single field containing one of the following types:

+
+
    +
  • +

    + String +

    +
  • +
  • +

    + Character +

    +
  • +
  • +

    + Boolean +

    +
  • +
  • +

    + Byte +

    +
  • +
  • +

    + Short +

    +
  • +
  • +

    + Integer +

    +
  • +
  • +

    + Long +

    +
  • +
  • +

    + Float +

    +
  • +
  • +

    + Double +

    +
  • +
+
+

+ To store primitive data using the Bind APIs: +

+
+
    +
  1. +

    Create an EntryBinding object.

    +

    When you do this, you use TupleBinding.getPrimitiveBinding() + to return an appropriate binding for the conversion.

    +
  2. +
  3. +

    Use the EntryBinding object to place + the numerical object on the DatabaseEntry.

    +
  4. +
+
+

Once the data is stored in the DatabaseEntry, you can put it to + the database in whatever manner you wish. For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.je.DatabaseEntry;
+
+...
+
+// Need a key for the put.
+try {
+    String aKey = "myLong";
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));    
+
+    // Now build the DatabaseEntry using a TupleBinding
+    Long myLong = new Long(123456789l);
+    DatabaseEntry theData = new DatabaseEntry();
+    EntryBinding myBinding = TupleBinding.getPrimitiveBinding(Long.class);
+    myBinding.objectToEntry(myLong, theData);
+
+    // Now store it
+    myDatabase.put(null, theKey, theData);
+} catch (Exception e) {
+    // Exception handling goes here
+}
+

Retrieval from the DatabaseEntry object is + performed in much the same way:

+ +
package je.gettingStarted;
+      
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+
+...
+
+Database myDatabase = null;
+// Database open omitted for clarity
+
+try {
+    // Need a key for the get
+    String aKey = "myLong";
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    
+    // Need a DatabaseEntry to hold the associated data.
+    DatabaseEntry theData = new DatabaseEntry();
+
+    // Bindings need only be created once for a given scope
+    EntryBinding myBinding = TupleBinding.getPrimitiveBinding(Long.class);
+
+    // Get it
+    OperationStatus retVal = myDatabase.get(null, theKey, theData, 
+                                            LockMode.DEFAULT);
+    String retKey = null;
+    if (retVal == OperationStatus.SUCCESS) {
+        // Recreate the data.
+        // Use the binding to convert the byte array contained in theData
+        // to a Long type.
+        Long theLong = (Long) myBinding.entryToObject(theData);
+        retKey = new String(theKey.getData(), "UTF-8");
+        System.out.println("For key: '" + retKey + "' found Long: '" + 
+                            theLong + "'.");
+    } else {
+        System.out.println("No record found for key '" + retKey + "'.");
+    }
+} catch (Exception e) {
+    // Exception handling goes here
+} 
+
+
+
+
+
+

Serializable Complex Objects

+
+
+
+

Frequently your application requires you to store and manage + objects for your record data and/or keys. You may need to do this if you + are caching objects created by another process. You may also want to do + this if you want to store multiple data values on a record. When used + with just primitive data, or with objects containing a single data member, + JE database records effectively represent a single row in a two-column table. + By storing a complex object in the record, you can turn each record into + a single row in an n-column table, where + n is the number of data members contained by the + stored object(s).

+

In order to store objects in a + JE database, you must convert them to and from a byte array. + The first instinct for many Java programmers is to do this using Java + serialization. While this is functionally a correct solution, the result + is poor space-performance because this causes the class information + to be stored on every such database record. This information can be quite large + and it is redundant — the class information does not vary for serialized objects of the same type. +

+

+ In other words, directly using serialization to place your objects into byte + arrays means that you will be storing a great deal of unnecessary information in + your database, which ultimately leads to larger databases and more expensive disk + I/O. +

+

The easiest way for you to solve this problem is to use the Bind + APIs to perform the serialization for you. Doing so causes the extra + object information to be saved off to a unique Database + dedicated for that purpose. This means that you do not have to duplicate + that information on each record in the Database + that your application is using to store its information.

+

+ Note that when you use the Bind APIs to perform serialization, you still + receive all the benefits of serialization. You can still use arbitrarily + complex object graphs, and you still receive built-in class evolution + through the serialVersionUID (SUID) scheme. All of the Java + serialization rules apply without modification. For example, you can + implement Externalizable instead of Serializable. +

+
+
+
+
+

Usage Caveats

+
+
+
+

Before using the Bind APIs to perform serialization, you may + want to consider writing your own custom tuple bindings. Specifically, + avoid serialization if: +

+
+
    +
  • +

    + If you need to sort based on the objects your are storing. + The sort order is meaningless for the byte arrays that you + obtain through serialization. Consequently, you should not use serialization for keys if you + care about their sort order. You should + also not use serialization for record data if your + Database supports duplicate records and you care about sort order. +

    +
  • +
  • +

    + You want to minimize the size of your byte arrays. Even when using the Bind APIs to perform the + serialization the resulting byte array may be larger than necessary. You can achieve + more compact results by building your own custom tuple binding. +

    +
  • +
  • +

    + You want to optimize for speed. In general, custom tuple bindings are faster than serialization at + moving data in and out of byte arrays. +

    +
  • +
  • +

    + You are using custom comparators. In JE, comparators are instantiated and called internally whenever + databases are not accessible. Because serial bindings depend on the class catalog, a serial binding + binding cannot be used during these times. As a result, attempting to use a serial binding with a + custom comparator will result in a NullPointerException during environment open or + close. +

    +
  • +
+
+

+ For information on building your own custom tuple binding, see Custom Tuple Bindings. +

+
+
+
+
+
+

Serializing Objects

+
+
+
+

To store a serializable complex object using the + Bind APIs:

+
+
    +
  1. +

    + Implement java.io.Serializable in the class whose instances that + you want to store. +

    +
  2. +
  3. +

    Open (create) your databases. You need two. The first is the + database that you use to store your data. The second is used to + store the class information.

    +
  4. +
  5. +

    Instantiate a class catalog. You do this with + com.sleepycat.bind.serial.StoredClassCatalog, + and at that time you must provide a handle to an open database + that is used to store the class information.

    +
  6. +
  7. +

    Create an entry binding that uses com.sleepycat.bind.serial.SerialBinding.

    +
  8. +
  9. +

    Instantiate an instance of the object that you want to + store, and place it in a DatabaseEntry + using the entry binding that you created in the previous step.

    +
  10. +
+
+

+ For example, suppose you want to store a long, double, and a + String as a record's data. Then you might create a class that + looks something like this: +

+ +
package je.gettingStarted;    
+
+import java.io.Serializable;
+
+public class MyData implements Serializable {
+    private long longData;
+    private double doubleData;
+    private String description;
+
+    MyData() {
+        longData = 0;
+        doubleData = 0.0;
+        description = null;
+    }
+
+    public void setLong(long data) {
+        longData = data;
+    }
+
+    public void setDouble(double data) {
+        doubleData = data;
+    }
+
+    public void setDescription(String data) {
+        description = data;
+    }
+
+    public long getLong() {
+        return longData;
+    }
+
+    public double getDouble() {
+        return doubleData;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}
+

You can then store instances of this class as follows:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.serial.StoredClassCatalog;
+import com.sleepycat.bind.serial.SerialBinding;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+
+...
+
+// The key data.
+String aKey = "myData";
+
+// The data data
+MyData data2Store = new MyData();
+data2Store.setLong(123456789l);
+data2Store.setDouble(1234.9876543);
+data2Store.setDescription("A test instance of this class");
+
+try {
+    // Environment open omitted for brevity
+
+    // Open the database that you will use to store your data
+    DatabaseConfig myDbConfig = new DatabaseConfig();
+    myDbConfig.setAllowCreate(true);
+    myDbConfig.setSortedDuplicates(true);
+    Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig);
+
+    // Open the database that you use to store your class information.
+    // The db used to store class information does not require duplicates
+    // support.
+    myDbConfig.setSortedDuplicates(false);
+    Database myClassDb = myDbEnv.openDatabase(null, "classDb", 
+                                              myDbConfig); 
+
+    // Instantiate the class catalog
+    StoredClassCatalog classCatalog = new StoredClassCatalog(myClassDb);
+
+    // Create the binding
+    EntryBinding dataBinding = new SerialBinding(classCatalog, 
+                                                 MyData.class);
+
+    // Create the DatabaseEntry for the key
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+
+    // Create the DatabaseEntry for the data. Use the EntryBinding object
+    // that was just created to populate the DatabaseEntry
+    DatabaseEntry theData = new DatabaseEntry();
+    dataBinding.objectToEntry(data2Store, theData);
+
+    // Put it as normal
+    myDatabase.put(null, theKey, theData);
+    
+    // Database and environment close omitted for brevity 
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+
+
+
+
+

Deserializing Objects

+
+
+
+

Once an object is stored in the database, you can retrieve the + MyData objects from the retrieved + DatabaseEntry using the Bind APIs in much the + same way as is described above. For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.serial.StoredClassCatalog;
+import com.sleepycat.bind.serial.SerialBinding;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+
+...
+
+// The key data.
+String aKey = "myData";
+
+try {
+    // Environment open omitted for brevity.
+
+    // Open the database that stores your data
+    DatabaseConfig myDbConfig = new DatabaseConfig();
+    myDbConfig.setAllowCreate(false);
+    Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig);
+
+    // Open the database that stores your class information.
+    Database myClassDb = myDbEnv.openDatabase(null, "classDb", 
+                                              myDbConfig); 
+
+    // Instantiate the class catalog
+    StoredClassCatalog classCatalog = new StoredClassCatalog(myClassDb);
+
+    // Create the binding
+    EntryBinding dataBinding = new SerialBinding(classCatalog, 
+                                                 MyData.class);
+
+    // Create DatabaseEntry objects for the key and data
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry();
+
+    // Do the get as normal
+    myDatabase.get(null, theKey, theData, LockMode.DEFAULT);
+
+    // Recreate the MyData object from the retrieved DatabaseEntry using
+    // the EntryBinding created above
+    MyData retrievedData = (MyData) dataBinding.entryToObject(theData);
+ 
+    // Database and environment close omitted for brevity
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+
+
+
+
+
+

Custom Tuple Bindings

+
+
+
+

+ If you want to store complex objects in your database, then you can use + tuple bindings to do this. While they are more work to write and + maintain than if you were to use serialization, the + byte array conversion is faster. In addition, custom + tuple bindings should allow you to create byte arrays + that are smaller than those created by serialization. Custom tuple + bindings also allow you to optimize your BTree comparisons, whereas + serialization does not. +

+

+ For information on using serialization to store complex objects, see + Serializable Complex Objects. +

+

To store complex objects using a custom tuple binding:

+
+
    +
  1. +

    Implement the class whose instances that you want to store. + Note that you do not have to implement the Serializable interface.

    +
  2. +
  3. +

    Write a tuple binding using the com.sleepycat.bind.tuple.TupleBinding + class.

    +
  4. +
  5. +

    Open (create) your database. Unlike serialization, you only + need one.

    +
  6. +
  7. +

    Create an entry binding that uses the tuple binding that you + implemented in step 2.

    +
  8. +
  9. +

    Instantiate an instance of the object that you want to store, + and place it in a DatabaseEntry using the + entry binding that you created in the previous step.

    +
  10. +
+
+

+ For example, suppose you want to your keys to be instances of the + following class: +

+ +
package je.gettingStarted;
+
+public class MyData2 {
+    private long longData;
+    private Double doubleData;
+    private String description;
+
+    public MyData2() {
+        longData = 0;
+        doubleData = new Double(0.0);
+        description = "";
+    }
+
+    public void setLong(long data) {
+        longData = data;
+    }
+
+    public void setDouble(Double data) {
+        doubleData = data;
+    }
+
+    public void setString(String data) {
+        description = data;
+    }
+
+    public long getLong() {
+        return longData;
+    }
+
+    public Double getDouble() {
+        return doubleData;
+    }
+
+    public String getString() {
+        return description;
+    }
+} 
+

In this case, you need to write a tuple binding for the + MyData2 class. When you do this, you must + implement the TupleBinding.objectToEntry() + and TupleBinding.entryToObject() abstract methods. + Remember the following as you implement these methods:

+
+
    +
  • +

    You use TupleBinding.objectToEntry() to convert + objects to byte arrays. You use + com.sleepycat.bind.tuple.TupleOutput to write + primitive data types to the byte array. Note that + TupleOutput provides methods that allows + you to work with numerical types (long, + double, int, and so forth) and + not the corresponding java.lang numerical + classes.

    +
  • +
  • +

    The order that you write data to the byte + array in TupleBinding.objectToEntry() is the order that + it appears in the array. So given the MyData2 + class as an example, if you write description, + doubleData, and then longData, + then the resulting byte array will contain these data elements in + that order. This means that your records will sort based on the + value of the description data member and then + the doubleData member, and so forth. If you + prefer to sort based on, say, the longData data + member, write it to the byte array first.

    +
  • +
  • +

    You use TupleBinding.entryToObject() to convert + the byte array back into an instance of your + original class. You use com.sleepycat.bind.tuple.TupleInput + to get data from the byte array.

    +
  • +
  • +

    The order that you read data from the byte + array must be exactly the same as the order in which it was written.

    +
  • +
+
+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class MyTupleBinding extends TupleBinding {
+
+    // Write a MyData2 object to a TupleOutput
+    public void objectToEntry(Object object, TupleOutput to) {
+
+        MyData2 myData = (MyData2)object;
+
+        // Write the data to the TupleOutput (a DatabaseEntry).
+        // Order is important. The first data written will be
+        // the first bytes used by the default comparison routines.
+        to.writeDouble(myData.getDouble().doubleValue());
+        to.writeLong(myData.getLong());
+        to.writeString(myData.getString());
+    }
+
+    // Convert a TupleInput to a MyData2 object
+    public Object entryToObject(TupleInput ti) {
+
+        // Data must be read in the same order that it was
+        // originally written.
+        Double theDouble = new Double(ti.readDouble());
+        long theLong = ti.readLong();
+        String theString = ti.readString();
+
+        MyData2 myData = new MyData2();
+        myData.setDouble(theDouble);
+        myData.setLong(theLong);
+        myData.setString(theString);
+
+        return myData;
+    }
+} 
+

In order to use the tuple binding, instantiate the binding and + then use:

+
+
    +
  • +

    MyTupleBinding.objectToEntry() to + convert a MyData2 object to a DatabaseEntry.

    +
  • +
  • +

    MyTupleBinding.entryToObject() to convert + a DatabaseEntry to a MyData2 + object.

    +
  • +
+
+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.je.DatabaseEntry;
+ 
+...
+
+TupleBinding keyBinding = new MyTupleBinding();
+
+MyData2 theKeyData = new MyData2();
+theKeyData.setLong(123456789l);
+theKeyData.setDouble(new Double(12345.6789));
+theKeyData.setString("My key data");
+
+DatabaseEntry myKey = new DatabaseEntry();
+
+try {
+    // Store theKeyData in the DatabaseEntry
+    keyBinding.objectToEntry(theKeyData, myKey);
+
+    ...
+    // Database put and get activity omitted for clarity
+    ...
+
+    // Retrieve the key data
+    theKeyData = (MyData2) keyBinding.entryToObject(myKey);
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+
+ + + diff --git a/docs/GettingStartedGuide/cachesize.html b/docs/GettingStartedGuide/cachesize.html new file mode 100644 index 0000000..05b21c4 --- /dev/null +++ b/docs/GettingStartedGuide/cachesize.html @@ -0,0 +1,131 @@ + + + + + + Sizing the Cache + + + + + + + + + +
+
+
+
+

Sizing the Cache

+
+
+
+

+ By default, your cache is limited to a percentage of the JVM maximum + memory as specified by the -Xmx parameter. You can + change this percentage by using the je.maxMemoryPercent property + or through EnvironmentMutableConfig.setCachePercent(). + That is, the maximum amount of memory available to your cache is + normally calculated as: +

+
je.maxMemoryPercent * JVM_maximum_memory
+

+ You can find out what the value for this property is by using + EnvironmentConfig.getCachePercent(). +

+

+ Note that you can cause JE to use a fixed maximum cache size by + using je.maxMemory or by using + EnvironmentConfig.setCacheSize(). +

+

+ Also, not every JVM is capable of identifying the amount of memory requested via + the -Xmx parameter. For those JVMs you must use + je.maxMemory to change your maximum cache size. The + default maximum memory available to your cache in this case is 38M. +

+

+ Of the amount of memory allowed for your cache, 93% is used for the internal BTree and the other 7% is + used for internal buffers. When your application first starts up, the 7% for buffers is immediately allocated. + The remainder of the cache grows lazily as your application reads and writes data. +

+

+ In order for your application to start up successfully, the Java virtual machine must have enough memory + available to it (as identified by the -Xmx command line switch) for both your application and + 7% of your maximum cache value. In order for your application to run continuously (all the while loading data + into the cache), you must make sure your JVM has enough memory for your application plus the maximum cache size. +

+

+ The best way to determine how large your cache needs to be is to put your application into a production + environment and watch to see how much disk I/O is occurring. If the application is going to disk quite a lot to + retrieve database records, then you should increase the size of your cache (provided that you have enough memory + to do so). +

+

+ You can also use the + com.sleepycat.je.util.DbCacheSize utility + to obtain a rough estimate of how large your cache needs to be for + a given number of records and record characteristics. The utility + returns an estimate of the cache size to hold + the specified number of records in memory. See the + DbCacheSize javadoc + for information on the utility's usage. +

+

+ In order to determine how frequently your application is going to disk for database records not found in the + cache, you can examine the value returned by EnvironmentStats.getNCacheMiss(). +

+

+ EnvironmentStats.getNCacheMiss() identifies the total number of requests for + database objects that were + not serviceable from the cache. This value is cumulative since the application started. The faster this number grows, + the more your application is going to disk to service database operations. Upon application startup you can + expect this value to grow quite rapidly. However, as time passes and your cache is seeded with your most + frequently accessed database records, what you want is for this number's growth to be zero or at least very + small. +

+

+ Note that this statistic can only be collected from within the application itself or using the JMX extension + (see JConsole and JMX Support). +

+

+ For more information on collecting this statistic, see Environment Statistics. +

+
+ + + diff --git a/docs/GettingStartedGuide/catastrophicrecovery.html b/docs/GettingStartedGuide/catastrophicrecovery.html new file mode 100644 index 0000000..28fa7b4 --- /dev/null +++ b/docs/GettingStartedGuide/catastrophicrecovery.html @@ -0,0 +1,117 @@ + + + + + + Performing Catastrophic Recovery + + + + + + + + + +
+
+
+
+

Performing Catastrophic Recovery

+
+
+
+

+ Catastrophic recovery is necessary whenever your environment and/or database have been lost or corrupted + due to a media failure (disk failure, for example). Catastrophic recovery is also required if normal + recovery fails for any reason. +

+

+ In order to perform catastrophic recovery, you must have a full back up of your databases. You will use + this backup to restore your database. See Performing Backups for + information on running back ups. +

+

+ To perform catastrophic recovery: +

+
+
    +
  1. +

    + Shut down your application. +

    +
  2. +
  3. +

    + Delete the contents of your environment home directory (the one that experienced a catastrophic + failure), if there is anything there. +

    +
  4. +
  5. +

    + Copy your most recent full backup into your environment home directory. + If you are using subdirectories to store your log files, be sure to place + the recovered log files back into the subdirectory from which they were + originally backed up. +

    +
  6. +
  7. +

    + If you are using a backup utility that runs incremental backups of your + environment directory, copy any log files generated since the time of your + last full backup. Be sure to restore all log files in the order that they + were written. The order is important because it is possible the same log + file appears in multiple archives, and you want to run recovery using the + most recent version of each log file. Also, if you are using subdirectories to + store your log files, be sure to maintain the relationship between your log files + and the subdirectory in which JE originally placed them. +

    +
  8. +
  9. +

    + Open the environment as normal. JE's normal recovery will run, which will bring your database + to a consistent state relative to the changed data found in your log files. +

    +
  10. +
+
+

+ You are now done restoring your database. +

+
+ + + diff --git a/docs/GettingStartedGuide/commandlinetools.html b/docs/GettingStartedGuide/commandlinetools.html new file mode 100644 index 0000000..2ef2ef3 --- /dev/null +++ b/docs/GettingStartedGuide/commandlinetools.html @@ -0,0 +1,563 @@ + + + + + + The Command Line Tools + + + + + + + + + +
+
+
+
+

The Command Line Tools

+
+
+
+
+
+
+ + DbDump + +
+
+ + DbLoad + +
+
+ + DbVerify + +
+
+
+

+ JE ships with several command line tools that + you can use to help you manage your databases. They are: +

+
+
    +
  • +

    + DbDump +

    +

    + Dumps a database to a user-readable format. +

    +
  • +
  • +

    + DbLoad +

    +

    + Loads a database from the output produced by DbDump +

    +
  • +
  • +

    + DbVerify +

    +

    + Verifies the structure of a database. +

    +
  • +
+
+
+
+
+
+

DbDump

+
+
+
+

+ Dumps a database to a flat-text representation. Options are: +

+
+
+
+ + + -f + + +
+
+

+ Identifies the file to which the output from this command is written. + The console (standard out) is used by default. +

+
+
+ + + -h + + +
+
+

+ Identifies the environment's directory. This parameter is required. +

+
+
+ + + -l + + +
+
+

+ Lists the databases contained in the environment. If the -s is + not provided, then this argument is required. +

+
+
+ + + -p + + +
+
+

+ Prints database records in human-readable format. +

+
+
+ + + -r + + +
+
+

+ Salvage data from a possibly corrupt file. When used on a uncorrupted database, this option + should return data equivalent to a normal dump, but most likely in a different order. +

+

+ This option causes the ensuing output to go to a file named + dbname.dump where + dbname is the name of the database you are dumping. The + file is placed in the current working directory. +

+
+
+ + + -R + + +
+
+

+ Aggressively salvage data from a possibly corrupt file. This option differs from the -r option + in that it will return all possible data from the file at the risk of also returning already + deleted or otherwise nonsensical items. Data dumped in this fashion will almost certainly have + to be edited by hand or other means before the data is ready for reload into another database. +

+

+ This option causes the ensuing output to go to a file named + dbname.dump where + dbname is the name of the database you are dumping. The + file is placed in the current working directory. +

+
+
+ + + -s + + +
+
+

+ Identifies the database to be dumped. If this option is not specified, then the -l is required. +

+
+
+ + + -v + + +
+
+

+ Prints progress information to the console for + -r or -R mode. +

+
+
+ + + -V + + +
+
+

+ Prints the database version number and then quits. All other command line options are ignored. +

+
+
+
+

+ For example: +

+
> java com.sleepycat.je.util.DbDump -h . -p -s VendorDB  
+VERSION=3
+format=print
+type=btree
+database=VendorDB
+dupsort=false
+HEADER=END
+ Mom's Kitchen
+ sr\01\01xpt\00\0d53 Yerman Ct.t\00\0c763 554 9200t\00\0bMiddle Townt\00
+ \0eMaggie Kultgent\00\10763 554 9200 x12t\00\02MNt\00\0dMom's Kitchent\00
+ \0555432
+ Off the Vine
+ sr\01\01xpt\00\10133 American Ct.t\00\0c563 121 3800t\00\0aCentennialt\00
+ \08Bob Kingt\00\10563 121 3800 x54t\00\02IAt\00\0cOff the Vinet\00\0552002
+ Simply Fresh
+ sr\01\01xpt\00\1115612 Bogart Lanet\00\0c420 333 3912t\00\08Harrigant\00
+ \0fCheryl Swedbergt\00\0c420 333 3952t\00\02WIt\00\0cSimply Fresht\00\0
+ 553704
+ The Baking Pan
+ sr\01\01xpt\00\0e1415 53rd Ave.t\00\0c320 442 2277t\00\07Dutchint\00\09
+ Mike Roant\00\0c320 442 6879t\00\02MNt\00\0eThe Baking Pant\00\0556304
+ The Pantry
+ sr\01\01xpt\00\111206 N. Creek Wayt\00\0c763 555 3391t\00\0bMiddle Town
+ t\00\0fSully Beckstromt\00\0c763 555 3391t\00\02MNt\00\0aThe Pantryt\00
+ \0555432
+ TriCounty Produce
+ sr\01\01xpt\00\12309 S. Main Streett\00\0c763 555 5761t\00\0bMiddle Townt
+ \00\0dMort Dufresnet\00\0c763 555 5765t\00\02MNt\00\11TriCounty Producet
+ \00\0555432
+DATA=END
+> 
+
+
+
+
+
+

DbLoad

+
+
+
+

+ Loads a database from the output produced by DbDump. + Options are: +

+
+
+
+ + + -c + + +
+
+

Specifies configuration options. The options supplied here override the corresponding options + that appear in the data that is being loaded. This option takes values of the form + name=value, where name + is the configuration option that you are overriding and value + is the new value for the option. +

+

+ The following options can be specified: +

+
+
    +
  • +

    + database +

    +

    + The name of the database to be loaded. This option duplicates the functionality of + this command's -s command line option. +

    +
  • +
  • +

    + dupsort +

    +

    + Indicates whether duplicates are allowed in the database. A value of + true allows duplicates in the database. +

    +
  • +
+
+
+
+ + + -f + + +
+
+

+ Identifies the file from which the database is to be loaded. +

+
+
+ + + -n + + +
+
+

+ Do not overwrite existing keys in the database when loading into an already existing database. + If a key/data pair cannot be loaded into the database for this reason, a warning message is + displayed on the standard error output, and the key/data pair are skipped +

+
+
+ + + -h + + +
+
+

+ Identifies the environment's directory. This parameter is required. +

+
+
+ + + -l + + +
+
+

+ Allows loading databases that were dumped with the Berkeley DB C + product, when the dump file contains parameters not known to JE. +

+
+
+ + + -s + + +
+
+

+ Overrides the database name, causing the data to be loaded into a database that uses the name + supplied to this parameter. +

+
+
+ + + -T + + +
+
+

+ Causes a flat text file to be loaded into the database. +

+

+ The input must be paired lines of text, where the first line of the pair is the key item, + and the second line of the pair is its corresponding data item. +

+

+ A simple escape mechanism, where newline and backslash (\) characters are special, is + applied to the text input. Newline characters are interpreted as record separators. + Backslash characters in the text will be interpreted in one of two ways: If the backslash + character precedes another backslash character, the pair will be interpreted as a literal + backslash. If the backslash character precedes any other character, the two characters + following the backslash will be interpreted as a hexadecimal specification of a single + character; for example, \0a is a newline character in the ASCII character set. +

+

+ For this reason, any backslash or newline characters that naturally occur in the text input + must be escaped to avoid misinterpretation by db_load. +

+
+
+ + + -v + + +
+
+

+ Report periodic load status to the console. +

+
+
+ + + -V + + +
+
+

+ Prints the database version number and then quits. All other command line options are ignored. +

+
+
+
+

+ For example: +

+
> java com.sleepycat.je.util.DbDump -h . -s VendorDB -f vendordb.txt
+> java com.sleepycat.je.util.DbLoad -h . -f vendordb.txt
+> 
+
+
+
+
+
+

DbVerify

+
+
+
+

+ Examines the identified database for errors. Options are: +

+
+
+
+ + + -h + + +
+
+

+ Identifies the environment's directory. This parameter is required. +

+
+
+ + + -q + + +
+
+

+ Suppress the printing of any error descriptions. Instead, simply exit success or failure. +

+
+
+ + + -s + + +
+
+

+ Identifies the database to be verified. This parameter is required. +

+
+
+ + + -V + + +
+
+

+ Prints the database version number and then quits. All other command line options are ignored. +

+
+
+ + + -v + + +
+
+

+ Report intermediate statistics every N leaf nodes, where + N is the value that you provide this parameter. +

+
+
+
+

+ For example: +

+
> java com.sleepycat.je.util.DbVerify -h . -s VendorDB
+
+<BtreeStats>
+<BottomInternalNodesByLevel total="1">
+  <Item level="1" count="1"/>
+</BottomInternalNodesByLevel>
+<InternalNodesByLevel total="1">
+  <Item level="2" count="1"/>
+</InternalNodesByLevel>
+<LeafNodes count="6"/>
+<DeletedLeafNodes count="0"/>
+<DuplicateCountLeafNodes count="0"/>
+<MainTreeMaxDepth depth="2"/>
+<DuplicateTreeMaxDepth depth="0"/>
+</BtreeStats>
+
+
+ + + diff --git a/docs/GettingStartedGuide/comparator.html b/docs/GettingStartedGuide/comparator.html new file mode 100644 index 0000000..7f89338 --- /dev/null +++ b/docs/GettingStartedGuide/comparator.html @@ -0,0 +1,260 @@ + + + + + + Using Comparators + + + + + + + + + +
+
+
+
+

Using Comparators

+
+
+
+
+
+
+ + Writing Comparators + +
+
+ + Setting Comparators + +
+
+
+

Internally, JE databases are organized as BTrees. + This means that most database operations + (inserts, deletes, reads, and so forth) involve BTree node + comparisons. This comparison most frequently occurs based on database + keys, but if your database supports duplicate records then + comparisons can also occur based on the database data. +

+

+ By default, JE performs all such comparisons using a byte-by-byte + lexicographic comparison. This mechanism works well for most data. + However, in some cases you may need to specify your own comparison + routine. One frequent reason for this is to perform a language sensitive + lexical ordering of string keys. +

+
+
+
+
+

Writing Comparators

+
+
+
+

+ You override the default comparison function by providing a Java + Comparator class to the database. + The Java Comparator interface requires you to implement the + Comparator.compare() method + (see http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html for details). +

+

+ JE passes your Comparator.compare() method + the byte arrays that you stored in the database. If + you know how your data is organized in the byte + array, then you can write a comparison routine that directly examines + the contents of the arrays. Otherwise, you have to reconstruct your + original objects, and then perform the comparison. +

+

+ For example, suppose you want to perform unicode lexical comparisons + instead of UTF-8 byte-by-byte comparisons. Then you could provide a + comparator that uses String.compareTo(), + which performs a Unicode comparison of two strings (note that for + single-byte roman characters, Unicode comparison and UTF-8 + byte-by-byte comparisons are identical – this is something you + would only want to do if you were using multibyte unicode characters + with JE). In this case, your comparator would look like the + following: +

+ +
package je.gettingStarted;
+
+import java.util.Comparator;
+
+public class MyDataComparator implements Comparator {
+
+    public MyDataComparator() {}
+
+    public int compare(Object d1, Object d2) {
+
+        byte[] b1 = (byte[])d1;
+        byte[] b2 = (byte[])d2;
+
+        String s1 = new String(b1, "UTF-8");
+        String s2 = new String(b2, "UTF-8");
+        return s1.compareTo(s2);
+    }
+} 
+
+
+
+
+
+

Setting Comparators

+
+
+
+

+ You specify a Comparator using the following + methods. Note that by default these methods can only be used at database + creation time, and they are ignored for normal database opens. Also, + note that JE uses the no-argument constructor for these comparators. + Further, it is not allowable for there to be a mutable state in these + comparators or else unpredictable results will occur. +

+
+
    +
  • +

    + DatabaseConfig.setBtreeComparator() +

    +

    + Sets the Java Comparator class used + to compare two keys in the database. +

    +
  • +
  • +

    + DatabaseConfig.setDuplicateComparator() +

    +

    + Sets the Java Comparator class used to compare the + data on two duplicate records in the database. This comparator is + used only if the database supports duplicate records. +

    +
  • +
+
+

+ You can use the above methods to set a database's comparator after + database creation time if you explicitly indicate that the comparator + is to be overridden. You do this by using the following methods: +

+
+

Note

+

+ If you override your comparator, the new comparator must preserve the + sort order implemented by your original comparator. That is, the new + comparator and the old comparator must return the same value for the + comparison of any two valid objects. Failure to observe this constraint + will cause unpredictable results for your application. +

+

+ If you want to change the fundamental sort order for your database, back + up the contents of the database, delete the database, recreate it, and + then reload its data. +

+
+
+
    +
  • +

    + DatabaseConfig.setOverrideBtreeComparator() +

    +

    + If set to true, causes the database's Btree + comparator to be overridden with the + Comparator specified on + DatabaseConfig.setBtreeComparator(). This + method can be used to change the comparator post-environment + creation. +

    +
  • +
  • +

    + DatabaseConfig.setOverrideDuplicateComparator() +

    +

    + If set to true, causes the database's + duplicates comparator to be overridden with the + Comparator specified on + DatabaseConfig.setDuplicateComparator(). +

    +
  • +
+
+

For example, to use the Comparator + described in the previous section:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+
+import java.util.Comparator;    
+
+...
+
+
+// Environment open omitted for brevity
+
+try {
+    // Get the database configuration object
+    DatabaseConfig myDbConfig = new DatabaseConfig();
+    myDbConfig.setAllowCreate(true);
+
+    // Set the duplicate comparator class
+    myDbConfig.setDuplicateComparator(MyDataComparator.class);
+
+    // Open the database that you will use to store your data
+    myDbConfig.setSortedDuplicates(true);
+    Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig); 
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+}
+
+
+ + + diff --git a/docs/GettingStartedGuide/concurrentProcessing.html b/docs/GettingStartedGuide/concurrentProcessing.html new file mode 100644 index 0000000..0cbd67b --- /dev/null +++ b/docs/GettingStartedGuide/concurrentProcessing.html @@ -0,0 +1,171 @@ + + + + + + Appendix A. Concurrent Processing in Berkeley DB Java Edition + + + + + + + + + +
+
+
+
+

Appendix A. Concurrent Processing in Berkeley DB Java Edition

+
+
+
+

+ An in-depth description of concurrent processing in JE is beyond the scope of this manual. However, there are + a few things that you should be aware of as you explore JE. Note that many of these topics are described in + greater detail in other parts of this book. This section is intended only to summarize JE concurrent + processing. +

+

+ Also, this appendix touches on a topic not + discussed in any detail in this manual: transactions. Transactional usage is + optional but nevertheless very commonly used for JE + applications, especially when writing multi-threaded or + multi-process applications. However, transactions also + represent a topic that is too large for this book. To read a + thorough description of JE and transactional processing, + see the Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

+

+ This appendix first describes concurrency with multithreaded applications. It then goes on to describe + Multiprocess Applications. +

+
+
+
+
+

Multithreaded Applications

+
+
+
+

+ Note the following if you are writing an application that will use multiple threads for reading and writing + JE databases: +

+
+
    +
  • +

    + JE database and environment handles are free-threaded (that is, are thread safe), so from a mechanical perspective you + do not have to synchronize access to them when they are used by multiple threads of control. +

    +
  • +
  • +

    + It is dangerous to close environments and databases when other database operations are in + progress. So if you are going to share handles for these objects across threads, you should + architect your application such that there is no possibility of a thread closing a handle when + another thread is using that handle. +

    +
  • +
  • +

    + If a transaction is shared across threads, it is safe to call transaction.abort() from + any thread. However, be aware that any thread that attempts a database operation using an aborted + transaction will throw a DatabaseException. You should architect your + application such that your threads are able to gracefully deal with some other thread aborting the + current transaction. +

    +
  • +
  • +

    + If a transaction is shared across threads, make sure that + transaction.commit() can never be called until all threads participating in + the transaction have completed their database operations. +

    +
  • +
  • +

    + Locking is performed at the database record level. + JE always checks for lock conflicts, which can be caused either by operations that run for + too long a period of time, or by deadlocks. JE decides that a lock conflict has occured when + the lock cannot be obtained within a set timeout + period. If it cannot, regardless of why the lock could + not be obtained, then LockConflictException is thrown. +

    +
  • +
  • +

    + A non-transactional operation that reads a record locks it for the duration of the read. + While locked for read, a write lock can not be obtained on that record. However, another read lock + can be obtained for that record. This means that for threaded applications, multiple threads can + simultaneously read a record, but no thread can write to the record while a read is in progress. +

    +

    + Note that if you are performing uncommitted reads, then no locking is performed for that read. Instead, + JE uses internal mechanisms to ensure that the data you are reading is consistent (that is, it + will not change mid-read). +

    +

    + Finally, it is possible to specify that you want a write lock for your read operation. You do this + using LockMode.RMW. Use RMW when you know that your read will + subsequently be followed up with a write operation. Doing so can help to avoid lock conflicts. +

    +
  • +
  • +

    + An operation that writes to a record obtains a write lock on that record. While the write lock is in + progress, no other locks can be obtained for that record (either read or write). +

    +
  • +
  • +

    + All locks, read or write, obtained from within a transaction are held until the transaction is either + committed or aborted. + This means that the longer a transaction lives, the more likely other threads in your application + are to run into lock conflicts. That is, write operations + performed outside of the scope of the transaction will not be able to obtain a lock on those records + while the transaction is in progress. Also, by default, reads performed outside the scope of the + transaction will not be able to lock records written by the transaction. However, this behavior can be + overridden by configuring your reader to perform uncommitted reads. +

    +
  • +
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/cursorUsage.html b/docs/GettingStartedGuide/cursorUsage.html new file mode 100644 index 0000000..8a9f8e4 --- /dev/null +++ b/docs/GettingStartedGuide/cursorUsage.html @@ -0,0 +1,284 @@ + + + + + + Cursor Example + + + + + + + + + +
+
+
+
+

Cursor Example

+
+
+
+

In Database Example we wrote an + application that loaded two Database objects with vendor + and inventory information. In this example, we will use those databases to + display all of the items in the inventory database. As a part of showing + any given inventory item, we will look up the vendor who can provide the + item and show the vendor's contact information.

+

To do this, we create the ExampleInventoryRead + application. This application reads and displays all inventory records by:

+
+
    +
  1. +

    Opening the environment and then the inventory, vendor, and + class catalog Database objects. We do this using the + MyDbEnv class. See Stored Class Catalog Management with MyDbEnv + for a description of this class.

    +
  2. +
  3. +

    Obtaining a cursor from the inventory Database.

    +
  4. +
  5. +

    Steps through the Database, displaying + each record as it goes.

    +
  6. +
  7. +

    To display the Inventory record, the custom tuple binding that + we created in InventoryBinding.java is used.

    +
  8. +
  9. +

    Database.get() is used to obtain the vendor that corresponds to + the inventory item.

    +
  10. +
  11. +

    A serial binding is used to convert the + DatabaseEntry returned + by the get() to a Vendor object.

    +
  12. +
  13. +

    The contents of the Vendor object are displayed.

    +
  14. +
+
+

We implemented the Vendor class in Vendor.java. We implemented the + Inventory class in Inventory.java.

+

The full implementation of ExampleInventoryRead + can be found in: +

+
JE_HOME/examples/je/gettingStarted/ExampleInventoryRead.java
+

+ where JE_HOME is the location where you + placed your JE + distribution. +

+
+ +

+ Example 9.1 ExampleInventoryRead.java +

+
+

To begin, we import the necessary classes:

+ +
// file ExampleInventoryRead.java
+package je.gettingStarted;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.serial.SerialBinding;
+import com.sleepycat.bind.tuple.TupleBinding; 
+
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+
+import java.io.File;
+import java.io.IOException; 
+

Next we declare our class and set up some global variables. Note a + MyDbEnv object is instantiated here. We can do + this because its constructor never throws an exception. See Database Example for its implementation + details.

+ +
public class ExampleInventoryRead {
+
+        private static File myDbEnvPath =
+            new File("/tmp/JEDB");
+
+        // Encapsulates the database environment and databases.
+        private static MyDbEnv myDbEnv = new MyDbEnv();
+
+        private static TupleBinding inventoryBinding;
+        private static EntryBinding vendorBinding;
+

+ Next we create the ExampleInventoryRead.usage() and + ExampleInventoryRead.main() methods. + We perform almost all of our exception handling from ExampleInventoryRead.main(), and so we + must catch DatabaseException because the com.sleepycat.je.* + APIs throw them. +

+ +
   private static void usage() {
+        System.out.println("ExampleInventoryRead [-h <env directory>]");
+        System.exit(0);
+    }
+
+    public static void main(String args[]) {
+        ExampleInventoryRead eir = new ExampleInventoryRead();
+        try {
+            eir.run(args);
+        } catch (DatabaseException dbe) {
+            System.err.println("ExampleInventoryRead: " + dbe.toString());
+            dbe.printStackTrace();
+        } finally {
+            myDbEnv.close();
+        }
+        System.out.println("All done.");
+    }
+

In ExampleInventoryRead.run(), we call MyDbEnv.setup() to + open our environment and databases. Then we create the bindings that we need for using our data objects with + DatabaseEntry objects. +

+ +
    private void run(String args[]) throws DatabaseException {
+        // Parse the arguments list
+        parseArgs(args);
+  
+        myDbEnv.setup(myDbEnvPath, // path to the environment home
+                      true);       // is this environment read-only?
+
+        // Setup our bindings.
+        inventoryBinding = new InventoryBinding();
+        vendorBinding =
+             new SerialBinding(myDbEnv.getClassCatalog(),
+                               Vendor.class);
+        showAllInventory();
+    }
+

Now we write the loop that displays the Inventory + records. We do this by opening a cursor on the inventory database and + iterating over all its contents, displaying each as we go.

+ +
    private void showAllInventory() 
+        throws DatabaseException {
+        // Get a cursor
+        Cursor cursor = myDbEnv.getInventoryDB().openCursor(null, null);
+
+        // DatabaseEntry objects used for reading records
+        DatabaseEntry foundKey = new DatabaseEntry();
+        DatabaseEntry foundData = new DatabaseEntry();
+
+        try { // always want to make sure the cursor gets closed.
+            while (cursor.getNext(foundKey, foundData,
+                        LockMode.DEFAULT) == OperationStatus.SUCCESS) {
+                Inventory theInventory =
+                    (Inventory)inventoryBinding.entryToObject(foundData);
+                displayInventoryRecord(foundKey, theInventory);
+            }
+        } catch (Exception e) {
+            System.err.println("Error on inventory cursor:");
+            System.err.println(e.toString());
+            e.printStackTrace();
+        } finally {
+            cursor.close();
+        }
+
+    } 
+

We use ExampleInventoryRead.displayInventoryRecord() to actually show the record. This + method first displays all the relevant information from the retrieved + Inventory object. It then uses the vendor database to retrieve and + display the vendor. Because the vendor database is keyed by vendor name, + and because each inventory object contains this key, it is trivial to + retrieve the appropriate vendor record.

+ +
   private void displayInventoryRecord(DatabaseEntry theKey,
+                                        Inventory theInventory)
+        throws DatabaseException {
+
+        DatabaseEntry searchKey = null;
+        try {
+            String theSKU = new String(theKey.getData(), "UTF-8");
+            System.out.println(theSKU + ":");
+            System.out.println("\t " + theInventory.getItemName());
+            System.out.println("\t " + theInventory.getCategory());
+            System.out.println("\t " + theInventory.getVendor());
+            System.out.println("\t\tNumber in stock: " +
+            theInventory.getVendorInventory());
+            System.out.println("\t\tPrice per unit:  " +
+                theInventory.getVendorPrice());
+            System.out.println("\t\tContact: ");
+
+            searchKey =
+             new DatabaseEntry(theInventory.getVendor().getBytes("UTF-8"));
+        } catch (IOException willNeverOccur) {}
+        DatabaseEntry foundVendor = new DatabaseEntry();
+
+        if (myDbEnv.getVendorDB().get(null, searchKey, foundVendor,
+                LockMode.DEFAULT) != OperationStatus.SUCCESS) {
+            System.out.println("Could not find vendor: " +
+                theInventory.getVendor() + ".");
+            System.exit(-1);
+        } else {
+            Vendor theVendor =
+                (Vendor)vendorBinding.entryToObject(foundVendor);
+            System.out.println("\t\t " + theVendor.getAddress());
+            System.out.println("\t\t " + theVendor.getCity() + ", " +
+                theVendor.getState() + " " + theVendor.getZipcode());
+            System.out.println("\t\t Business Phone: " +
+                theVendor.getBusinessPhoneNumber());
+            System.out.println("\t\t Sales Rep: " +
+                                theVendor.getRepName());
+            System.out.println("\t\t            " +
+                theVendor.getRepPhoneNumber());
+       }
+    }
+

The remainder of this application provides a utility method used + to parse the command line options. From the perspective of this + document, this is relatively uninteresting. You can see how this is + implemented by looking at: +

+
JE_HOME/examples/je/gettingStarted/ExampleInventoryRead.java
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/dataaccessorclass.html b/docs/GettingStartedGuide/dataaccessorclass.html new file mode 100644 index 0000000..2f5583c --- /dev/null +++ b/docs/GettingStartedGuide/dataaccessorclass.html @@ -0,0 +1,119 @@ + + + + + + DataAccessor.java + + + + + + + + + +
+
+
+
+

DataAccessor.java

+
+
+
+

+ Now that we have implemented our data classes, + we can write a class that will provide + convenient access to our primary and + secondary indexes. + Note that like our data classes, this class is shared by both our + example programs. +

+

+ If you compare this class against our + Vendor and + Inventory + class implementations, you will see that the + primary and secondary indices declared there are + referenced by this class. +

+

+ See Vendor.java + and + Inventory.java + for those implementations. +

+
package persist.gettingStarted;
+
+import java.io.File;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.persist.EntityStore;
+import com.sleepycat.persist.PrimaryIndex; 
+import com.sleepycat.persist.SecondaryIndex;
+                            
+public class DataAccessor {
+    // Open the indices
+    public DataAccessor(EntityStore store)
+        throws DatabaseException {
+
+        // Primary key for Inventory classes
+        inventoryBySku = store.getPrimaryIndex(
+            String.class, Inventory.class);
+
+        // Secondary key for Inventory classes
+        // Last field in the getSecondaryIndex() method must be
+        // the name of a class member; in this case, an Inventory.class
+        // data member.
+        inventoryByName = store.getSecondaryIndex(
+            inventoryBySku, String.class, "itemName");
+
+        // Primary key for Vendor class
+        vendorByName = store.getPrimaryIndex(
+            String.class, Vendor.class);
+    }
+
+    // Inventory Accessors
+    PrimaryIndex<String,Inventory> inventoryBySku;
+    SecondaryIndex<String,String,Inventory> inventoryByName;
+
+    // Vendor Accessors
+    PrimaryIndex<String,Vendor> vendorByName;
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/databases.html b/docs/GettingStartedGuide/databases.html new file mode 100644 index 0000000..72927c8 --- /dev/null +++ b/docs/GettingStartedGuide/databases.html @@ -0,0 +1,546 @@ + + + + + + Chapter 7. Databases + + + + + + + + + +
+
+
+
+

Chapter 7. Databases

+
+
+
+
+

+ Table of Contents +

+
+
+ + Opening Databases + +
+
+
+
+ + Deferred Write Databases + +
+
+ + Temporary Databases + +
+
+ + Closing Databases + +
+
+
+
+ + Database Properties + +
+
+ + Administrative Methods + +
+
+ + Database Example + +
+
+
+

In Berkeley DB Java Edition, a database is a collection of records. Records, + in turn, consist of key/data pairings. +

+

+ Conceptually, you can think of a + Database + + as containing a two-column table where column 1 contains a key and column 2 + contains data. Both the key and the data are managed using + DatabaseEntry + + + class instances + + (see Database Records for details on this + class + ). + So, fundamentally, using a JE + Database + + involves putting, getting, and deleting database records, which in turns involves efficiently + managing information + encapsulated by + + + DatabaseEntry + + + + objects. + + The next several chapters of this book are dedicated to those activities. +

+

+ Note that on disk, databases are stored in sequentially numerically + named log files in the directory where the opening + environment is located. JE log files are described + Databases and Log Files. +

+

+ Also, note that in the previous section of this book, Programming with the Direct Persistence Layer, + we described the DPL The DPL handles all database management + for you, including creating all primary and secondary databases as is + required by your application. That said, if you are using the DPL + you can access the underlying database for a given index if + necessary. See the Javadoc for the DPL for more information. +

+
+
+
+
+

Opening Databases

+
+
+
+
+
+
+ + Deferred Write Databases + +
+
+ + Temporary Databases + +
+
+ + Closing Databases + +
+
+
+

+ You open a database by using the + Environment.openDatabase() + method (environments are described in Database Environments). This + method creates and returns a Database + object handle. + You must provide Environment.openDatabase() + with a database name. +

+

+ You can optionally provide Environment.openDatabase() + with a DatabaseConfig() object. + DatabaseConfig() allows you to set properties for + the database, such as whether it can be created if it does not currently + exist, whether you are opening it read-only, and whether the database is to support transactions. +

+

+ Note that by default, JE does not create databases if they do not already exist. + To override this behavior, set the creation property to true. +

+

+ Finally, if you configured your environment and database to support transactions, + you can optionally provide a transaction object to the + Environment.openDatabase(). + Transactions are described in the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

+

+ The following code fragment illustrates a database open: + +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+...
+
+Environment myDbEnvironment = null;
+Database myDatabase = null;
+
+...
+
+try {
+    // Open the environment. Create it if it does not already exist.
+    EnvironmentConfig envConfig = new EnvironmentConfig();
+    envConfig.setAllowCreate(true);
+    myDbEnvironment = new Environment(new File("/export/dbEnv"), 
+                                      envConfig);
+
+    // Open the database. Create it if it does not already exist.
+    DatabaseConfig dbConfig = new DatabaseConfig();
+    dbConfig.setAllowCreate(true);
+    myDatabase = myDbEnvironment.openDatabase(null, 
+                                              "sampleDatabase", 
+                                              dbConfig); 
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+}
+
+
+
+
+

Deferred Write Databases

+
+
+
+

+ By default, JE database operations that modify the + database are written (logged) at the time of the operation. For transactional + databases, changes become durable when the transaction is committed. +

+

+ However, deferred write databases operations are not written at the time + of the operation. Writing is deferred for as long as possible. The + changes are only guaranteed to be durable after the + Database.sync() method + is called or the database is properly closed. +

+

+ Deferring writes in this manner has two performance advantages when performing + database modifications: +

+
+
    +
  1. +

    + When multiple threads are performing writes, Concurrency is increased + because the bottleneck of writing to the log is avoided. +

    +
  2. +
  3. +

    + Less total writing takes place. If a single record is modified more + than once, or modified and deleted, then only the final result must + be written. If a record is inserted and deleted before a + database sync or close occurs, nothing at all is written to disk. + The same advantage holds for writing internal index + information. +

    +
  4. +
+
+

+ Deferred write databases are useful for applications that perform a + great deal of database modifications, record additions, deletions, and + so forth. By delaying the data write, you delay the disk I/O. Depending + on your workload, this can improve your data throughput by quite a lot. +

+

+ While the durability of a deferred write database is only + guaranteed when + Database.sync() + is called or the database is properly closed, writing may also occur at other times. + For example, a JE checkpoint will effectively perform a + Database.sync() on all deferred + write databases that are open at the time of the checkpoint. If you are + using deferred write to load a large data set, and you want to reduce + writing as much as possible during the load, consider disabling the JE checkpointer. +

+

+ Also, if the JE cache overflows as database modifications occur, information discarded + from the cache is written to disk in order to avoid losing the changes. If you wish to reduce this + writing to a minimum, configure your cache to be large enough to hold the entire + data set being modified, or as large as possible. +

+
+

Note

+

+ Despite the examples noted in the previous paragraphs, there is no guarantee that changes + to a deferred write database are durable unless Database.sync() + is called or the database is closed. If you need guaranteed + durability for an operation, consider using transactions instead of deferred write. +

+
+

+ You should also be aware that Database.sync() is a + relatively expensive operation because all outstanding changes to the + database are written, including internal index information. If you find + that you are calling Database.sync() + frequently, consider using transactions. +

+

+ All other rules of behavior pertain to deferred write databases + as they do to normal databases. Deferred write databases must be + named and created just as you would a normal database. If you want to + delete the deferred write database, you must remove it just as + you would a normal database. This is true even if the deferred + write database is empty because its name persists in the + environment's namespace until such a time as the database is + removed. +

+

+ Note that determining whether a database is deferred write is a + configuration option. It is therefore possible to switch a + database between "normal" mode and deferred write database. You + might want to do this if, for example, you want to load a lot + of data to the database. In this case, loading data to the + database while it is in deferred write state is faster than + in "normal" state, because you can avoid a lot of the normal disk + I/O overhead during the load process. Once the load is + complete, sync the database, close it, and and then reopen it + as a normal database. You can then continue operations + as if the database had been created as a "normal" database. +

+

+ To configure a database as deferred write, set + DatabaseConfig.setDeferredWrite() + to true and then open the database with + that DatabaseConfig option. +

+
+

Note

+

+ If you are using the DPL, then you configure your entire + store to be deferred write using + StoreConfig.setDeferredWrite(). + You can also sync every database in your store using + EntityStore.sync(). +

+
+

+ For example, the following code fragment opens and closes a + deferred write database: +

+
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+...
+
+Environment myDbEnvironment = null;
+Database myDatabase = null;
+
+...
+
+try {
+    // Open the environment. Create it if it does not already exist.
+    EnvironmentConfig envConfig = new EnvironmentConfig();
+    envConfig.setAllowCreate(true);
+    myDbEnvironment = new Environment(new File("/export/dbEnv"), 
+                                      envConfig);
+
+    // Open the database. Create it if it does not already exist.
+    DatabaseConfig dbConfig = new DatabaseConfig();
+    dbConfig.setAllowCreate(true);
+    // Make it deferred write
+    dbConfig.setDeferredWrite(true);
+    myDatabase = myDbEnvironment.openDatabase(null, 
+                                              "sampleDatabase", 
+                                              dbConfig); 
+
+    ...
+    // do work
+    ...
+    // Do this when you want the work to be persistent at a
+    // specific point, prior to closing the database.
+    myDatabase.sync();
+
+    // then close the database and environment here
+    // (described later in this chapter).
+
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+}
+
+
+
+
+
+

Temporary Databases

+
+
+
+

+ By default, all JE databases are durable; that is, the data that you put in them + will remain in them across program runs, unless you explicitly delete the data. + However, it is possible to configure a + temporary database that is not durable. A temporary database is + automatically deleted when it is closed or after a crash occurs. +

+

+ Temporary databases are essentially in-memory only databases. Therefore, + they are particularly useful for applications that want databases which + are truly temporary. +

+

+ Note that temporary databases do not always avoid disk I/O. It is particularly + important to realize that temporary databases can page to disk if the cache is not + large enough to hold the database's entire contents. Therefore, temporary database + performance is best when your in-memory cache is large enough to hold the database's + entire data-set. +

+

+ A temporary database operates internally in deferred write mode and has + the same performance advantages as described above for deferred write + databases (see Deferred Write Databases). + However, unlike deferred write databases, a temporary database is not written + during checkpoints and this provides an additional performance advantage. +

+

+ Temporary databases must be named and created just as you would a normal database. + To configure a database as temporary, set + DatabaseConfig.setTemporary to + true and then open the database with that + DatabaseConfig instance. +

+

+ For example: +

+
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+...
+
+Environment myDbEnvironment = null;
+Database myDatabase = null;
+
+...
+
+try {
+    // Open the environment. Create it if it does not already exist.
+    EnvironmentConfig envConfig = new EnvironmentConfig();
+    envConfig.setAllowCreate(true);
+    myDbEnvironment = new Environment(new File("/export/dbEnv"), 
+                                      envConfig);
+
+    // Open the database. Create it if it does not already exist.
+    DatabaseConfig dbConfig = new DatabaseConfig();
+    dbConfig.setAllowCreate(true);
+    // Make it a temporary database
+    dbConfig.setTemporary(true);
+    myDatabase = myDbEnvironment.openDatabase(null, 
+                                              "sampleDatabase", 
+                                              dbConfig); 
+
+    ...
+    // do work
+    ...
+
+    // then close the database and environment here
+    // (see the next section)
+
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+}
+
+
+
+
+
+

Closing Databases

+
+
+
+

Once you are done using the database, you must close it. You use the + Database.close() method to do this.

+

Closing a database causes it to become unusable until it is opened + again. If any cursors are opened for the database, + JE warns you about the open cursors, and then closes them for you. + Active cursors during a database + close can cause unexpected results, especially if any of those cursors are + writing to the database in another thread. You should always make sure that all your + database accesses have completed before closing your database.

+

It is recommended that you close all your + databases before closing the environment to which they belong.

+

Cursors are described in Using Cursors later in this manual.

+

+ The following illustrates database and environment close: +

+ +
import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.Environment;
+
+...
+
+try {
+        if (myDatabase != null) {
+            myDatabase.close();
+        }
+
+        if (myDbEnvironment != null) {
+            myDbEnvironment.close();
+        }
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+} 
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/dbUsage.html b/docs/GettingStartedGuide/dbUsage.html new file mode 100644 index 0000000..077194f --- /dev/null +++ b/docs/GettingStartedGuide/dbUsage.html @@ -0,0 +1,203 @@ + + + + + + Database Example + + + + + + + + + +
+
+
+
+

Database Example

+
+
+
+

In Database Environment Management Example we created a class that manages an + Environment. We now extend that class to allow it + to open and manage multiple databases. Again, remember that you can find + this class in: +

+
JE_HOME/je/gettingStarted/MyDbEnv.java
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+ +

+ Example 7.1 Database Management with MyDbEnv +

+
+

First, we need to import a few additional classes, and setup some global variables to support databases. + The databases that we are configuring and creating here are used by applications developed in examples later in this guide.

+ +
// File MyDbEnv.java
+
+package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.Database; 
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.Environment;
+
+import java.io.File;
+
+public class MyDbEnv {
+    
+    private Environment myEnv;
+    private Database vendorDb;
+    private Database inventoryDb;
+
+    public MyDbEnv() {} 
+

+ + Next we need to update the MyDbEnv.setup() method to instantiate a + DatabaseConfig object. We also need to set some properties on that object. These property + values are determined by the value of the readOnly parameter. We want our databases to be + read-only if the environment is also read-only. We also want to allow our databases to be created if the databases + are not read-only. + +

+ +
    public void setup(File envHome, boolean readOnly)
+            throws DatabaseException {
+
+        // Instantiate an environment and database configuration object
+        EnvironmentConfig myEnvConfig = new EnvironmentConfig();
+        DatabaseConfig myDbConfig = new DatabaseConfig();
+        // Configure the environment and databases for the read-only
+        // state as identified by the readOnly parameter on this 
+        // method call.
+        myEnvConfig.setReadOnly(readOnly);
+        myDbConfig.setReadOnly(readOnly);
+        // If the environment is opened for write, then we want to be
+        // able to create the environment and databases if 
+        // they do not exist.
+        myEnvConfig.setAllowCreate(!readOnly);
+        myDbConfig.setAllowCreate(!readOnly);
+
+        // Instantiate the Environment. This opens it and also possibly
+        // creates it.
+        myEnv = new Environment(envHome, myEnvConfig);
+
+        // Now create and open our databases.
+        vendorDb = myEnv.openDatabase(null,
+                                       "VendorDB",
+                                       myDbConfig); 
+
+        inventoryDb = myEnv.openDatabase(null,
+                                         "InventoryDB",
+                                         myDbConfig);
+    } 
+

+ Next we need some additional getter methods used to return our database handles. +

+ +
     // Getter methods
+    public Environment getEnvironment() {
+        return myEnv;
+    }
+
+    public Database getVendorDB() {
+        return vendorDb;
+    }
+
+    public Database getInventoryDB() {
+        return inventoryDb;
+    } 
+

+ Finally, we need to update the MyDbEnv.close() method to close our databases. +

+ +
    // Close the environment
+    public void close() {
+        if (myEnv != null) {
+            try {
+                vendorDb.close();
+                inventoryDb.close();
+                myEnv.close();
+            } catch(DatabaseException dbe) {
+                System.err.println("Error closing MyDbEnv: " + 
+                                    dbe.toString());
+                System.exit(-1);
+            }
+        }
+    }
+}
+

We can now use MyDbEnv to open and close + both database environments and databases from the appropriate place in + our application. For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Database;
+
+import java.io.File;
+
+...
+
+MyDbEnv exampleDbEnv = new MyDbEnv();
+
+try {
+    exampleDbEnv.setup(new File("/directory/currently/exists"), true);
+    Database vendorDb = exampleDbEnv.getVendorDB();
+    Database inventoryDB = exampleDbEnv.getInventoryDB();
+
+    ...
+
+} catch(DatabaseException dbe) {
+    // Error code goes here
+} finally {
+    exampleDbEnv.close();
+} 
+
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/dbenvUsageExample.html b/docs/GettingStartedGuide/dbenvUsageExample.html new file mode 100644 index 0000000..57af62c --- /dev/null +++ b/docs/GettingStartedGuide/dbenvUsageExample.html @@ -0,0 +1,180 @@ + + + + + + Database Environment Management Example + + + + + + + + + +
+
+
+
+

Database Environment Management Example

+
+
+
+

+ This example provides a complete class that can open and close an environment. It is + both extended and used in subsequent examples in this book to open and close both + environments and databases. We do this so as to make the example code + shorter and easier to manage. You can find this class in: +

+
JE_HOME/examples/je/gettingStarted/MyDbEnv.java
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+ +

+ Example 2.1 Database Environment Management Class +

+
+

First we write the normal class declarations. We also set up some + private data members that are used to manage environment creation. We + use the class constructor to instantiate the EnvironmentConfig + object that is used to configure our environment when we open it.

+ +
// File MyDbEnv.java
+package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+
+
+public class MyDbEnv {
+
+    private Environment myEnv;
+
+    public MyDbEnv() {} 
+

Next we need a method to open the environment. This is responsible + for instantiating our Environment object. + Remember that instantiation is what opens the environment (or creates it + if the creation property is set to true and the + environment does not currently exist). +

+ +
    public void setup(File envHome, boolean readOnly) 
+            throws DatabaseException {
+
+        // Instantiate an environment configuration object
+        EnvironmentConfig myEnvConfig = new EnvironmentConfig();
+        // Configure the environment for the read-only state as identified
+        // by the readOnly parameter on this method call.
+        myEnvConfig.setReadOnly(readOnly);
+        // If the environment is opened for write, then we want to be 
+        // able to create the environment if it does not exist.
+        myEnvConfig.setAllowCreate(!readOnly);
+
+        // Instantiate the Environment. This opens it and also possibly
+        // creates it.
+        myEnv = new Environment(envHome, myEnvConfig);
+    } 
+

+ Next we provide a getter method that allows us to retrieve the + Environment directly. This is needed for later + examples in this guide. +

+ +
    // Getter methods
+    public Environment getEnv() {
+        return myEnv;
+    } 
+

Finally, we need a method to close our Environment. + We wrap this operation in a try block so that it can + be used gracefully in a finally statement.

+ +
    // Close the environment
+    public void close() {
+        if (myEnv != null) {
+            try {
+                myEnv.close();
+            } catch(DatabaseException dbe) {
+                System.err.println("Error closing environment" + 
+                     dbe.toString());
+            }
+        }
+    }
+} 
+

+ This completes the MyDbEnv class. While not particularly useful + as it currently exists, we will build upon it throughout this book so that it will + eventually open and close all of the entity stores or databases required by our + applications. +

+

+ We can now use MyDbEnv to open and close a database environment + from the appropriate place in our application. For example: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+
+import java.io.File;
+
+...
+
+MyDbEnv exampleDbEnv = new MyDbEnv();
+
+try {    
+    exampleDbEnv.setup(new File("/directory/currently/exists"), true);
+    ...
+
+} catch(DatabaseException dbe) {
+    // Error code goes here
+} finally {
+    exampleDbEnv.close();
+} 
+
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/dbprops.html b/docs/GettingStartedGuide/dbprops.html new file mode 100644 index 0000000..70cf284 --- /dev/null +++ b/docs/GettingStartedGuide/dbprops.html @@ -0,0 +1,164 @@ + + + + + + Database Properties + + + + + + + + + +
+
+
+
+

Database Properties

+
+
+
+

You can set database properties using the DatabaseConfig + class. For each of the properties that you can set, there is a + corresponding getter method. Also, you can always retrieve the + DatabaseConfig object used by your database using + the Database.getConfig() method.

+

The database properties that you can set are:

+
+
    +
  • +

    + DatabaseConfig.setAllowCreate() +

    +

    If true, the database is created when it is + opened. If false, the database open fails if the database does not + exist. This property has no meaning if the database currently exists. + Default is false.

    +
  • +
  • +

    + DatabaseConfig.setBtreeComparator() +

    +

    Sets the class that is used to compare the keys found on two + database records. This class is used to determine the sort order for + two records in the database. By default, byte for byte comparison is + used. + For more information, see + Using Comparators. + +

    +
  • +
  • +

    + DatabaseConfig.setDuplicateComparator() +

    +

    + Sets the class that is used to compare two duplicate records in + the database. For more information, see + Using Comparators. + +

    +
  • +
  • +

    + DatabaseConfig.setSortedDuplicates() +

    +

    If true, duplicate records are allowed in the + database. If this value is false, then putting a duplicate record into the database + results in an error return from the put call. + Note that this property can be set only at database creation time. Default is false. +

    +

    + Note that your database must not support duplicates if it is to be associated with one or more + secondary indices. Secondaries are described in Secondary Databases. +

    +
  • +
  • +

    + DatabaseConfig.setExclusiveCreate() +

    +

    If true, the database open fails if the + database currently exists. That is, the open must result in the + creation of a new database. Default is false.

    +
  • +
  • +

    + DatabaseConfig.setReadOnly() +

    +

    If true, the database is opened for read activities only. + Default is false.

    +
  • +
  • +

    + DatabaseConfig.setTransactional() +

    +

    If true, the database supports transactions. + Default is false. Note that a database cannot support + transactions if the environment is non-transactional.

    +
  • +
+
+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+
+...
+// Environment open omitted for brevity
+...
+
+Database myDatabase = null;
+try {
+    DatabaseConfig dbConfig = new DatabaseConfig();
+    dbConfig.setAllowCreate(true);
+    dbConfig.setSortedDuplicates(true);
+    myDatabase = 
+        myDbEnv.openDatabase(null, 
+                             "sampleDatabase", 
+                             dbConfig); 
+} catch (DatabaseException dbe) {
+    // Exception handling goes here.
+}
+
+ + + diff --git a/docs/GettingStartedGuide/dbtUsage.html b/docs/GettingStartedGuide/dbtUsage.html new file mode 100644 index 0000000..1d78112 --- /dev/null +++ b/docs/GettingStartedGuide/dbtUsage.html @@ -0,0 +1,693 @@ + + + + + + Database Record Example + + + + + + + + + +
+
+
+
+

Database Record Example

+
+
+
+

In Database Example, we created + MyDbEnv, a class that manages + DatabaseEnvironment and Database + opens and closes. We will now write an application that takes advantage of + this class to open databases, put a series of records in them, and then + close the databases and environment.

+

Remember that all of the classes and programs presented here can be + found in the following directory: +

+
JE_HOME/examples/je/gettingStarted
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+

Note that in this example, we are going to save two types of + information. First there are a series of inventory records that identify + information about some food items (fruits, vegetables, and desserts). + These records identify particulars about each item such as the vendor that + the item can be obtained from, how much the vendor has in stock, the price + per unit, and so forth.

+

+ We also want to manage vendor contact information, such as the + vendor's address and phone number, the sales representative's name + and his phone number, and so forth. +

+
+ +

+ Example 8.1 Inventory.java +

+
+

+ All Inventory data is encapsulated in an instance of the following + class. Note that because this class is not serializable, we need a + custom tuple binding in order to place it on a DatabaseEntry + object. Because the TupleInput and + TupleOutput classes used by custom tuple bindings + support Java numerical types and not Java numerical classes, we use + int and float here instead of the + corresponding Integer and Float + classes. + +

+ +
// File Inventory.java
+package je.gettingStarted;
+
+public class Inventory {
+
+    private String sku;
+    private String itemName;
+    private String category;
+    private String vendor;
+    private int vendorInventory;
+    private float vendorPrice;
+
+    public void setSku(String data) {
+            sku = data;
+    }
+
+    public void setItemName(String data) {
+            itemName = data;
+    }
+
+    public void setCategory(String data) {
+            category = data;
+    }
+
+    public void setVendorInventory(int data) {
+            vendorInventory = data;
+    }
+
+    public void setVendor(String data) {
+            vendor = data;
+    }
+
+    public void setVendorPrice(float data) {
+            vendorPrice = data;
+    }
+
+    public String getSku() { return sku; }
+    public String getItemName() { return itemName; }
+    public String getCategory() { return category; }
+    public int getVendorInventory() { return vendorInventory; }
+    public String getVendor() { return vendor; }
+    public float getVendorPrice() { return vendorPrice; }
+
+} 
+
+
+
+
+ +

+ Example 8.2 Vendor.java +

+
+

+ The data for vendor records are stored in instances of the following + class. Notice that we are using serialization with this class simply + to demonstrate serializing a class instance. +

+ +
// File Vendor.java
+package je.gettingStarted;
+
+import java.io.Serializable;
+
+public class Vendor implements Serializable {
+
+    private String repName;
+    private String address;
+    private String city;
+    private String state;
+    private String zipcode;
+    private String bizPhoneNumber;
+    private String repPhoneNumber;
+    private String vendor;
+
+    public void setRepName(String data) {
+        repName = data;
+    }
+
+    public void setAddress(String data) {
+        address = data;
+    }
+
+    public void setCity(String data) {
+        city = data;
+    }
+
+    public void setState(String data) {
+        state = data;
+    }
+
+    public void setZipcode(String data) {
+        zipcode = data;
+    }
+
+    public void setBusinessPhoneNumber(String data) {
+        bizPhoneNumber = data;
+    }
+
+    public void setRepPhoneNumber(String data) {
+        repPhoneNumber = data;
+    }
+
+    public void setVendorName(String data) {
+        vendor = data;
+    }
+
+    ...
+    // Corresponding getter methods omitted for brevity.
+    // See examples/je/gettingStarted/Vendor.java
+    // for a complete implementation of this class.
+
+} 
+
+
+
+

+ Because we will not be using serialization to convert our + Inventory objects to a DatabaseEntry + object, we need a custom tuple binding: +

+
+ +

+ Example 8.3 InventoryBinding.java +

+
+ +
// File InventoryBinding.java
+package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class InventoryBinding extends TupleBinding {
+
+    // Implement this abstract method. Used to convert
+    // a DatabaseEntry to an Inventory object.
+    public Object entryToObject(TupleInput ti) {
+
+        String sku = ti.readString();
+        String itemName = ti.readString();
+        String category = ti.readString();
+        String vendor = ti.readString();
+        int vendorInventory = ti.readInt();
+        float vendorPrice = ti.readFloat();
+
+        Inventory inventory = new Inventory();
+        inventory.setSku(sku);
+        inventory.setItemName(itemName);
+        inventory.setCategory(category);
+        inventory.setVendor(vendor);
+        inventory.setVendorInventory(vendorInventory);
+        inventory.setVendorPrice(vendorPrice);
+
+        return inventory;
+    }
+
+    // Implement this abstract method. Used to convert a
+    // Inventory object to a DatabaseEntry object.
+    public void objectToEntry(Object object, TupleOutput to) {
+
+        Inventory inventory = (Inventory)object;
+
+        to.writeString(inventory.getSku());
+        to.writeString(inventory.getItemName());
+        to.writeString(inventory.getCategory());
+        to.writeString(inventory.getVendor());
+        to.writeInt(inventory.getVendorInventory());
+        to.writeFloat(inventory.getVendorPrice());
+    }
+} 
+
+
+
+

In order to store the data identified above, we write the + ExampleDatabasePut application. This application + loads the inventory and vendor databases for you.

+

Inventory information is stored in a Database + dedicated for that purpose. The key for each such record is a product SKU. + The inventory data stored in this database are objects of the + Inventory class (see Inventory.java for more information). + ExampleDatabasePut loads the inventory database + as follows:

+
+
    +
  1. +

    Reads the inventory data from a flat text file prepared in + advance for this purpose.

    +
  2. +
  3. +

    Uses java.lang.String to create a key + based on the item's SKU.

    +
  4. +
  5. +

    Uses an Inventory class instance for the + record data. This object is stored on a DatabaseEntry + object using InventoryBinding, a custom tuple + binding that we implemented above.

    +
  6. +
  7. +

    Saves each record to the inventory database.

    +
  8. +
+
+

Vendor information is also stored in a Database + dedicated for that purpose. The vendor data stored in this database are objects of the + Vendor class (see Vendor.java for more information). To load this + Database, ExampleDatabasePut + does the following:

+
+
    +
  1. +

    Reads the vendor data from a flat text file prepared in advance + for this purpose.

    +
  2. +
  3. +

    Uses the vendor's name as the record's key.

    +
  4. +
  5. +

    Uses a Vendor class instance for the + record data. This object is stored on a DatabaseEntry + object using com.sleepycat.bind.serial.SerialBinding.

    +
  6. +
+
+
+ +

+ Example 8.4 Stored Class Catalog Management with MyDbEnv +

+
+

+ Before we can write ExampleDatabasePut, we need to update + MyDbEnv.java to support the class catalogs that we need for this application. +

+

+ To do this, we start by importing an additional class to support stored class catalogs: +

+ +
// File MyDbEnv.java
+package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.Environment;
+
+import java.io.File;
+
+import com.sleepycat.bind.serial.StoredClassCatalog; 
+

+ We also need to add two additional private data members to this class. One supports the database used for the class + catalog, and the other is used as a handle for the class catalog itself. +

+ +
public class MyDbEnv {
+
+    private Environment myEnv;
+    private Database vendorDb;
+    private Database inventoryDb;
+    private Database classCatalogDb;
+
+    // Needed for object serialization
+    private StoredClassCatalog classCatalog;
+
+    public MyDbEnv() {} 
+

+ Next we need to update the MyDbEnv.setup() method to open the class catalog database and + create the class catalog. +

+ +
    public void setup(File envHome, boolean readOnly)
+            throws DatabaseException {
+
+        ...
+        // Database and environment configuration omitted for brevity
+        ...
+
+        // Instantiate the Environment. This opens it and also possibly
+        // creates it.
+        myEnv = new Environment(envHome, myEnvConfig);
+
+        // Now create and open our databases.
+        vendorDb = myEnv.openDatabase(null, "VendorDB", myDbConfig);
+
+        inventoryDb = myEnv.openDatabase(null, "InventoryDB", myDbConfig);
+
+        // Open the class catalog db. This is used to
+        // optimize class serialization.
+        classCatalogDb =
+            myEnv.openDatabase(null,
+                               "ClassCatalogDB",
+                               myDbConfig);
+
+        // Create our class catalog
+        classCatalog = new StoredClassCatalog(classCatalogDb);
+    } 
+

+ Next we need a getter method to return the class catalog. Note that we do not provide a getter for + the catalog database itself – our application has no need for that. +

+ +
// Getter methods
+    public Environment getEnvironment() {
+        return myEnv;
+    }
+
+    public Database getVendorDB() {
+        return vendorDb;
+    }
+
+    public Database getInventoryDB() {
+        return inventoryDb;
+    }
+
+    public StoredClassCatalog getClassCatalog() {
+        return classCatalog;
+    } 
+

+ Finally, we need to update the MyDbEnv.close() method to close the + class catalog database. +

+ +
    // Close the environment
+    public void close() {
+        if (myEnv != null) {
+            try {
+                vendorDb.close();
+                inventoryDb.close();
+                classCatalogDb.close()
+                myEnv.close();
+            } catch(DatabaseException dbe) {
+                System.err.println("Error closing MyDbEnv: " +
+                                    dbe.toString());
+                System.exit(-1);
+            }
+        }
+    }
+}
+
+
+
+

+ So far we have identified the data that we want to store in our + databases and how we will convert that data in and out of + DatabaseEntry objects for database storage. We + have also updated MyDbEnv to manage our databases + for us. Now we write ExampleDatabasePut to + actually put the inventory and vendor data into their respective + databases. Because of the work that we have done so far, this + application is actually fairly simple to write. +

+
+ +

+ Example 8.5 ExampleDatabasePut.java +

+
+

First we need the usual series of import statements:

+ +
//File ExampleDatabasePut.java
+package je.gettingStarted;
+
+// Bind classes used to move class objects in an out of byte arrays.
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.serial.SerialBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+
+// Standard JE database imports
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+
+// Most of this is used for loading data from a text file for storage
+// in the databases.
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+

Next comes the class declaration and the private data members that + we need for this class. Most of these are setting up default values for + the program.

+

Note that two DatabaseEntry objects are + instantiated here. We will reuse these for every database operation that + this program performs. Also a MyDbEnv object is + instantiated here. We can do this because its constructor never throws + an exception. See Stored Class Catalog Management with MyDbEnv for + its implementation details.

+

Finally, the inventory.txt and + vendors.txt file can be found in the GettingStarted + examples directory along with the classes described in this extended + example.

+ +
public class ExampleDatabasePut {
+
+    private static File myDbEnvPath = new File("/tmp/JEDB");
+    private static File inventoryFile = new File("./inventory.txt");
+    private static File vendorsFile = new File("./vendors.txt");
+
+    // DatabaseEntries used for loading records
+    private static DatabaseEntry theKey = new DatabaseEntry();
+    private static DatabaseEntry theData = new DatabaseEntry();
+
+    // Encapsulates the environment and databases.
+    private static MyDbEnv myDbEnv = new MyDbEnv();
+

+ Next comes the usage() and + main() methods. Notice the exception handling + in the main() method. This is the only place in the application where we + catch exceptions. For this reason, we must catch + DatabaseException which is thrown by the + com.sleepycat.je.* classes. +

+

Also notice the call to MyDbEnv.close() + in the finally block. This is the only place in the + application where MyDbEnv.close() is called. + MyDbEnv.close() is responsible for closing the + Environment and all open Database + handles for you.

+ +
    private static void usage() {
+        System.out.println("ExampleDatabasePut [-h <env directory>]");
+        System.out.println("    [-s <selections file>]");
+        System.out.println("    [-v <vendors file>]");
+        System.exit(-1);
+    }
+
+    public static void main(String args[]) {
+        ExampleDatabasePut edp = new ExampleDatabasePut();
+        try {
+            edp.run(args);
+        } catch (DatabaseException dbe) {
+            System.err.println("ExampleDatabasePut: " + dbe.toString());
+            dbe.printStackTrace();
+        } catch (Exception e) {
+            System.err.println("Exception: " + e.toString());
+            e.printStackTrace();
+        } finally {
+            myDbEnv.close();
+        }
+        System.out.println("All done.");
+    } 
+

Next we write the ExampleDatabasePut.run() + method. This method is responsible for initializing all objects. + Because our environment and databases are all opened using the + MyDbEnv.setup() method, ExampleDatabasePut.run() + method is only responsible for calling MyDbEnv.setup() and then calling + the ExampleDatabasePut methods that actually load the databases. +

+ +
    private void run(String args[]) throws DatabaseException {
+        // Parse the arguments list
+        parseArgs(args);
+
+        myDbEnv.setup(myDbEnvPath, // path to the environment home
+                      false);      // is this environment read-only?
+
+        System.out.println("loading vendors db.");
+        loadVendorsDb();
+        System.out.println("loading inventory db.");
+        loadInventoryDb();
+    } 
+

This next method loads the vendor database. This method + uses serialization to convert the Vendor object + to a DatabaseEntry object.

+ +
   private void loadVendorsDb() 
+            throws DatabaseException {
+
+        // loadFile opens a flat-text file that contains our data
+        // and loads it into a list for us to work with. The integer
+        // parameter represents the number of fields expected in the
+        // file.
+        List<String[]> vendors = loadFile(vendorsFile, 8);
+
+        // Now load the data into the database. The vendor's name is the
+        // key, and the data is a Vendor class object.
+
+        // Need a serial binding for the data
+        EntryBinding dataBinding =
+            new SerialBinding(myDbEnv.getClassCatalog(), Vendor.class);
+
+        for (int i = 0; i < vendors.size(); i++) {
+            String[] sArray = vendors.get(i);
+            Vendor theVendor = new Vendor();
+            theVendor.setVendorName(sArray[0]);
+            theVendor.setAddress(sArray[1]);
+            theVendor.setCity(sArray[2]);
+            theVendor.setState(sArray[3]);
+            theVendor.setZipcode(sArray[4]);
+            theVendor.setBusinessPhoneNumber(sArray[5]);
+            theVendor.setRepName(sArray[6]);
+            theVendor.setRepPhoneNumber(sArray[7]);
+
+            // The key is the vendor's name.
+            // ASSUMES THE VENDOR'S NAME IS UNIQUE!
+            String vendorName = theVendor.getVendorName();
+            try {
+                theKey = new DatabaseEntry(vendorName.getBytes("UTF-8"));
+            } catch (IOException willNeverOccur) {}
+
+            // Convert the Vendor object to a DatabaseEntry object
+            // using our SerialBinding
+            dataBinding.objectToEntry(theVendor, theData);
+
+            // Put it in the database. These puts are transactionally
+            // protected (we're using autocommit).
+            myDbEnv.getVendorDB().put(null, theKey, theData);
+        }
+    } 
+

Now load the inventory database. This method uses our + custom tuple binding (see InventoryBinding.java) to convert the Inventory + object to a DatabaseEntry object.

+ +
    private void loadInventoryDb() 
+        throws DatabaseException {
+
+        // loadFile opens a flat-text file that contains our data
+        // and loads it into a list for us to work with. The integer
+        // parameter represents the number of fields expected in the
+        // file.
+        List<String[]> inventoryArray = loadFile(inventoryFile, 6);
+
+        // Now load the data into the database. The item's sku is the
+        // key, and the data is an Inventory class object.
+
+        // Need a tuple binding for the Inventory class.
+        TupleBinding inventoryBinding = new InventoryBinding();
+
+        for (int i = 0; i < inventoryArray.size(); i++) {
+            String[] sArray = inventoryArray.get(i);
+            String sku = sArray[1];
+            try {
+                theKey = new DatabaseEntry(sku.getBytes("UTF-8"));
+            } catch (IOException willNeverOccur) {}
+
+            Inventory theInventory = new Inventory();
+            theInventory.setItemName(sArray[0]);
+            theInventory.setSku(sArray[1]);
+            theInventory.setVendorPrice(
+                            (new Float(sArray[2])).floatValue());
+            theInventory.setVendorInventory(
+                            (new Integer(sArray[3])).intValue());
+            theInventory.setCategory(sArray[4]);
+            theInventory.setVendor(sArray[5]);
+
+            // Place the Vendor object on the DatabaseEntry object using
+            // our the tuple binding we implemented in 
+            // InventoryBinding.java
+            inventoryBinding.objectToEntry(theInventory, theData);
+
+            // Put it in the database.
+            myDbEnv.getInventoryDB().put(null, theKey, theData);
+
+        }
+    }
+

The remainder of this application provides utility methods to + read a flat text file into an array of strings and parse the + command line options. From the perspective of this document, these + things are relatively uninteresting. You can see how they are + implemented by looking at: +

+
JE_HOME/examples/je/gettingStarted/ExampleDataPut.java 
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+ +
    private static void parseArgs(String args[]) {
+        // Implementation omitted for brevity.
+    }
+
+    private List loadFile(File theFile, int numFields) {
+        List<String[]> records = new ArrayList<String[]>();
+        // Implementation omitted for brevity.
+        return records;
+    }
+
+    protected ExampleDatabasePut() {}
+} 
+
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/diskthreshold.html b/docs/GettingStartedGuide/diskthreshold.html new file mode 100644 index 0000000..14fef3d --- /dev/null +++ b/docs/GettingStartedGuide/diskthreshold.html @@ -0,0 +1,124 @@ + + + + + + Setting Disk Thresholds + + + + + + + + + +
+
+
+
+

Setting Disk Thresholds

+
+
+
+

+ You can control the maximum amount of disk space that JE can use by setting two different + threshold values. If JE exceeds either of these threshold values, writes will no longer + be allowed to the database. Instead, when a write is attempted, DiskLimitException is thrown. + The thresholds you can set are: +

+
+
    +
  • +

    + EnvironmentConfig.MAX_DISK +

    +

    + Specifies an upper limit on the total number of bytes that can be used for data storage. + By default, this property is set to 0, which means no upper + limit is enforced. Instead, the value set for EnvironmentConfig.FREE_DISK will control your + how much disk space your database is allowed to consume. +

    +

    + If multiple JE environments share the same storage volume, Oracle recommends that you + set EnvironmentConfig.MAX_DISK to a non-zero value, especially if an external application or service is + also consuming space on the disk volume. +

    +

    + This value can be managed using the EnvironmentMutableConfig.setMaxDisk() method. +

    +
  • +
  • +

    + EnvironmentConfig.FREE_DISK +

    +

    + Specifies the minimum amount of free space to maintain on the disk volume. The + default value is 5 GB, which is large enough to allow manual recovery if the + free space threshold is exceeded. +

    +

    + If EnvironmentConfig.MAX_DISK is set to 0, then the total amount of + space your JE database can consume is: +

    +
    <disk_size> - <FREE_DISK>
    +

    + So for a 300 GB volume and a free disk size of 5 GB, your database can grow + to consume 295 GB. +

    +

    + If EnvironmentConfig.MAX_DISK is set to a non-zero value, then the total amount of space + your JE database can consume is: +

    +
    <MAX_DISK> - <FREE_DISK>
    +

    + So for the same 300 GB volume, if max disk is 100 GB and free disk is 5 GB, then + your database can consume at most 95 GB. +

    +

    + Be aware that the subtraction shown, above, is performed only if EnvironmentConfig.FREE_DISK is explicitly + set or EnvironmentConfig.MAX_DISK is greater than 10GB. See the EnvironmentConfig.FREE_DISK Javadoc for more information. +

    +
  • +
+
+

+ For usage scenarios, see the EnvironmentConfig.MAX_DISK Javadoc. +

+
+ + + diff --git a/docs/GettingStartedGuide/dpl.html b/docs/GettingStartedGuide/dpl.html new file mode 100644 index 0000000..8784031 --- /dev/null +++ b/docs/GettingStartedGuide/dpl.html @@ -0,0 +1,279 @@ + + + + + + Part I. Programming with the Direct Persistence Layer + + + + + + + + + +
+
+
+
+

Part I. Programming with the Direct Persistence Layer

+
+
+
+
+
+

+ This section discusses how to build an + application using the DPL. The DPL is ideally + suited for those applications that want a + mechanism for storing and managing Java class + objects in a JE database. Note that the DPL + is best suited for applications that work with + classes with a relatively static schema. +

+

+ The DPL requires Java 1.5. +

+

+ If you are porting an application + from the Berkeley DB API, then you probably want + to use the base API instead of the DPL. For + information on using the base API, see + Programming with the Base API. +

+ +
+
+ + + diff --git a/docs/GettingStartedGuide/dpl_delete.html b/docs/GettingStartedGuide/dpl_delete.html new file mode 100644 index 0000000..775be78 --- /dev/null +++ b/docs/GettingStartedGuide/dpl_delete.html @@ -0,0 +1,114 @@ + + + + + + Deleting Entity Objects + + + + + + + + + +
+
+
+
+

Deleting Entity Objects

+
+
+
+

+ The simplest way to remove an object from your entity store + is to delete it by its primary index. For example, + using the SimpleDA class that we + created earlier in this document + (see SimpleDA.class), + you can delete the SimpleEntityClass + object with a primary key of keyone as + follows: +

+
sda.pIdx.delete("keyone");
+

+ You can also delete objects by their secondary keys. When + you do this, all objects related to the secondary key are + deleted, unless the key is a foreign object. +

+

+ For example, the following deletes all + SimpleEntityClass with a secondary + key of skeyone: +

+
sda.sIdx.delete("skeyone");
+

+ You can delete any single object by positioning a cursor to + that object and then calling the cursor's + delete() method. +

+
PrimaryIndex<String,SimpleEntityClass> pi =
+    store.getPrimaryIndex(String.class, SimpleEntityClass.class);
+
+SecondaryIndex<String,String,SimpleEntityClass> si = 
+    store.getSecondaryIndex(pi, String.class, "sKey");
+
+EntityCursor<SimpleEntityClass> sec_cursor = 
+    si.subIndex("skeyone").entities(); 
+
+try {
+    SimpleEntityClass sec;
+    Iterator<SimpleEntityClass> i = sec_cursor.iterator();
+    while (sec = i.nextDup() != null) {
+        if (sec.getSKey() == "some value") {
+            i.delete();
+        }
+    }
+// Always make sure the cursor is closed when we are done with it.
+} finally {
+    sec_cursor.close(); } 
+

+ Finally, if you are indexing by foreign key, then the + results of deleting the key is determined by the foreign + key constraint that you have set for the index. See + Foreign Key Constraints + for more information. +

+
+ + + diff --git a/docs/GettingStartedGuide/dpl_entityjoin.html b/docs/GettingStartedGuide/dpl_entityjoin.html new file mode 100644 index 0000000..f91091c --- /dev/null +++ b/docs/GettingStartedGuide/dpl_entityjoin.html @@ -0,0 +1,193 @@ + + + + + + Join Cursors + + + + + + + + + +
+
+
+
+

Join Cursors

+
+
+
+

+ If you have two or more secondary indexes set for + an entity object, then you can retrieve sets of + objects based on the intersection of multiple + secondary index values. You do this using an + EntityJoin + class. +

+

+ For example, suppose you had an entity class that + represented automobiles. In that case, you might + be storing information about automobiles such as + color, number of doors, fuel mileage, + automobile type, number of passengers, make, model, and year, + to name just a few. +

+

+ If you created a secondary index based this + information, then you could use an + EntityJoin to return + all those objects representing cars with, say, two + doors, that were built in 2002, and which are green + in color. +

+

+ To create a join cursor, you: +

+
+
    +
  1. +

    + Open the primary index for the + entity class on which you want to + perform the join. +

    +
  2. +
  3. +

    + Open the secondary indexes that you + want to use for the join. +

    +
  4. +
  5. +

    + Instantiate an + EntityJoin + object (you use the primary index + to do this). +

    +
  6. +
  7. +

    + Use two or more calls to + EntityJoin.addCondition() + to identify the secondary indexes + and their values that you want to use + for the equality match. +

    +
  8. +
  9. +

    + Call + EntityJoin.entities() + to obtain a cursor that you can use + to iterate over the join results. +

    +
  10. +
+
+

+ For example, suppose we had an entity class + that included the following features: +

+
package persist.gettingStarted;
+
+import com.sleepycat.persist.model.Entity;
+import com.sleepycat.persist.model.PrimaryKey;
+import static com.sleepycat.persist.model.Relationship.*;
+import com.sleepycat.persist.model.SecondaryKey;
+
+@Entity
+public class Automobiles {
+
+    // Primary key is the vehicle identification number
+    @PrimaryKey
+    private String vin;
+
+    // Secondary key is the vehicle's make
+    @SecondaryKey(relate=MANY_TO_ONE)
+    private String make;
+
+    // Secondary key is the vehicle's color
+    @SecondaryKey(relate=MANY_TO_ONE)
+    private String color;
+
+    ...
+
+    public String getVIN() {
+        return vin;
+    }
+
+    public String getMake() {
+        return make;
+    }
+
+    public String getColor() {
+        return color;
+    }
+    
+    ... 
+

+ Then we could perform an entity join that searches for all the + red automobiles made by Toyota as follows: +

+
+PrimaryIndex<String,Automobiles> vin_pidx;
+SecondaryIndex<String,String,Automobiles> make_sidx;
+SecondaryIndex<String,String,Automobiles> color_sidx;
+
+EntityJoin<String,Automobiles> join = new EntityJoin(vin_pidx);
+join.addCondition(make_sidx,"Toyota");
+join.addCondition(color_sidx,"Red");
+
+// Now iterate over the results of the join operation
+ForwardCursor<Automobiles> join_cursor = join.entities();
+try {
+    for (Automobiles autoi : join_cursor) {
+        // do something with each object "autoi"
+    }
+// Always make sure the cursor is closed when we are done with it.
+} finally {
+    join_cursor.close();
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/dpl_example.html b/docs/GettingStartedGuide/dpl_example.html new file mode 100644 index 0000000..12a4613 --- /dev/null +++ b/docs/GettingStartedGuide/dpl_example.html @@ -0,0 +1,275 @@ + + + + + + Chapter 6. A DPL Example + + + + + + + + + +
+
+
+
+

Chapter 6. A DPL Example

+
+
+
+
+

+ Table of Contents +

+
+
+ + Vendor.java + +
+
+ + Inventory.java + +
+
+ + MyDbEnv + +
+
+ + DataAccessor.java + +
+
+ + ExampleDatabasePut.java + +
+
+ + ExampleInventoryRead.java + +
+
+
+

+ In order to illustrate DPL usage, we provide a + complete working example in this chapter. This example + reads and writes inventory and vendor information for a + mythical business. The application consists of the + following classes: +

+
+ +
+

+ Be aware that this example can be found in your JE distribution in + the following location: +

+

+ JE_HOME/examples/persist/gettingStarted +

+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+
+
+
+

Vendor.java

+
+
+
+

+ The simplest class that our example wants to store contains + vendor contact information. This class contains no + secondary indices so all we have to do is identify it + as an entity class and identify the field in the + class used for the primary key. +

+

+ In the following example, we identify the + vendor data member as containing the + primary key. This data member is meant to contain a + vendor's name. Because of the way we will use our + EntityStore, the value + provided for this data member must be unique within + the store or runtime errors will result. +

+

+ When used with the DPL, our + Vendor class appears as + follows. Notice that the @Entity + annotation appears immediately before the class + declaration, and the @PrimaryKey + annotation appears immediately before the + vendor data member declaration. +

+
package persist.gettingStarted;
+
+import com.sleepycat.persist.model.Entity;
+import com.sleepycat.persist.model.PrimaryKey;
+
+@Entity
+public class Vendor {
+
+    private String address;
+    private String bizPhoneNumber;
+    private String city;
+    private String repName;
+    private String repPhoneNumber;
+    private String state;
+
+    // Primary key is the vendor's name
+    // This assumes that the vendor's name is
+    // unique in the database.
+    @PrimaryKey
+    private String vendor;
+
+    private String zipcode;
+
+    public void setRepName(String data) {
+        repName = data;
+    }
+
+    public void setAddress(String data) {
+        address = data;
+    }
+
+    public void setCity(String data) {
+        city = data;
+    }
+
+    public void setState(String data) {
+        state = data;
+    }
+
+    public void setZipcode(String data) {
+        zipcode = data;
+    }
+
+    public void setBusinessPhoneNumber(String data) {
+        bizPhoneNumber = data;
+    }
+
+    public void setRepPhoneNumber(String data) {
+        repPhoneNumber = data;
+    }
+
+    public void setVendorName(String data) {
+        vendor = data;
+    }
+
+    public String getRepName() {
+        return repName;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public String getZipcode() {
+        return zipcode;
+    }
+
+    public String getBusinessPhoneNumber() {
+        return bizPhoneNumber;
+    }
+
+    public String getRepPhoneNumber() {
+        return repPhoneNumber;
+    }
+} 
+

+ For this class, the vendor value is set for an individual + Vendor class object by + the setVendorName() + method. If our example code fails to set this + value before storing the object, the data + member used to store the primary key is set to a + null value. This would result in a runtime + error. +

+
+
+ + + diff --git a/docs/GettingStartedGuide/dpl_exampledatabaseput.html b/docs/GettingStartedGuide/dpl_exampledatabaseput.html new file mode 100644 index 0000000..5650a1c --- /dev/null +++ b/docs/GettingStartedGuide/dpl_exampledatabaseput.html @@ -0,0 +1,337 @@ + + + + + + ExampleDatabasePut.java + + + + + + + + + +
+
+
+
+

ExampleDatabasePut.java

+
+
+
+

+ Our example reads inventory and vendor information from + flat text files, encapsulates this data in objects of + the appropriate type, and then writes each object to an + EntityStore. +

+

+ To begin, we import the Java classes that our example + needs. Most of the imports are related to reading the raw + data from flat text files and breaking them apart for usage + with our data classes. We also import classes from the + JE package, but we do not actually import any classes + from the DPL. The reason why is because we have + placed almost all of our DPL work off into + other classes, so there is no need for direct usage of + those APIs here. +

+
package persist.gettingStarted;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.sleepycat.je.DatabaseException; 
+

+ Now we can begin the class itself. Here we set default paths + for the on-disk resources that we require (the environment + home, and the location of the text files containing our sample + data). We also declare DataAccessor + and MyDbEnv members. We describe these + classes and show their implementation in + DataAccessor.java + and + MyDbEnv. +

+
public class ExampleDatabasePut {
+
+    private static File myDbEnvPath = new File("/tmp/JEDB");
+    private static File inventoryFile = new File("./inventory.txt");
+    private static File vendorsFile = new File("./vendors.txt");
+
+    private DataAccessor da;
+
+    // Encapsulates the environment and data store.
+    private static MyDbEnv myDbEnv = new MyDbEnv();
+

+ Next, we provide our usage() + method. The command line options provided there are necessary + only if the default values to the on-disk resources are not + sufficient. +

+
    private static void usage() {
+        System.out.println("ExampleDatabasePut [-h <env directory>]");
+        System.out.println("      [-i <inventory file>]");
+        System.out.println("      [-v <vendors file>]");
+        System.exit(-1);
+    } 
+

+ Our main() method is also reasonably + self-explanatory. We simply instantiate an + ExampleDatabasePut object there and then + call its run() method. We also provide a + top-level try block there for any exceptions that might be thrown + during runtime. +

+

+ Notice that the finally statement in the + top-level try block calls + MyDbEnv.close(). This method closes our + EntityStore and Environment + objects. By placing it here in the finally + statement, we can make sure that our store and environment are + always cleanly closed. +

+
    public static void main(String args[]) {
+        ExampleDatabasePut edp = new ExampleDatabasePut();
+        try {
+            edp.run(args);
+        } catch (DatabaseException dbe) {
+            System.err.println("ExampleDatabasePut: " + dbe.toString());
+            dbe.printStackTrace();
+        } catch (Exception e) {
+            System.out.println("Exception: " + e.toString());
+            e.printStackTrace();
+        } finally {
+            myDbEnv.close();
+        }
+        System.out.println("All done.");
+    } 
+

+ Our run() method does four + things. It calls MyDbEnv.setup(), + which opens our Environment and + EntityStore. It then instantiates a + DataAccessor object, which we will use + to write data to the store. It calls + loadVendorsDb() which loads all of the + vendor information. And then it calls + loadInventoryDb() which loads all of + the inventory information. +

+

+ Notice that the MyDbEnv + object is being setup as read-write. This results in the + EntityStore being opened for + transactional support. + (See MyDbEnv + for implementation details.) +

+
    private void run(String args[])
+        throws DatabaseException {
+        // Parse the arguments list
+        parseArgs(args);
+
+        myDbEnv.setup(myDbEnvPath,  // Path to the environment home 
+                      false);       // Environment read-only?
+
+        // Open the data accessor. This is used to store
+        // persistent objects.
+        da = new DataAccessor(myDbEnv.getEntityStore());
+
+        System.out.println("loading vendors db....");
+        loadVendorsDb();
+
+        System.out.println("loading inventory db....");
+        loadInventoryDb();
+    } 
+

+ We can now implement the loadVendorsDb() + method. This method is responsible for reading the vendor + contact information from the appropriate flat-text file, + populating Vendor class objects with the + data and then writing it to the EntityStore. + As explained above, each individual object is written with + transactional support. However, because a transaction handle is + not explicitly used, the write is performed using auto-commit. + This happens because the EntityStore + was opened to support transactions. +

+

+ To actually write each class to the + EntityStore, we simply call the + PrimaryIndex.put() method for the + Vendor entity instance. We obtain this + method from our DataAccessor + class. +

+
    private void loadVendorsDb()
+            throws DatabaseException {
+
+        // loadFile opens a flat-text file that contains our data
+        // and loads it into a list for us to work with. The integer
+        // parameter represents the number of fields expected in the
+        // file.
+        List vendors = loadFile(vendorsFile, 8);
+
+        // Now load the data into the store.
+        for (int i = 0; i < vendors.size(); i++) {
+            String[] sArray = (String[])vendors.get(i);
+            Vendor theVendor = new Vendor();
+            theVendor.setVendorName(sArray[0]);
+            theVendor.setAddress(sArray[1]);
+            theVendor.setCity(sArray[2]);
+            theVendor.setState(sArray[3]);
+            theVendor.setZipcode(sArray[4]);
+            theVendor.setBusinessPhoneNumber(sArray[5]);
+            theVendor.setRepName(sArray[6]);
+            theVendor.setRepPhoneNumber(sArray[7]);
+
+            // Put it in the store.
+            da.vendorByName.put(theVendor);
+        }
+    } 
+

+ Now we can implement our loadInventoryDb() + method. This does exactly the same thing as the + loadVendorsDb() + method. +

+
    private void loadInventoryDb()
+        throws DatabaseException {
+
+        // loadFile opens a flat-text file that contains our data
+        // and loads it into a list for us to work with. The integer
+        // parameter represents the number of fields expected in the
+        // file.
+        List inventoryArray = loadFile(inventoryFile, 6);
+
+        // Now load the data into the store. The item's sku is the
+        // key, and the data is an Inventory class object.
+
+        for (int i = 0; i < inventoryArray.size(); i++) {
+            String[] sArray = (String[])inventoryArray.get(i);
+            String sku = sArray[1];
+
+            Inventory theInventory = new Inventory();
+            theInventory.setItemName(sArray[0]);
+            theInventory.setSku(sArray[1]);
+            theInventory.setVendorPrice(
+                (new Float(sArray[2])).floatValue());
+            theInventory.setVendorInventory(
+                (new Integer(sArray[3])).intValue());
+            theInventory.setCategory(sArray[4]);
+            theInventory.setVendor(sArray[5]);
+
+            // Put it in the store. Note that this causes our secondary key
+            // to be automatically updated for us.
+            da.inventoryBySku.put(theInventory);
+        }
+    } 
+

+ The remainder of this example simple parses the command line + and loads data from a flat-text file. There is nothing here + that is of specific interest to the DPL, but we + show this part of the example anyway in the interest of + completeness. +

+
    private static void parseArgs(String args[]) {
+        for(int i = 0; i < args.length; ++i) {
+            if (args[i].startsWith("-")) {
+                switch(args[i].charAt(1)) {
+                  case 'h':
+                    myDbEnvPath = new File(args[++i]);
+                    break;
+                  case 'i':
+                    inventoryFile = new File(args[++i]);
+                    break;
+                  case 'v':
+                    vendorsFile = new File(args[++i]);
+                    break;
+                  default:
+                    usage();
+                }
+            }
+        }
+    }
+
+    private List loadFile(File theFile, int numFields) {
+        List<String[]> records = new ArrayList<String[]>();
+        try {
+            String theLine = null;
+            FileInputStream fis = new FileInputStream(theFile);
+            BufferedReader br = 
+                new BufferedReader(new InputStreamReader(fis));
+            while((theLine=br.readLine()) != null) {
+                String[] theLineArray = theLine.split("#");
+                if (theLineArray.length != numFields) {
+                    System.out.println("Malformed line found in " + 
+                        theFile.getPath());
+                    System.out.println("Line was: '" + theLine);
+                    System.out.println("length found was: " + 
+                        theLineArray.length);
+                    System.exit(-1);
+                }
+                records.add(theLineArray);
+            }
+            // Close the input stream handle
+            fis.close();
+        } catch (FileNotFoundException e) {
+            System.err.println(theFile.getPath() + " does not exist.");
+            e.printStackTrace();
+            usage();
+        } catch (IOException e)  {
+            System.err.println("IO Exception: " + e.toString());
+            e.printStackTrace();
+            System.exit(-1);
+        }
+        return records;
+    }
+
+    protected ExampleDatabasePut() {}
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/dpl_exampleinventoryread.html b/docs/GettingStartedGuide/dpl_exampleinventoryread.html new file mode 100644 index 0000000..0a1c377 --- /dev/null +++ b/docs/GettingStartedGuide/dpl_exampleinventoryread.html @@ -0,0 +1,271 @@ + + + + + + ExampleInventoryRead.java + + + + + + + + + +
+
+
+
+

ExampleInventoryRead.java

+
+
+
+

+ ExampleInventoryRead + retrieves + inventory information from our entity store and + displays it. When it displays each inventory item, it + also displays the related vendor contact information. +

+

+ ExampleInventoryRead + can do one of two things. If you provide no search + criteria, it displays all of the inventory items in the + store. If you provide an item name (using the + -s command line switch), then just + those inventory items using that name are displayed. +

+

+ The beginning of our example is almost identical to our + ExampleDatabasePut + example program. We + repeat that example code here for the sake of + completeness. For a complete walk-through of it, see + the previous section (ExampleDatabasePut.java). +

+
package persist.gettingStarted;
+
+import java.io.File;
+import java.io.IOException;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.persist.EntityCursor;
+
+public class ExampleInventoryRead {
+
+    private static File myDbEnvPath =
+        new File("/tmp/JEDB");
+
+    private DataAccessor da;
+
+    // Encapsulates the database environment.
+    private static MyDbEnv myDbEnv = new MyDbEnv();
+
+    // The item to locate if the -s switch is used
+    private static String locateItem;
+
+    private static void usage() {
+        System.out.println("ExampleInventoryRead [-h <env directory>]" +
+                           "[-s <item to locate>]");
+        System.exit(-1);
+    }
+
+    public static void main(String args[]) {
+        ExampleInventoryRead eir = new ExampleInventoryRead();
+        try {
+            eir.run(args);
+        } catch (DatabaseException dbe) {
+            System.err.println("ExampleInventoryRead: " + dbe.toString());
+            dbe.printStackTrace();
+        } finally {
+            myDbEnv.close();
+        }
+        System.out.println("All done.");
+    }
+
+    private void run(String args[])
+        throws DatabaseException {
+        // Parse the arguments list
+        parseArgs(args);
+
+        myDbEnv.setup(myDbEnvPath, // path to the environment home
+                      true);       // is this environment read-only?
+
+        // Open the data accessor. This is used to retrieve
+        // persistent objects.
+        da = new DataAccessor(myDbEnv.getEntityStore());
+
+        // If a item to locate is provided on the command line,
+        // show just the inventory items using the provided name.
+        // Otherwise, show everything in the inventory.
+        if (locateItem != null) {
+            showItem();
+        } else {
+            showAllInventory();
+        }
+    } 
+

+ The first method that we provide is used to show inventory + items related to a given inventory name. This method is called + only if an inventory name is passed to + ExampleInventoryRead + via the -s option. Given the sample data + that we provide with this example, each matching inventory name + will result in the display of three inventory objects. +

+

+ To display these objects we use the + Inventory class' + inventoryByName secondary index to retrieve + an EntityCursor, and then we iterate + over the resulting objects using the cursor. +

+

+ Notice that this method calls + displayInventoryRecord() + to display each individual object. We show this + method a little later in the example. +

+
    // Shows all the inventory items that exist for a given
+    // inventory name.
+    private void showItem() throws DatabaseException {
+
+        // Use the inventory name secondary key to retrieve
+        // these objects.
+        EntityCursor<Inventory> items =
+            da.inventoryByName.subIndex(locateItem).entities();
+        try {
+            for (Inventory item : items) {
+                displayInventoryRecord(item);
+            }
+        } finally {
+            items.close();
+        }
+    } 
+

+ Next we implement showAllInventory(), + which shows all of the Inventory + objects in the store. To do this, we + obtain an EntityCursor + from the Inventory class' + primary index and, again, we iterate using that cursor. +

+
    // Displays all the inventory items in the store
+    private void showAllInventory()
+        throws DatabaseException {
+
+        // Get a cursor that will walk every
+        // inventory object in the store.
+        EntityCursor<Inventory> items =
+            da.inventoryBySku.entities();
+
+        try {
+            for (Inventory item : items) {
+                displayInventoryRecord(item);
+            }
+        } finally {
+            items.close();
+        }
+    } 
+

+ Now we implement + displayInventoryRecord(). This + uses the getter methods on the Inventory + class to obtain the information that we want to display. + The only thing interesting about this method is that we + obtain Vendor objects within. + The vendor objects are retrieved Vendor + objects using their primary index. We get the key + for the retrieval from the Inventory + object that we are displaying at the time. +

+
    private void displayInventoryRecord(Inventory theInventory)
+            throws DatabaseException {
+
+            System.out.println(theInventory.getSku() + ":");
+            System.out.println("\t " + theInventory.getItemName());
+            System.out.println("\t " + theInventory.getCategory());
+            System.out.println("\t " + theInventory.getVendor());
+            System.out.println("\t\tNumber in stock: " +
+                theInventory.getVendorInventory());
+            System.out.println("\t\tPrice per unit:  " +
+                theInventory.getVendorPrice());
+            System.out.println("\t\tContact: ");
+
+            Vendor theVendor =
+                    da.vendorByName.get(theInventory.getVendor());
+            assert theVendor != null;
+
+            System.out.println("\t\t " + theVendor.getAddress());
+            System.out.println("\t\t " + theVendor.getCity() + ", " +
+                theVendor.getState() + " " + theVendor.getZipcode());
+            System.out.println("\t\t Business Phone: " +
+                theVendor.getBusinessPhoneNumber());
+            System.out.println("\t\t Sales Rep: " +
+                                theVendor.getRepName());
+            System.out.println("\t\t            " +
+                theVendor.getRepPhoneNumber());
+    } 
+

+ The last remaining parts of the example are used to parse + the command line. This is not very + interesting for our purposes here, but we show it anyway + for the sake of completeness. +

+
    protected ExampleInventoryRead() {}
+
+    private static void parseArgs(String args[]) {
+        for(int i = 0; i < args.length; ++i) {
+            if (args[i].startsWith("-")) {
+                switch(args[i].charAt(1)) {
+                    case 'h':
+                        myDbEnvPath = new File(args[++i]);
+                    break;
+                    case 's':
+                        locateItem = args[++i];
+                    break;
+                    default:
+                        usage();
+                }
+            }
+        }
+    }
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/dpl_replace.html b/docs/GettingStartedGuide/dpl_replace.html new file mode 100644 index 0000000..1df533c --- /dev/null +++ b/docs/GettingStartedGuide/dpl_replace.html @@ -0,0 +1,109 @@ + + + + + + Replacing Entity Objects + + + + + + + + + +
+
+
+
+

Replacing Entity Objects

+
+
+
+

+ To modify a stored entity object, retrieve it, update + it, then put it back to the entity store: +

+
+SimpleEntityClass sec = sda.pIdx.get("keyone");
+sec.setSKey("skeyoneupdated");
+sda.pIdx.put(sec);
+
+

+ Note that because we updated a field on the object that is + a secondary key, this object will now be accessible by the + secondary key of skeyoneupdated instead + of the previous value, which was skeyone +

+

+ Be aware that if you modify the object's primary key, the behavior is + somewhat different. In this case, you cause a new instance + of the object to be created in the store, instead of + replacing an existing instance: +

+
// Results in two objects in the store.  One with a
+// primary index of "keyfive" and the other with primary index of 
+//'keyfivenew'.
+SimpleEntityClass sec = sda.pIdx.get("keyfive");
+sec.setPKey("keyfivenew");
+sda.pIdx.put(sec); 
+

+ Finally, if you are iterating over a collection of objects + using an EntityCursor, you can + update each object in turn using + EntityCursor.update(). Note, + however, that you must be iterating using a + PrimaryIndex; this operation is not + allowed if you are using a + SecondaryIndex. +

+

+ For example, the following iterates over every + SimpleEntityClass object in the entity + store, and it changes them all so that they have a + secondary index of updatedskey: +

+
EntityCursor<SimpleEntityClass> sec_pcursor = sda.pIdx.entities();
+for (SimpleEntityClass sec : sec_pcursor) {
+    sec.setSKey("updatedskey");
+    sec_pcursor.update(item);
+}
+sec_pcursor.close(); 
+
+ + + diff --git a/docs/GettingStartedGuide/dplindexcreate.html b/docs/GettingStartedGuide/dplindexcreate.html new file mode 100644 index 0000000..ce9708c --- /dev/null +++ b/docs/GettingStartedGuide/dplindexcreate.html @@ -0,0 +1,419 @@ + + + + + + Creating Indexes + + + + + + + + + +
+
+
+
+

Creating Indexes

+
+
+
+ +

+ To create an index using the DPL, you use Java + annotations to declare which feature on the class is used + for the primary index, and which features (if any) are to + be used as secondary indexes. +

+

+ All entity classes stored in the DPL must have a + primary index declared for it. +

+

+ Entity classes can have zero or more secondary + indexes declared for them. There is no limit on the + number of secondary indexes that you can declare. +

+
+
+
+
+

Declaring Primary Indexes

+
+
+
+

+ You declare a primary key for an entity class by + using the @PrimaryKey + annotation. This annotation must appear + immediately before the data member which + represents the class's primary key. For example: +

+
package persist.gettingStarted;
+
+import com.sleepycat.persist.model.Entity;
+import com.sleepycat.persist.model.PrimaryKey;
+
+@Entity
+public class Vendor {
+
+    private String address;
+    private String bizPhoneNumber;
+    private String city;
+    private String repName;
+    private String repPhoneNumber;
+    private String state;
+
+    // Primary key is the vendor's name
+    // This assumes that the vendor's name is
+    // unique in the database.
+    @PrimaryKey
+    private String vendor;
+
+    ... 
+

+ For this class, the vendor value is set for an individual + Vendor class object by + the setVendorName() + method. If our example code fails to set this + value before storing the object, the data + member used to store the primary key is set to a + null value. This would result in a runtime + error. +

+

+ You can avoid the need to explicitly set a + value for a class's primary index by specifying + a sequence to be used for the primary key. This + results in an unique integer value being used + as the primary key for each stored object. +

+

+ You declare a sequence is to be used by specifying + the sequence keyword to the + @PrimaryKey annotation. You must + also provide a name for the sequence. For example: + For example: +

+
@PrimaryKey(sequence="Sequence_Namespace")
+long myPrimaryKey; 
+
+
+
+
+
+

Declaring Secondary Indexes

+
+
+
+

+ To declare a secondary index, we use the + @SecondaryKey annotation. Note + that when we do this, we must declare what sort of + an index it is; that is, what is its relationship to + other data in the data store. +

+

+ The kind of indices that we + can declare are: +

+
+
    +
  • +

    + ONE_TO_ONE +

    +

    + This relationship indicates that + the secondary key is unique to the + object. If an object is stored with a + secondary key that already + exists in the data store, a run + time error is raised. +

    +

    + For example, a person object might + be stored with a primary key of a + social security number (in the US), + with a secondary key of the + person's employee number. Both + values are expected to be unique in + the data store. +

    +
  • +
  • +

    + MANY_TO_ONE +

    +

    + Indicates that the secondary key + may be used for multiple + objects in the data store. That is, + the key appears more than + once, but for each stored object it + can be used only once. +

    +

    + Consider a data store that relates + managers to employees. A given + manager will have multiple + employees, but each employee is + assumed to have just one manager. + In this case, the manager's + employee number might be a + secondary key, so that you can + quickly locate all the objects + related to that manager's + employees. +

    +
  • +
  • +

    + ONE_TO_MANY +

    +

    + Indicates that the secondary key + might be used more than once for a + given object. Index keys + themselves are assumed to be + unique, but multiple instances of + the index can be used per object. +

    +

    + For example, employees might have + multiple unique email addresses. In + this case, any given object can be + access by one or more email + addresses. Each such address is + unique in the data store, but each + such address will relate to a + single employee object. +

    +
  • +
  • +

    + MANY_TO_MANY +

    +

    + There can be multiple keys for + any given object, and for any given + key there can be many related + objects. +

    +

    + For example, suppose your + organization has a shared + resource, such as printers. You + might want to track which + printers a given employee can + use (there might be more than + one). You might also want to + track which employees can use a + specific printer. This + represents a many-to-many + relationship. +

    +
  • +
+
+

+ Note that for ONE_TO_ONE and + MANY_TO_ONE relationships, you + need a simple data member (not an array or + collection) to hold the key. For + ONE_TO_MANY and + MANY_TO_MANY relationships, you + need an array or collection to hold the keys: +

+
@SecondaryKey(relate=ONE_TO_ONE)
+private String primaryEmailAddress = new String();
+
+@SecondaryKey(relate=ONE_TO_MANY)
+private Set<String> emailAddresses = new HashSet<String>(); 
+
+
+
+
+
+

Foreign Key Constraints

+
+
+
+

+ Sometimes a secondary index is related in some + way to another entity class that is also + contained in the data store. That is, the + secondary key might be the primary key for + another entity class. If this is the case, you + can declare the foreign key constraint to make + data integrity easier to accomplish. +

+

+ For example, you might have one class that is + used to represent employees. + You might have another that is used to + represent corporate divisions. When you add or + modify an employee record, you might want to + ensure that the division to which the employee + belongs is known to the data store. You do this + by specifying a foreign key constraint. +

+

+ When a foreign key constraint is declared: +

+
+
    +
  • +

    + When a new secondary key + for the object is stored, + it is checked to make sure + it exists as a primary + key for the related + entity object. If it does + not, a runtime error + occurs. +

    +
  • +
  • +

    + When a related entity is + deleted (that is, a + corporate division is + removed from the data + store), some action is + automatically taken for + the entities that refer to + this object (that is, the + employee objects). Exactly + what that action is, is + definable by you. See + below. +

    +
  • +
+
+

+ When a related entity is deleted from the data + store, one of the following actions are taken: +

+
+
    +
  • +

    + ABORT +

    +

    + The delete operation is not + allowed. A runtime error is + raised as a result of the + operation. This is the + default behavior. +

    +
  • +
  • +

    + CASCADE +

    +

    + All entities related to this + one are deleted as well. For + example, if you deleted a + Division + object, then all + Employee + objects that belonged to the + division are also deleted. +

    +
  • +
  • +

    + NULLIFY +

    +

    + All entities related to the + deleted entity are updated so + that the pertinent data member + is nullified. That is, if you + deleted a division, then all + employee objects related to + that division would have their + division key + automatically set to null. +

    +
  • +
+
+

+ You declare a foreign key constraint by using + the relatedEntity keyword. You + declare the foreign key constraint deletion policy using the + onRelatedEntityDelete keyword. For + example, the following declares a foreign key + constraint to Division + class objects, and it causes related objects to + be deleted if the Division + class is deleted: +

+
@SecondaryKey(relate=ONE_TO_ONE, relatedEntity=Division.class, 
+    onRelatedEntityDelete=CASCADE)
+private String division = new String(); 
+
+
+ + + diff --git a/docs/GettingStartedGuide/env.html b/docs/GettingStartedGuide/env.html new file mode 100644 index 0000000..25ce22a --- /dev/null +++ b/docs/GettingStartedGuide/env.html @@ -0,0 +1,412 @@ + + + + + + Chapter 2. Database Environments + + + + + + + + + +
+
+
+
+

Chapter 2. Database Environments

+
+
+
+ +

+ Regardless of whether you are using the DPL or the base API, you must use a database + environment. Database environments encapsulate one or more databases. This encapsulation + provides your threads with efficient access to your databases by allowing a single in-memory + cache to be used for each of the databases contained in the environment. This encapsulation + also allows you to group operations performed against multiple databases inside a single + transaction (see the Berkeley DB, Java Edition Getting Started with Transaction Processing guide for more information). +

+

+ If you are using the base API, most commonly you use database environments to create and + open databases (you close individual databases using the individual database handles). You + can also use environments to delete and rename databases. For transactional applications, + you use the environment to start transactions. For non-transactional applications, you use + the environment to sync your in-memory cache to disk. +

+

+ If you are using the DPL, all of these things are still being done, but the DPL takes + care of it for you. Under the DPL, the most common thing you will explicitly use an + environment for is to obtain transaction handles. +

+

+ + Regardless of the API that you use, you also use the database environment for + administrative and configuration activities related to your database log files and the + in-memory cache. + + See Administering Berkeley DB Java Edition Applications for + more information. +

+

+ To find out how to use environments with a transaction-protected application, see the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

+
+
+
+
+

Opening Database Environments

+
+
+
+ +

+ You open a database environment by instantiating an Environment + object. You must provide to the constructor the name of the on-disk directory where the + environment is to reside. This directory location must exist or the open will fail. +

+

+ By default, the environment is not created for you if it does not exist. Set the creation property to true if you + want the environment to be created. For example: +

+
package je.gettingStarted;
+    
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+
+...
+
+// Open the environment. Allow it to be created if it does not 
+// already exist.
+Environment myDbEnvironment = null;
+
+try {
+    EnvironmentConfig envConfig = new EnvironmentConfig();
+    envConfig.setAllowCreate(true);
+    myDbEnvironment = new Environment(new File("/export/dbEnv"), 
+                                      envConfig);
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+} 
+

+ Opening an environment usually causes some background threads to be started. JE uses + these threads for log file cleaning and some administrative tasks. However, these + threads will only be opened once per process, so if you open the same environment more + than once from within the same process, there is no performance impact on your + application. Also, if you open the environment as read-only, then the background + threads (with the exception of the evictor thread) are not started. +

+

+ Note that opening your environment causes normal recovery to be run. This + causes your databases to be brought into a consistent state relative to the + changed data found in your log files. + See Databases and Log Files + for more information. +

+
+
+
+
+

Multiple Environments

+
+
+
+

+ Most JE applications only need a single database environment because any + number of databases can be created in a single environment, and the + total size of the data in an environment is not limited. That said, + your application can open and use as many environments as you have disk and + memory to manage. Also, you can instantiate + multiple Environment objects + for the same physical environment. +

+

+ The main reason for multiple environments is that an application must manage + multiple unique data sets. By placing each data set in a separate environment, + the application can gain real advantages in manageability of the data, and with + application performance. By placing each data set in a unique environment, + a separate set of log files is created and maintained in a separate directory, + and so you can manipulate the log files for each data set separately. + That is, you can: +

+
+
    +
  • +

    + Backup, restore or delete a single data set + separately by copying or removing the files for its environment. +

    +
  • +
  • +

    + Balance the load between machines by moving the files for a + single data set from one machine to another. +

    +
  • +
  • +

    + Improve I/O performance by placing each data set on a separate + physical disk. +

    +
  • +
  • +

    + Delete individual data sets very efficiently by removing the + environment's log files. This is much more efficient than + deleting individual database records and is also move + efficient than removing databases, and so can be a real benefit + if you are managing large temporary data sets that must be + frequently deleted. +

    +
  • +
+
+

+ Be aware that there is a downside to using multiple environments. In particular, + understand that a single transaction cannot include changes + made in more than one environment. If you need to perform a set of + operations in more than one data set atomically (with a single + transaction), use a single environment and distinguish the data sets + using some other method. +

+

+ For example, an application running a hosted service for multiple clients may + wish to keep each client's data set separate. You can do this with multiple + environments, but then you can operate on all data sets atomically. If you need + to wrap operations for multiple data sets in a single transaction, consider some + other approach to keeping the data sets separate. +

+

+ You can, for example, distinguish each data set using a unique key range within + a single database. Or you can create a secondary key that identifies the data + set. Or you could use separate databases for each dataset. All of these + approaches allow you to maintain multiple distinct dataset within a single + environment, but each obviously adds a level of complexity to your code over + what is required to simply use a unique environment for each data set. +

+
+
+
+
+
+

Multiple Environment Subdirectories

+
+
+
+

+ You can spread your JE environment across multiple subdirectories. This allows you + to improve data throughput by spreading disk I/O across multiple disks or filesystems. + Environment subdirectories reside in the environment home directory and are named + data001/ through dataNNN/, consecutively, where + NNN is the number of subdirectories that you want to use. Typically, + each of the dataNNN/ names are symbolic links to actual directories + which reside on separate file systems or disks. Alternatively, each subdirectory can + be mount points for filesystems which reside on different disk drives. +

+

+ You control the number of subdirectories you want to use with the + je.log.nDataDirectories property in the + je.properties file. This value must be set prior to opening the + environment, and the subdirectories must already exist at that time. The value set for + this property can not change over the course of the environment's lifetime, or an + exception is thrown when you attempt to open the environment. +

+

+ The default value for je.log.nDataDirectories is 0, and this means no + subdirectories are in use for the environment. A value greater than 0 indicates the + number of subdirectories to use, and that number of subdirectories must exist prior to + opening the environment. +

+

+ For example, if you set je.log.nDataDirectories to 3, then the first + time you open the environment (and for every environment open after that) your + environment home directory must contain three subdirectories named + data001, data002 and data003. + This causes your JE log files (the *.jdb files) to be spread + evenly across those three subdirectories. Finally, if you change the value of + je.log.nDataDirectories without first completely deleting your + environment, then your application will throw exceptions when you open your environment. +

+
+
+
+
+
+

Configuring a Shared Cache for Multiple Environments

+
+
+
+

+ By default, each distinct JE environment has a separate, private + in-memory cache. If a single JVM process will keep open multiple + environments at the same time, it is strongly recommended that all such + environments are configured to use a shared cache. A shared cache makes + much more efficient use of memory than separate private caches. +

+

+ For example, imagine that you open 5 environments in a single process + and a total of 500 MB of memory is available for caching. Using private + caches, you could configure each cache to be 100 MB. If one of the + environments has a larger active data set than the others, it will + not be able to take advantage of unused memory in the other environment + caches. By using a shared cache, multiple open environments will make + better use of memory because the cache LRU algorithm is applied across + all information in all enviornments sharing the cache. +

+

+ In order to configure an environment to use a shared cache, set + EnvironmentConfig.setSharedCache() + to true. This must be set for every environment in the + process that you want to use the shared cache. For example: +

+
package je.gettingStarted;
+    
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import java.io.File;
+
+...
+
+// Open the environment. Allow it to be created if it does not 
+// already exist.
+Environment myEnv1 = null;
+Environment myEnv2 = null;
+
+try {
+    EnvironmentConfig envConfig = new EnvironmentConfig();
+    envConfig.setAllowCreate(true);
+    envConfig.setSharedCache(true);
+
+    myEnv1 = new Environment(new File("/export/dbEnv1"), envConfig);
+    myEnv2 = new Environment(new File("/export/dbEnv2"), envConfig);
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+} 
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/envStats.html b/docs/GettingStartedGuide/envStats.html new file mode 100644 index 0000000..bee8b4e --- /dev/null +++ b/docs/GettingStartedGuide/envStats.html @@ -0,0 +1,102 @@ + + + + + + Environment Statistics + + + + + + + + + +
+
+
+
+

Environment Statistics

+
+
+
+

+ JE offers a wealth of information that you can examine regarding your environment's operations. The majority + of this information involves numbers relevant only to the JE developer and as such a description of those + statistics is beyond the scope of this manual. +

+

+ However, one statistic that is very important (especially for + long-running applications) is + EnvironmentStats.getNCacheMiss(). + This statistic returns the total number of + requests for database objects that were not serviceable from the cache. + This number is important to the + application administrator who is attempting to determine the proper size for the in-memory cache. + + See Sizing the Cache for details. +

+

+ To obtain this statistic from your environment, call Environment.getStats() to return + an EnvironmentStats object. You can then call the + EnvironmentStats.getNCacheMiss() method. For example: +

+ +
import com.sleepycat.je.Environment;
+
+...
+
+long cacheMisses = myEnv.getStats(null).getNCacheMiss();
+
+...  
+
+

+ Note that Environment.getStats() can only obtain statistics from your application's + process. In order for the application administrator to obtain this statistic, you must either + use JMX to retrieve the statistic + (see JConsole and JMX Support) + or you must print it for examination (for example, log the value once a minute). +

+

+ Remember that what is really important for cache sizing is the change in this value over time, and not the actual value + itself. So you might consider offering a delta from one examination of this statistic to the next (a delta of 0 is + desired while large deltas are an indication that the cache is too small). +

+
+ + + diff --git a/docs/GettingStartedGuide/envclose.html b/docs/GettingStartedGuide/envclose.html new file mode 100644 index 0000000..88a57bf --- /dev/null +++ b/docs/GettingStartedGuide/envclose.html @@ -0,0 +1,127 @@ + + + + + + Closing Database Environments + + + + + + + + + +
+
+
+
+

Closing Database Environments

+
+
+
+

+ You close your environment by calling the Environment.close() + method. This method performs a checkpoint, so it is not necessary to perform a sync or a + checkpoint explicitly before calling it. For information on checkpoints, see the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. For information on syncs, see Database Modifications and Syncs. +

+ +
import com.sleepycat.je.DatabaseException;
+
+import com.sleepycat.je.Environment;
+
+...
+
+try {
+    if (myDbEnvironment != null) {
+        myDbEnvironment.close();
+    } 
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+} 
+

+ If you are using the DPL, then close your environment(s) only after all other store + activities have completed and you have closed any stores currently opened in the + environment. If you are using the base API, then close your environment(s) only after + all other database activities have completed and you have closed any databases currently + opened in the environment. +

+
+

Note

+

+ It is possible for the environment to close before JE's + cleaner thread + has finished its work. This happens if you perform a large number of deletes immediately + before shutting down your environment. The result is that your log files may be quit a lot larger than you + expect them to be because the cleaner thread has not had a chance to finish its work. +

+

+ See The Cleaner Thread for + details on the cleaner threads. +

+

+ If you want to make sure that the cleaner has finished running before the environment is closed, + call Environment.cleanLog() before calling + Environment.close(): +

+ +
import com.sleepycat.je.DatabaseException;
+
+import com.sleepycat.je.Environment;
+
+...
+
+try {
+    if (myDbEnvironment != null) {
+        myDbEnvironment.cleanLog(); // Clean the log before closing
+        myDbEnvironment.close();
+    } 
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+} 
+
+

+ Closing the last environment handle in your application causes all internal data structures + to be released and the background threads to be stopped. If there are any opened databases, + then JE will complain before closing them as well. At this time, and any on-going + transactions are aborted. Also at this time any open cursors are also closed. However, it is recommended that you always close all cursor handles immediately after their use to ensure concurrency and to release resources such as page locks. +

+
+ + + diff --git a/docs/GettingStartedGuide/getmultiple.html b/docs/GettingStartedGuide/getmultiple.html new file mode 100644 index 0000000..cfc7f50 --- /dev/null +++ b/docs/GettingStartedGuide/getmultiple.html @@ -0,0 +1,336 @@ + + + + + + Retrieving Multiple Objects + + + + + + + + + +
+
+
+
+

Retrieving Multiple Objects

+
+
+
+
+
+
+ + Cursor Initialization + +
+
+ + Working with Duplicate Keys + +
+
+ + Key Ranges + +
+
+
+

+ It is possible to iterate over every object referenced + by a specific index. You may want to do this if, for + example, you want to examine or modify every object + accessible by a specific primary index. +

+

+ In addition, some indexes result in the retrieval of multiple + objects. For example, MANY_TO_ONE + secondary indexes can result in more than one object for any given + key (also known as duplicate keys). + When this is the case, you must iterate + over the resulting set of objects in order to examine + each object in turn. +

+

+ There are two ways to iterate over a collection of + objects as returned by an index. One is to use a + standard Java Iterator, which you + obtain using an EntityCursor, + which in turn you can obtain from a PrimaryIndex: +

+
PrimaryIndex<String,SimpleEntityClass> pi =
+    store.getPrimaryIndex(String.class, SimpleEntityClass.class);
+EntityCursor<SimpleEntityClass> pi_cursor = pi.entities();
+try {
+    Iterator<SimpleEntityClass> i = pi_cursor.iterator();
+    while (i.hasNext()) {
+        // Do something here
+    }
+} finally {
+    // Always close the cursor
+    pi_cursor.close();
+} 
+

+ Alternatively, you can use a Java "foreach" statement + to iterate over object set: +

+
PrimaryIndex<String,SimpleEntityClass> pi =
+    store.getPrimaryIndex(String.class, SimpleEntityClass.class);
+EntityCursor<SimpleEntityClass> pi_cursor = pi.entities();
+try {
+    for (SimpleEntityClass seci : pi_cursor) {
+        // do something with each object "seci"
+    }
+// Always make sure the cursor is closed when we are done with it.
+} finally {
+    pi_cursor.close();
+} 
+
+
+
+
+

Cursor Initialization

+
+
+
+

+ When a cursor is first opened, it is not + positioned to any value; that is, + it is not initialized. + Most of the EntityCursor + methods that move a cursor will initialize it + to either the first or last object, depending + on whether the operation is moving the cursor + forward (all next... + methods) or backwards (all + prev...) methods. +

+

+ You can also force a cursor, whether it is + initialized or not, to return the first object + by calling + EntityCursor.first(). + Similarly, you can force a return of the last + object using + EntityCursor.last(). +

+

+ Operations that do not move the cursor (such as + EntityCursor.current() + or EntityCursor.delete() + will throw an + IllegalStateException + when used on an uninitialized cursor. +

+
+
+
+
+
+

Working with Duplicate Keys

+
+
+
+

+ If you have duplicate secondary keys, you can return an + EntityIndex class object for them + using SecondaryIndex.subIndex() + Then, use that object's + entities() + method to obtain an EntityCursor + instance. +

+

+ For example: +

+
PrimaryIndex<String,SimpleEntityClass> pi =
+    store.getPrimaryIndex(String.class, SimpleEntityClass.class);
+
+SecondaryIndex<String,String,SimpleEntityClass> si = 
+    store.getSecondaryIndex(pi, String.class, "sKey");
+
+EntityCursor<SimpleEntityClass> sec_cursor = 
+    si.subIndex("skeyone").entities(); 
+
+try {
+for (SimpleEntityClass seci : sec_cursor) {
+        // do something with each object "seci"
+    }
+// Always make sure the cursor is closed when we are done with it.
+} finally {
+    sec_cursor.close(); } 
+

+ Note that if you are working with duplicate keys, you can + control how cursor iteration works by using the following + EntityCursor methods: +

+
+
    +
  • +

    + nextDup() +

    +

    + Moves the cursor to the next object with the + same key as the cursor is currently + referencing. That is, this method returns the + next duplicate object. If no such object + exists, this method returns + null. +

    +
  • +
  • +

    + prevDup() +

    +

    + Moves the cursor to the previous object with the + same key as the cursor is currently + referencing. That is, this method returns the + previous duplicate object in the cursor's set + of objects. If no such object exists, this method returns + null. +

    +
  • +
  • +

    + nextNoDup() +

    +

    + Moves the cursor to the next object in the + cursor's set that has a key which is different + than the key that the cursor is currently + referencing. That is, this method skips all + duplicate objects and returns the + next non-duplicate object in the cursor's set + of objects. If no such object exists, this method returns + null. +

    +
  • +
  • +

    + prevNoDup() +

    +

    + Moves the cursor to the previous object in the + cursor's set that has a key which is different + than the key that the cursor is currently + referencing. That is, this method skips all + duplicate objects and returns the + previous non-duplicate object in the cursor's set + of objects. If no such object exists, this method returns + null. +

    +
  • +
+
+

+ For example: +

+
PrimaryIndex<String,SimpleEntityClass> pi =
+    store.getPrimaryIndex(String.class, SimpleEntityClass.class);
+
+SecondaryIndex<String,String,SimpleEntityClass> si = 
+    store.getSecondaryIndex(pi, String.class, "sKey");
+
+EntityCursor<SimpleEntityClass> sec_cursor = 
+    si.subIndex("skeyone").entities(); 
+
+try {
+    SimpleEntityClass sec;
+    Iterator<SimpleEntityClass> i = sec_cursor.iterator();
+    while (sec = i.nextNoDup() != null) {
+        // Do something here
+    }
+// Always make sure the cursor is closed when we are done with it.
+} finally {
+    sec_cursor.close(); } 
+
+
+
+
+
+

Key Ranges

+
+
+
+

+ You can restrict the scope of a cursor's movement + by specifying a range when you + create the cursor. The cursor can then never be + positioned outside of the specified range. +

+

+ When specifying a range, you indicate whether a + range bound is inclusive or + exclusive by providing a + boolean value for each range. + true indicates that the provided + bound is inclusive, while false + indicates that it is exclusive. +

+

+ You provide this information when you call + PrimaryIndex.entities() + or + SecondaryIndex.entities(). + For example, suppose you had a class indexed by + numerical information. Suppose further that you + wanted to examine only those objects with indexed + values of 100 - 199. Then (assuming the numerical + information is the primary index), you can bound + your cursor as follows: +

+
+EntityCursor<SomeEntityClass> cursor = 
+    primaryIndex.entities(100, true, 200, false);
+
+try {
+    for (SomeEntityClass sec : cursor {
+        // Do something here to objects ranged from 100 to 199
+    }
+// Always make sure the cursor is closed when we are done with it.
+} finally {
+    cursor.close(); } 
+
+
+ + + diff --git a/docs/GettingStartedGuide/gettingStarted.css b/docs/GettingStartedGuide/gettingStarted.css new file mode 100644 index 0000000..6a2b24b --- /dev/null +++ b/docs/GettingStartedGuide/gettingStarted.css @@ -0,0 +1,50 @@ +body { width: 45em; + margin-left: 3em; + font-family: Arial, Helvetica, sans-serif; + font-size: 11pt; + } + +h2.title { margin-left: -1em; + font-family: Verdana, serif; + font-size: 16pt; + } + +h3.title { font-family: Verdana, serif; + font-size: 14pt; + } + +pre.programlisting { + font-family: monospace; + background-color: #eae8e9; +} + +div.navheader { font-size: 10pt; + width: 60em; + margin-left: -2em; + } + +div.navheader table tr td { font-size: 10pt; } + +div.navfooter { font-size: 10pt; + width: 60em; + margin-left: -2em; + } +div.navfooter table tr td { font-size: 10pt; } + +span.emphasis { font-style: italic;} + +div.appendix div.informaltable { font-size: 9pt; } +div.appendix div.informaltable td { vertical-align: top; } +div.appendix div.informaltable p { margin-top: .25em; } +div.appendix div.informaltable p { margin-bottom: .25em; } + +div.variablelist dl dt {margin-top: 1em; } + +div.libver p { + font-size: 8pt; + width: 30%; + margin-left: 2px; + margin-right: 2px; + padding-top: 3px; + padding-bottom: 3px; + } diff --git a/docs/GettingStartedGuide/gettingit.html b/docs/GettingStartedGuide/gettingit.html new file mode 100644 index 0000000..19700c5 --- /dev/null +++ b/docs/GettingStartedGuide/gettingit.html @@ -0,0 +1,103 @@ + + + + + + Getting and Using JE + + + + + + + + + +
+
+
+
+

Getting and Using JE

+
+
+
+

+ You can obtain JE by visiting the JE download page: http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html. +

+

+ To install JE, untar or unzip the distribution to the + directory of your choice. If you use unzip, make sure to specify + the -U option in order to preserve case. +

+

+ For more information on installing JE, see + JE_HOME/docs/relnotes.html, + where JE_HOME is the directory where you + unpacked JE. +

+
+

Note

+

+ JE is compatible with Java SE 8 (64-bit), and has been + tested and certified against Oracle Java SE 8 and IBM Java IBM + J9. It is recommended that you upgrade to the latest Java + releases to take advantage of the latest bug fixes and + performance improvements. The release notes included in the + JE download specify the exact Java versions that have been + used for certification. +

+

+ Linux, Oracle Solaris, and AIX are officially supported platforms for + JE. Both Oracle Solaris x86 and Oracle Solaris SPARC are + supported. A 64 bit JVM is required in order to run JE. +

+
+

+ You can use JE with your application by adding + JE_HOME/lib/je-<version>.jar + to your application's classpath. +

+

+ Beyond this manual, you can find documentation for JE at + JE_HOME/docs/index.html + directory. In particular, complete Javadoc for the JE API set + is available at + JE_HOME/docs/java/index.html. +

+
+ + + diff --git a/docs/GettingStartedGuide/hotfailover.html b/docs/GettingStartedGuide/hotfailover.html new file mode 100644 index 0000000..6ebb2d1 --- /dev/null +++ b/docs/GettingStartedGuide/hotfailover.html @@ -0,0 +1,128 @@ + + + + + + Hot Standby + + + + + + + + + +
+
+
+
+

Hot Standby

+
+
+
+

+ As a final backup/recovery strategy, you can create a hot standby. Note that using hot standbys requires + your application to be able to specify its environment home directory at application startup time. Most + application developers allow the environment home directory to be identified using a command line option or a + configuration or properties file. If your application has its + environment home hard-coded into it, you cannot use hot standbys. +

+

+ You create a hot standby by periodically backing up your database to an alternative + location on disk. Usually this alternative location is on a separate physical drive from + where you normally keep your database, but if multiple drives are not available then you + should at least put the hot standby on a separate disk partition. +

+

+ You failover to your hot standby by causing your application to reopen its environment using the hot standby + location. +

+

+ Note that a hot standby should not be used as a substitute for backing up and archiving your data to a safe + location away from your operating environment. Even if your data is spread across multiple physical disks, a + truly serious catastrophe (fires, malevolent software viruses, + faulty disk controllers, and so forth) + can still cause you to lose your data. +

+

+ To create and maintain a hot standby: +

+
+
    +
  1. +

    + Copy all log files (*.jdb) from your environment + directory to the location where you want to keep your standby. Either a hot + or an offline backup can be used for this purpose, but typically a hot + standby is initially created by taking an offline backup of your database. + This ensures that you have captured the contents of your in-memory cache. +

    +
    +

    Note

    +

    + If you are using subdirectories to store your log files, then you must backup + the subdirectories, making sure to keep log files in the subdirectory in which + JE placed them. For information on using subdirectories to store your log + files, see Multiple Environment Subdirectories. +

    +
    +
  2. +
  3. +

    + Periodically copy to your standby directory any log files that were changed or created since the + time of your last copy. Most backup software is capable of performing this kind of an incremental + backup for you. +

    +

    + Note that the frequency of your incremental copies determines the amount of data that is at risk due to catastrophic + failures. For example, if you perform the incremental copy once an hour then at most your hot standby is an hour behind + your production database, and so you are risking at most an hours worth of database changes. +

    +
  4. +
  5. +

    + Remove any *.jdb files from the hot standby directory that have been removed or + renamed to .del files in the primary directory. This is not necessary for + consistency, but will help to reduce disk space consumed by the hot standby. +

    +
  6. +
+
+
+ + + diff --git a/docs/GettingStartedGuide/index.html b/docs/GettingStartedGuide/index.html new file mode 100644 index 0000000..c212418 --- /dev/null +++ b/docs/GettingStartedGuide/index.html @@ -0,0 +1,1101 @@ + + + + + + Getting Started with Berkeley DB Java Edition + + + + + + + +
+
+
+
+

Getting Started with Berkeley DB Java Edition

+
+
+
+ +

+ Legal Notice +

+

+ Copyright © 2002 - 2017 Oracle and/or its affiliates. All rights + reserved. +

+

+ This software and related documentation are provided under a + license agreement containing restrictions on use and disclosure + and are protected by intellectual property laws. Except as + expressly permitted in your license agreement or allowed by + law, you may not use, copy, reproduce, translate, broadcast, + modify, license, transmit, distribute, exhibit, perform, + publish, or display any part, in any form, or by any means. + Reverse engineering, disassembly, or decompilation of this + software, unless required by law for interoperability, is + prohibited. +

+

+ The information contained herein is subject to change without + notice and is not warranted to be error-free. If you find any + errors, please report them to us in writing. +

+

+ Berkeley DB, + + Berkeley DB Java Edition + and + Sleepycat are trademarks or registered trademarks of + Oracle. All rights to these marks are reserved. + No third-party use is permitted without the + express prior written consent of Oracle. +

+

+ Other names may be trademarks of their respective owners. +

+

+ If this is software or related documentation that is delivered + to the U.S. Government or anyone licensing it on behalf of the + U.S. Government, the following notice is applicable: +

+

+ U.S. GOVERNMENT END USERS: Oracle programs, including any + operating system, integrated software, any programs installed + on the hardware, and/or documentation, delivered to U.S. + Government end users are "commercial computer software" + pursuant to the applicable Federal Acquisition Regulation and + agency-specific supplemental regulations. As such, use, + duplication, disclosure, modification, and adaptation of the + programs, including any operating system, integrated software, + any programs installed on the hardware, and/or documentation, + shall be subject to license terms and license restrictions + applicable to the programs. No other rights are granted to the + U.S. Government. +

+

+ This software or hardware is developed for general use in a + variety of information management applications. It is not + developed or intended for use in any inherently dangerous + applications, including applications that may create a risk of + personal injury. If you use this software or hardware in + dangerous applications, then you shall be responsible to take + all appropriate fail-safe, backup, redundancy, and other + measures to ensure its safe use. Oracle Corporation and its + affiliates disclaim any liability for any damages caused by use + of this software or hardware in dangerous applications. +

+

+ Oracle and Java are registered trademarks of Oracle and/or its + affiliates. Other names may be trademarks of their respective + owners. +

+

+ Intel and Intel Xeon are trademarks or registered trademarks of + Intel Corporation. All SPARC trademarks are used under license + and are trademarks or registered trademarks of SPARC + International, Inc. AMD, Opteron, the AMD logo, and the AMD + Opteron logo are trademarks or registered trademarks of + Advanced Micro Devices. UNIX is a registered trademark of The + Open Group. +

+

+ This software or hardware and documentation may provide access + to or information on content, products, and services from third + parties. Oracle Corporation and its affiliates are not + responsible for and expressly disclaim all warranties of any + kind with respect to third-party content, products, and + services. Oracle Corporation and its affiliates will not be + responsible for any loss, costs, or damages incurred due to + your access to or use of third-party content, products, or + services. +

+
+
+
+

31-Oct-2017

+
+
+
+
+
+

+ Table of Contents +

+
+
+ + Preface + +
+
+
+
+ + Conventions Used in this Book + +
+
+ + For More Information + +
+
+
+
+ + Contact Us + +
+
+
+
+
+
+ + 1. Introduction to Berkeley DB Java Edition + +
+
+
+
+ + Features + +
+
+
+
+ + DPL Features + +
+
+ + Base API Features + +
+
+ + Which API Should You Use? + +
+
+
+
+ + The JE Application + +
+
+
+
+ + Database Environments + +
+
+ + Key-Data Pairs + +
+
+ + Storing Data + +
+
+ + Duplicate Data + +
+
+ + Replacing and Deleting Entries + +
+
+ + Secondary Keys + +
+
+ + Transactions + +
+
+ + JE Resources + +
+
+ + + Application Considerations + + +
+
+
+
+ + JE Backup and Restore + +
+
+ + JCA Support + +
+
+ + JConsole and JMX Support + +
+
+ + Getting and Using JE + +
+
+ + JE Exceptions + +
+
+ + Six Things Everyone Should Know about JE Log Files + +
+
+
+
+ + 2. Database Environments + +
+
+
+
+ + Opening Database Environments + +
+
+
+
+ + Multiple Environments + +
+
+ + Multiple Environment Subdirectories + +
+
+ + Configuring a Shared Cache for Multiple Environments + +
+
+
+
+ + Closing Database Environments + +
+
+ + Environment Properties + +
+
+
+
+ + The EnvironmentConfig Class + +
+
+ + EnvironmentMutableConfig + +
+
+
+
+ + Environment Statistics + +
+
+ + Database Environment Management Example + +
+
+
+
+ + I. Programming with the Direct Persistence Layer + +
+
+
+
+ + 3. Direct Persistence Layer First Steps + +
+
+
+
+ + Entity Stores + +
+
+
+
+ + Opening and Closing Environments and Stores + +
+
+
+
+ + Persistent Objects + +
+
+ + Saving and Retrieving Data + +
+
+
+
+ + 4. Working with Indices + +
+
+
+
+ + Accessing Indexes + +
+
+
+
+ + Accessing Primary Indices + +
+
+ + Accessing Secondary Indices + +
+
+
+
+ + Creating Indexes + +
+
+
+
+ + Declaring Primary Indexes + +
+
+ + Declaring Secondary Indexes + +
+
+ + Foreign Key Constraints + +
+
+
+
+
+
+ + 5. Saving and Retrieving Objects + +
+
+
+
+ + A Simple Entity Class + +
+
+ + SimpleDA.class + +
+
+ + Placing Objects in an Entity Store + +
+
+ + Retrieving Objects from an Entity Store + +
+
+ + Retrieving Multiple Objects + +
+
+
+
+ + Cursor Initialization + +
+
+ + Working with Duplicate Keys + +
+
+ + Key Ranges + +
+
+
+
+ + Join Cursors + +
+
+ + Deleting Entity Objects + +
+
+ + Replacing Entity Objects + +
+
+
+
+ + 6. A DPL Example + +
+
+
+
+ + Vendor.java + +
+
+ + Inventory.java + +
+
+ + MyDbEnv + +
+
+ + DataAccessor.java + +
+
+ + ExampleDatabasePut.java + +
+
+ + ExampleInventoryRead.java + +
+
+
+
+
+
+ + II. Programming with the Base API + +
+
+
+
+ + 7. Databases + +
+
+
+
+ + Opening Databases + +
+
+
+
+ + Deferred Write Databases + +
+
+ + Temporary Databases + +
+
+ + Closing Databases + +
+
+
+
+ + Database Properties + +
+
+ + Administrative Methods + +
+
+ + Database Example + +
+
+
+
+ + 8. Database Records + +
+
+
+
+ + Using Database Records + +
+
+ + Reading and Writing Database Records + +
+
+
+
+ + Writing Records to the Database + +
+
+ + Getting Records from the Database + +
+
+ + Deleting Records + +
+
+ + Data Persistence + +
+
+
+
+ + Using Time to Live + +
+
+
+
+ + Specifying a TTL Value + +
+
+ + Updating a TTL Value + +
+
+ + Deleting TTL Expiration + +
+
+
+
+ + Using the BIND APIs + +
+
+
+
+ + Numerical and String Objects + +
+
+ + Serializable Complex Objects + +
+
+ + Custom Tuple Bindings + +
+
+
+
+ + Using Comparators + +
+
+
+
+ + Writing Comparators + +
+
+ + Setting Comparators + +
+
+
+
+ + Database Record Example + +
+
+
+
+ + 9. Using Cursors + +
+
+
+
+ + Opening and Closing Cursors + +
+
+ + Getting Records Using the Cursor + +
+
+
+
+ + Disk Ordered Cursors + +
+
+ + Searching for Records + +
+
+ + Working with Duplicate Records + +
+
+
+
+ + Putting Records Using Cursors + +
+
+ + Deleting Records Using Cursors + +
+
+ + Replacing Records Using Cursors + +
+
+ + Cursor Example + +
+
+
+
+ + 10. Secondary Databases + +
+
+
+
+ + Opening and Closing Secondary Databases + +
+
+ + Implementing Key + Creators + + + +
+
+ + Secondary Database Properties + +
+
+ + Reading Secondary Databases + +
+
+ + Deleting Secondary Database Records + +
+
+ + + Using Secondary Cursors + + + +
+
+ + Database Joins + +
+
+
+
+ + Using Join Cursors + +
+
+ + JoinCursor Properties + +
+
+
+
+ + Secondary Database Example + +
+
+
+
+ + Opening Secondary Databases with + MyDbEnv + +
+
+ + Using Secondary Databases with ExampleInventoryRead + +
+
+
+
+
+
+
+
+ + III. Administering JE Applications + +
+
+
+
+ + 11. Backing up and Restoring Berkeley DB Java Edition Applications + +
+
+
+
+ + Databases and Log Files + +
+
+
+
+ + Log File Overview + +
+
+ + Cleaning the Log Files + +
+
+ + The BTree + +
+
+ + Database Modifications and Syncs + +
+
+ + Normal Recovery + +
+
+
+
+ + Performing Backups + +
+
+
+
+ + Performing a Hot Backup + +
+
+ + Performing an Offline Backup + +
+
+ + Using the DbBackup Helper Class + +
+
+
+
+ + Performing Catastrophic Recovery + +
+
+ + Hot Standby + +
+
+
+
+ + 12. Administering Berkeley DB Java Edition Applications + +
+
+
+
+ + The JE Properties File + +
+
+ + Managing the Background Threads + +
+
+
+
+ + The Cleaner Thread + +
+
+ + The Checkpointer Thread + +
+
+
+
+ + Sizing the Cache + +
+
+ + Setting Disk Thresholds + +
+
+ + The Command Line Tools + +
+
+
+
+ + DbDump + +
+
+ + DbLoad + +
+
+ + DbVerify + +
+
+
+
+ + Logging + +
+
+
+
+ + Managing Logging Levels + +
+
+ + Managing Handler Levels + +
+
+
+
+
+
+
+
+ + A. Concurrent Processing in Berkeley DB Java Edition + +
+
+
+
+ + Multithreaded Applications + +
+
+ + Multiprocess Applications + +
+
+
+
+
+ +
+ + + diff --git a/docs/GettingStartedGuide/indexes.html b/docs/GettingStartedGuide/indexes.html new file mode 100644 index 0000000..98b6693 --- /dev/null +++ b/docs/GettingStartedGuide/indexes.html @@ -0,0 +1,398 @@ + + + + + + Chapter 10. Secondary Databases + + + + + + + + + +
+
+
+
+

Chapter 10. Secondary Databases

+
+
+
+ +

+ Usually you find database records by means of the record's key. However, + the key that you use for your record will not always contain the + information required to provide you with rapid access to the data that you + want to retrieve. For example, suppose your + Database + + contains records related to users. The key might be a string that is some + unique identifier for the person, such as a user ID. Each record's data, + however, would likely contain a complex object containing details about + people such as names, addresses, phone numbers, and so forth. + While your application may frequently want to query a person by user + ID (that is, by the information stored in the key), it may also on occasion + want to locate people by, say, their name. +

+

+ Rather than iterate through all of the records in your database, examining + each in turn for a given person's name, you create indexes based on names + and then just search that index for the name that you want. You can do this + using secondary databases. In JE, the + Database + + that contains your data is called a + primary database. A database that provides an + alternative set of keys to access that data is called a secondary + database, + and these are managed using SecondaryDatabase + class objects. In a secondary database, the keys are your alternative + (or secondary) index, and the data corresponds to a primary record's key. +

+

+ You create a secondary database by using a SecondaryConfig + class object to identify an implementation of a + SecondaryKeyCreator + class object that is used to create keys based on data found in the primary + database. You then pass this SecondaryConfig + object to the SecondaryDatabase constructor. +

+

+ Once opened, JE manages secondary databases for you. Adding or deleting + records in your primary database causes JE to update the secondary as + necessary. Further, changing a record's data in the primary database may cause + JE to modify a record in the secondary, depending on whether the change + forces a modification of a key in the secondary database. +

+

+ Note that you can not write directly to a secondary database. + + While methods + exist on SecondaryDatabase and + SecondaryCursor that appear to allow this, they in + fact always throw + UnsupportedOperationException. + + + + To change the data referenced by a + SecondaryDatabase + + record, modify the primary database instead. The exception to this rule is + that delete operations are allowed on the + SecondaryDatabase object. + + + See Deleting Secondary Database Records for more + information. +

+
+

Note

+

+ + Secondary database records are updated/created by JE + only if the + SecondaryKeyCreator.createSecondaryKey() method + + returns + true. + + If + false + + is returned, then JE will not add the key to the secondary database, and + in the event of a record update it will remove any existing key. + + + +

+

+ See Implementing Key + Creators + + for more + information on this interface and method. + + +

+
+

+ When you read a record from a secondary database, JE automatically + returns + the key and data + + from the corresponding record in the primary database. + + + +

+
+
+
+
+

Opening and Closing Secondary Databases

+
+
+
+

+ You manage secondary database opens and closes using the + + Environment.openSecondaryDatabase() method. + + + Just as is the case with primary databases, you must provide + Environment.openSecondaryDatabase() + + with the database's + name and, optionally, other properties such as whether duplicate + records are allowed, or whether the secondary database can be created on + open. In addition, you must also provide: +

+
+
    +
  • +

    A handle to the primary database that this secondary database is + indexing. Note that this means that secondary databases are maintained + only for the specified Database handle. If you + open the same Database multiple times for write + (such as might occur when opening a database for read-only and read-write in the same application), + then you should open the SecondaryDatabase for + each such Database handle.

    +
  • +
  • +

    A SecondaryConfig object that provides + properties specific to a secondary database. The most important of + these is used to identify the key creator for the database. The key + creator is responsible for generating keys for the secondary database. + See Secondary Database Properties for details.

    +
  • +
+
+
+

Note

+

+ Primary databases must not support duplicate records. + Secondary records point to primary records using the primary key, so that key must be unique. +

+
+

So to open (create) a secondary database, you:

+
+
    +
  1. +

    Open your primary database.

    +
  2. +
  3. +

    Instantiate your key creator.

    +
  4. +
  5. +

    Instantiate your SecondaryConfig object.

    +
  6. +
  7. +

    Set your key creator object on your SecondaryConfig + object.

    +
  8. +
  9. +

    Open your secondary database, specifying your primary database + and your SecondaryConfig at that time.

    +
  10. +
+
+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.SecondaryDatabase;
+import com.sleepycat.je.SecondaryConfig;
+
+import java.io.File;
+
+...
+
+DatabaseConfig myDbConfig = new DatabaseConfig();
+SecondaryConfig mySecConfig = new SecondaryConfig();
+myDbConfig.setAllowCreate(true);
+mySecConfig.setAllowCreate(true);
+// Duplicates are frequently required for secondary databases.
+mySecConfig.setSortedDuplicates(true);
+
+// Open the primary
+Environment myEnv = null;
+Database myDb = null;
+SecondaryDatabase mySecDb = null;
+try {
+    String dbName = "myPrimaryDatabase";
+
+    myEnv = new Environment(new File("/tmp/JEENV"), null);
+    myDb = myEnv.openDatabase(null, dbName, myDbConfig);
+
+    // A fake tuple binding that is not actually implemented anywhere
+    // in this manual. The tuple binding is dependent on the data in use.
+    // Tuple bindings are described earlier in this manual.
+    TupleBinding myTupleBinding = new MyTupleBinding();
+
+    // Open the secondary.
+    // Key creators are described in the next section.
+    FullNameKeyCreator keyCreator = 
+        new FullNameKeyCreator(myTupleBinding);
+
+    // Get a secondary object and set the key creator on it.
+    mySecConfig.setKeyCreator(keyCreator);
+
+    // Perform the actual open
+    String secDbName = "mySecondaryDatabase";
+    mySecDb = myEnv.openSecondaryDatabase(null, secDbName, myDb, 
+                                          mySecConfig); 
+} catch (DatabaseException de) {
+    // Exception handling goes here ...
+}
+

To close a secondary database, call its close() method. Note that + for best results, you should close all the secondary databases associated + with a primary database before closing the primary.

+

For example:

+ +
try {
+    if (mySecDb != null) {
+        mySecDb.close();
+    }
+
+    if (myDb != null) {
+        myDb.close(); 
+    }
+
+    if (myEnv != null) {
+        myEnv.close();
+    }
+} catch (DatabaseException dbe) {
+    // Exception handling goes here
+}
+
+
+ + + diff --git a/docs/GettingStartedGuide/indexusage.html b/docs/GettingStartedGuide/indexusage.html new file mode 100644 index 0000000..4530dfc --- /dev/null +++ b/docs/GettingStartedGuide/indexusage.html @@ -0,0 +1,483 @@ + + + + + + Secondary Database Example + + + + + + + + + +
+
+
+
+

Secondary Database Example

+
+
+
+ +

In previous chapters in this book, we built applications that load + and display several JE databases. In this example, we will extend those + examples to use secondary databases. Specifically:

+
+ +
+

+ Before we can use a secondary database, we must implement a class to extract secondary keys for us. + We use ItemNameKeyCreator for this purpose. +

+
+ +

+ Example 10.1 ItemNameKeyCreator.java +

+
+

+ This class assumes the primary database + uses Inventory objects for the record data. The + Inventory class is described in Inventory.java.

+

In our key creator class, we make use of a custom tuple binding + called InventoryBinding. This class is described in InventoryBinding.java.

+

You can find the following class in:

+
JE_HOME/examples/je/gettingStarted/ItemNameKeyCreator.java
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.db.SecondaryKeyCreator;
+import com.sleepycat.db.DatabaseEntry;
+import com.sleepycat.db.DatabaseException;
+import com.sleepycat.db.SecondaryDatabase;
+
+public class ItemNameKeyCreator implements SecondaryKeyCreator {
+
+    private TupleBinding theBinding;
+
+    // Use the constructor to set the tuple binding
+    ItemNameKeyCreator(TupleBinding binding) {
+        theBinding = binding;
+    }
+
+    // Abstract method that we must implement
+    public boolean createSecondaryKey(SecondaryDatabase secDb,
+        DatabaseEntry keyEntry,    // From the primary
+        DatabaseEntry dataEntry,   // From the primary
+        DatabaseEntry resultEntry) // set the key data on this.
+        throws DatabaseException {
+
+        if (dataEntry != null) {
+            // Convert dataEntry to an Inventory object
+            Inventory inventoryItem =
+                  (Inventory)theBinding.entryToObject(dataEntry);
+            // Get the item name and use that as the key
+            String theItem = inventoryItem.getItemName();
+            resultEntry.setData(theItem.getBytes());
+        }
+        return true;
+    }
+} 
+
+
+
+

Now that we have a key creator, we can use it to generate keys for a secondary database. We will now extend + MyDbEnv to manage a secondary database, and to use ItemNameKeyCreator + to generate keys for that secondary database. +

+
+
+
+
+

Opening Secondary Databases with + MyDbEnv

+
+
+
+

In Stored Class Catalog Management with MyDbEnv we built + MyDbEnv as an example of a class that + encapsulates Environment and + Database opens and closes. We will now extend + that class to manage a SecondaryDatabase.

+
+ +

+ Example 10.2 SecondaryDatabase Management with MyDbEnv +

+
+

We start by importing two additional classes needed to support secondary databases. + We also add a global variable to use as a handle for our secondary database. +

+ +
// File MyDbEnv.java
+
+package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.serial.StoredClassCatalog;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.SecondaryConfig;
+import com.sleepycat.je.SecondaryDatabase;
+
+import java.io.File;
+
+public class MyDbEnv {
+
+    private Environment myEnv;
+
+    // The databases that our application uses
+    private Database vendorDb;
+    private Database inventoryDb;
+    private Database classCatalogDb;
+    private SecondaryDatabase itemNameIndexDb;
+
+    // Needed for object serialization
+    private StoredClassCatalog classCatalog;
+
+    // Our constructor does nothing
+    public MyDbEnv() {}
+

+ Next we update the MyDbEnv.setup() method to open the + secondary database. As a part of this, we have to pass an + ItemNameKeyCreator object on the call to open the secondary + database. Also, in order to instantiate ItemNameKeyCreator, we need an + InventoryBinding object (we described this class in InventoryBinding.java). We do all this work together inside of + MyDbEnv.setup(). +

+ +
    public void setup(File envHome, boolean readOnly)
+        throws DatabaseException {
+
+        EnvironmentConfig myEnvConfig = new EnvironmentConfig();
+        DatabaseConfig myDbConfig = new DatabaseConfig();
+        SecondaryConfig mySecConfig = new SecondaryConfig();
+
+        // If the environment is read-only, then
+        // make the databases read-only too.
+        myEnvConfig.setReadOnly(readOnly);
+        myDbConfig.setReadOnly(readOnly);
+        mySecConfig.setReadOnly(readOnly);
+
+        // If the environment is opened for write, then we want to be
+        // able to create the environment and databases if
+        // they do not exist.
+        myEnvConfig.setAllowCreate(!readOnly);
+        myDbConfig.setAllowCreate(!readOnly);
+        mySecConfig.setAllowCreate(!readOnly);
+
+        ...
+        // Environment and database opens omitted for brevity
+        ...
+
+        // Open the secondary database. We use this to create a
+        // secondary index for the inventory database
+
+        // We want to maintain an index for the inventory entries based
+        // on the item name. So, instantiate the appropriate key creator
+        // and open a secondary database.
+        ItemNameKeyCreator keyCreator =
+            new ItemNameKeyCreator(new InventoryBinding());
+
+        // Set up the secondary properties
+        mySecConfig.setAllowPopulate(true); // Allow autopopulate
+        mySecConfig.setKeyCreator(keyCreator);
+        // Need to allow duplicates for our secondary database
+        mySecConfig.setSortedDuplicates(true);
+
+        // Now open it
+        itemNameIndexDb =
+            myEnv.openSecondaryDatabase(
+                    null,     
+                    "itemNameIndex", // Index name
+                    inventoryDb,     // Primary database handle. This is
+                                     // the db that we're indexing. 
+                    mySecConfig);    // The secondary config
+    } 
+

+ Next we need an additional getter method for returning the secondary database. +

+ +
    public SecondaryDatabase getNameIndexDB() {
+        return itemNameIndexDb;
+    } 
+

Finally, we need to update the MyDbEnv.close() + method to close the new secondary database. We want to make sure that + the secondary is closed before the primaries. While + this is not necessary for this example because our + closes are single-threaded, it is still a good habit to adopt.

+ +
    public void close() {
+        if (myEnv != null) {
+            try {
+                //Close the secondary before closing the primaries
+                itemNameIndexDb.close();
+                vendorDb.close();
+                inventoryDb.close();
+                classCatalogDb.close();
+
+                // Finally, close the environment.
+                myEnv.close();
+            } catch(DatabaseException dbe) {
+                System.err.println("Error closing MyDbEnv: " +
+                                    dbe.toString());
+                System.exit(-1);
+            }
+        }
+    }
+} 
+

That completes our update to MyDbEnv. You + can find the complete class implementation in: +

+
JE_HOME/examples/je/gettingStarted/MyDbEnv.java 
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+
+
+
+

Because we performed all our secondary database configuration management in + MyDbEnv, we do not need to modify ExampleDatabasePut at all in + order to create our secondary indices. When ExampleDatabasePut calls + MyDbEnv.setup(), all of the necessary work is performed for us. +

+

+ However, we still need to take advantage of the new secondary indices. We do this by updating + ExampleInventoryRead to allow us to query for an inventory record based on its name. + Remember that the primary key for an inventory record is the item's SKU. The item's name is contained in the + Inventory object that is stored as each record's data in the inventory database. But + our new secondary index now allows us to easily query based on the item's name. +

+
+
+
+
+

Using Secondary Databases with ExampleInventoryRead

+
+
+
+

In the previous section we changed MyDbEnv + to cause a secondary database to be built using inventory item names as + the secondary keys. In this section, we will update + ExampleInventoryRead to allow us to query our + inventory records based on the item name. To do this, we will modify + ExampleInventoryRead to accept a new command line switch, + -s, whose argument is the name of an inventory item. + If the switch is present on the command line call to + ExampleInventoryRead, then the application will + use the secondary database to look up and display all the inventory + records with that item name. Note that we use a SecondaryCursor + to seek to the item name key and then display all matching records.

+

Remember that you can find the following class in:

+
JE_HOME/examples/je/gettingStarted/ExampleInventoryRead.java
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+ +

+ Example 10.3 SecondaryDatabase usage with ExampleInventoryRead +

+
+

First we need to import a few additional classes in order to use + secondary databases and cursors, and then we add a single global variable:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.SecondaryCursor;
+
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.bind.serial.SerialBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+
+import java.io.File;
+import java.io.IOException; 
+
+public class ExampleInventoryRead {
+
+    private static File myDbEnvPath =
+        new File("/tmp/JEDB");
+
+    // Encapsulates the database environment and databases.
+    private static MyDbEnv myDbEnv = new MyDbEnv();
+
+    private static TupleBinding inventoryBinding;
+    private static EntryBinding vendorBinding;
+
+    // The item to locate if the -s switch is used
+    private static String locateItem; 
+

Next we update ExampleInventoryRead.run() to + check to see if the locateItem global variable a + value. If it does, then we show just those records related to the item + name passed on the -s switch.

+ +
    private void run(String args[]) 
+        throws DatabaseException {
+            // Parse the arguments list
+            parseArgs(args);
+            myDbEnv.setup(myDbEnvPath, // path to the environment home
+                          true);      // is this environment read-only?
+
+            // Setup our bindings.
+            inventoryBinding = new InventoryBinding();
+            vendorBinding =
+                 new SerialBinding(myDbEnv.getClassCatalog(),
+                                   Vendor.class);
+
+            if (locateItem != null) {
+                showItem();
+            } else {
+                showAllInventory();
+            }
+    } 
+

+ Finally, we need to implement ExampleInventoryRead.showItem(). + This is a fairly simple method that opens a secondary cursor, + and then displays every primary record that is related to the secondary + key identified by the locateItem global variable. +

+ +
    private void showItem() throws DatabaseException {
+            SecondaryCursor secCursor = null;
+            try {
+                // searchKey is the key that we want to find in the 
+                // secondary db.
+                DatabaseEntry searchKey = 
+                    new DatabaseEntry(locateItem.getBytes("UTF-8"));
+
+                // foundKey and foundData are populated from the primary
+                // entry that is associated with the secondary db key.
+                DatabaseEntry foundKey = new DatabaseEntry();
+                DatabaseEntry foundData = new DatabaseEntry();
+
+                // open a secondary cursor
+                secCursor =
+                  myDbEnv.getNameIndexDB().openSecondaryCursor(null, null);
+
+                // Search for the secondary database entry.
+                OperationStatus retVal =
+                    secCursor.getSearchKey(searchKey, foundKey,
+                        foundData, LockMode.DEFAULT);
+
+                // Display the entry, if one is found. Repeat until no more
+                // secondary duplicate entries are found
+                while(retVal == OperationStatus.SUCCESS) {
+                    Inventory theInventory =
+                      (Inventory)inventoryBinding.entryToObject(foundData);
+                    displayInventoryRecord(foundKey, theInventory);
+                    retVal = secCursor.getNextDup(searchKey, foundKey,
+                        foundData, LockMode.DEFAULT);
+                }
+            } catch (Exception e) {
+                System.err.println("Error on inventory secondary cursor:");
+                System.err.println(e.toString());
+                e.printStackTrace();
+            } finally {
+                if (secCursor != null) {
+                    secCursor.close();
+                }
+            }
+        }
+

The only other thing left to do is to update + ExampleInventoryRead.parseArgs() to support the -s command + line switch. To see how this is done, see: +

+
JE_HOME/examples/je/gettingStarted/ExampleInventoryRead.java
+

+ where JE_HOME is the location where you + placed your JE distribution. +

+
+
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/introduction.html b/docs/GettingStartedGuide/introduction.html new file mode 100644 index 0000000..68dbde7 --- /dev/null +++ b/docs/GettingStartedGuide/introduction.html @@ -0,0 +1,616 @@ + + + + + + Chapter 1. Introduction to Berkeley DB Java Edition + + + + + + + + + +
+
+
+
+

Chapter 1. Introduction to Berkeley DB Java Edition

+
+
+
+
+

+ Table of Contents +

+
+
+ + Features + +
+
+
+
+ + DPL Features + +
+
+ + Base API Features + +
+
+ + Which API Should You Use? + +
+
+
+
+ + The JE Application + +
+
+
+
+ + Database Environments + +
+
+ + Key-Data Pairs + +
+
+ + Storing Data + +
+
+ + Duplicate Data + +
+
+ + Replacing and Deleting Entries + +
+
+ + Secondary Keys + +
+
+ + Transactions + +
+
+ + JE Resources + +
+
+ + + Application Considerations + + +
+
+
+
+ + JE Backup and Restore + +
+
+ + JCA Support + +
+
+ + JConsole and JMX Support + +
+
+ + Getting and Using JE + +
+
+ + JE Exceptions + +
+
+ + Six Things Everyone Should Know about JE Log Files + +
+
+
+

+ Welcome to Berkeley DB Java Edition (JE). JE is a general-purpose, + transaction-protected, embedded database written in 100% Java (JE + makes no JNI calls). As such, it offers the Java developer safe and + efficient in-process storage and management of arbitrary data. +

+

+ You use JE through a series of Java APIs which give you the + ability to read and write your data, manage your database(s), and + perform other more advanced activities such as managing + transactions. The Java APIs that you use to interact with JE + come in two basic flavors. The first is a high-level API that + allows you to make Java classes persistent. The second is a + lower-level API which provides additional flexibility when interacting + with JE databases. +

+
+

Note

+

+ For long-time users of JE, the lower-level API is the + traditional API that you are probably accustomed to using. +

+
+

+ Regardless of the API set that you choose to use, there are a + series of concepts and APIs that are common across the product. + This manual starts by providing a high-level examination of + JE. It then describes the APIs you use regardless of the API + set that you choose to use. It then provides information on using the + Direct Persistence Layer (DPL) API, followed by information on using + the more extensive "base" API. Finally, we provide some database + administration information. +

+

+ Note that the information provided here is intended to focus on + only introductory API usage. Other books describe more advanced + topics, such as transactional usage. See the For More Information section for + a listing of other titles in the JE documentation set. +

+
+
+
+
+

Features

+
+
+
+
+
+
+ + DPL Features + +
+
+ + Base API Features + +
+
+ + Which API Should You Use? + +
+
+
+

+ JE provides an enterprise-class Java-based data management + solution. All you need to get started is to add a single jar file to your + application's classpath. See Getting and Using JE for more information. +

+

+ JE offers the following major features: +

+
+
    +
  • +

    + Large database support. JE databases efficiently scale + from one to millions of records. The size of your JE + databases are likely to be limited more by hardware resources + than by any limits imposed upon you by JE. +

    +

    + Databases are described in + Databases. +

    +
  • +
  • +

    + Database environments. Database environments provide + a unit of encapsulation and management for one or + more databases. Environments are also the + unit of management for internal resources such as the + in-memory cache and the background threads. + Finally, you use environments to manage concurrency and + transactions. Note that all applications using JE + are required to use database environments. +

    +

    + Database environments are described in + Database Environments. +

    +
  • +
  • +

    + Multiple thread and process support. JE is designed for + multiple threads of control. Both read and write operations + can be performed by multiple threads. JE uses record-level + locking for high concurrency in threaded applications. + Further, JE uses timeouts for deadlock detection to help + you ensure that two threads of control do not deadlock + indefinitely. +

    +

    + Moreover, JE allows multiple processes to access the same + databases. However, in this configuration JE requires that + there be no more than one process allowed to write to the + database. Read-only processes are guaranteed a consistent, + although potentially out of date, view of the stored data as of + the time that the environment is opened. +

    +
  • +
  • +

    Transactions. Transactions allow you to treat one or more + operations on one or more databases as a single unit of work. + JE transactions offer the application developer recoverability, atomicity, and + isolation for your database operations. +

    +

    Note that transaction protection is optional. Transactions are + described in the Berkeley DB, Java Edition Getting Started with Transaction Processing guide.

    +
  • +
  • +

    + In-memory cache. The cache allows for high speed + database access for both read and write operations by + avoiding unnecessary disk I/O. The cache will grow + on demand up to a pre-configured maximum size. To + improve your application's performance immediately + after startup time, you can preload your cache in + order to avoid disk I/O for production requests of + your data. +

    +

    + Cache management is described in + Sizing the Cache. +

    +
  • +
  • +

    + + Indexes. JE allows you to easily create and maintain + secondary indices for your primary data. In this way, you can obtain rapid + access to your data through the use of an alternative, or + secondary, key. +

    +

    + How indices work is dependent upon the API you are + using. If you are using the DPL, see + Working with Indices. + Otherwise, see + Secondary Databases. +

    +
  • +
  • +

    + Log files. JE databases are stored in one + or more numerically-named log files in the environment + directory. The log files are write-once and are + portable across platforms with different endian-ness. +

    +

    + Unlike other database implementations, there is no + distinction between database files (that is, the "material + database") and log files. Instead JE employs a log-based storage + system to protect database modifications. Before any + change is made to a database, JE writes information about the + change to the log file. +

    +

    + Note that JE's log files are not binary compatible with Berkeley + DB's database files. However, both products provide dump and load + utilities, and the files that these operate on are compatible across + product lines. +

    +

    + JE's log files are described in more detail in + Backing up and Restoring Berkeley DB Java Edition Applications. + For information on using JE's dump and load utilities, + see The Command Line Tools. + Finally, for a short list of things to know about log files while you are learning JE, + see Six Things Everyone Should Know about JE Log Files. +

    +
  • +
  • +

    + Background threads. JE provides several threads + that manage internal resources for you. The + checkpointer is responsible for flushing database + data to disk that was written to cache as the result + of a transaction commit (this is done in order to + shorten recovery time). The compressor thread + removes subtrees from the database that are empty + because of deletion activity. Finally, the cleaner + thread is responsible for cleaning and removing + unneeded log files, thereby helping you to save on + disk space. +

    +

    + Background thread management is described in + Managing the Background Threads. +

    +
  • +
  • +

    + + Backup and restore. JE's backup procedure + consists of simply copying JE's log files to a + safe location for storage. To recover from a + catastrophic failure, you copy your archived log + files back to your production location on disk and + reopen the JE environment. +

    +

    + + Note that JE always performs normal + recovery when it opens a database + environment. Normal recovery brings the database to a + consistent state based on change information found in + the database log files. + +

    +

    + JE's backup and recovery mechanisms are described in + Backing up and Restoring Berkeley DB Java Edition Applications. +

    +
  • +
+
+
+
+
+
+

DPL Features

+
+
+
+

+ The DPL is one of two APIs that JE provides for + interaction with JE databases. The DPL provides + the ability to cause any Java type to be persistent + without implementing special interfaces. The + only real requirement is that each persistent + class have a default constructor. +

+

+ The DPL provides all of the features previously identified + in this chapter. In addition, the DPL offers you: +

+
+
    +
  • +

    + A type safe, convenient way to access + persistent objects. +

    +
  • +
  • +

    + No hand-coding of bindings is required. + A binding is a way of transforming data + types into a format which can be stored + in a JE database. If you do not use + the DPL, you may be required to + create custom bindings for your data + types. +

    +

    + See Using the BIND APIs + for more information on creating data bindings. +

    +

    + Note that Java byte code enhancement is + used by the DPL API to provide fully + optimized bindings that do not use Java + reflection. +

    +
  • +
  • +

    + No external schema is required to define + primary and secondary index keys. Java + annotations are used to define all + metadata. +

    +
  • +
  • +

    + Interoperability with external components is + supported using the Java collections framework. + Any index can be accessed using a standard + java.util collection. +

    +
  • +
  • +

    + Class evolution is explicitly supported. This + means you can add fields or widen types + automatically and transparently. +

    +

    + You can also perform many incompatible class + changes, such as renaming fields or refactoring a + single class. This is done using a built-in + DPL mechanism called + mutations. + Mutations are automatically applied as data is + accessed so as to avoid downtime to convert large + databases during a software upgrade. +

    +
  • +
  • +

    + Persistent class fields can be private, + package-private, protected or public. The + DPL can access persistence fields + either by bytecode enhancement or by reflection. +

    +
  • +
  • +

    + The performance of the underlying JE + engine is safe-guarded. All + DPL operations are mapped directly to + the underlying APIs, object bindings are + lightweight, and all engine tuning parameters are + available. +

    +
  • +
  • +

    + Java 1.5 generic types and annotations are + supported. +

    +
  • +
+
+
+
+
+
+
+

Base API Features

+
+
+
+

+ If you are not using the DPL, then the following concepts and + features are likely to be of interest to you: +

+
+
    +
  • +

    + Database records. All database records are organized + as simple key/data pairs. Both keys and data can be + anything from primitive Java types to the most + complex of Java objects. +

    +

    + Database records are described in + Database Records. +

    +
  • +
  • +

    + Direct database read and write. You can use methods + of a Database object to read + and write database records. Reading and writing using + Database objects are described + in + Database Records. +

    +
  • +
  • +

    + Cursors. Cursors give you the ability to sequentially + move through a database. Using cursors, you can seek + to a specific point in the database (using search + criteria applied to the key and/or the data portion + of a database record) and then either step forward or + step backwards through the database. +

    +

    + Cursors are described in detail in + Using Cursors. +

    +
  • +
  • +

    + JCA. JE provides support for the Java Connector Architecture. See + JCA Support for more information. +

    +
  • +
  • +

    + JMX. JE provides support for Java Management Extensions. + See JConsole and JMX Support for more information. +

    +
  • +
+
+
+
+
+
+
+

Which API Should You Use?

+
+
+
+

+ Of the two APIs that JE makes available to you, we + recommend that you use the DPL if all + you want to do is make classes with a relatively static schema to + be persistent. +

+

+ Further, if you are porting an application between Berkley DB + and Berkeley DB Java Edition, then you should not use the DPL as the + base API is a much closer match to the Berkley DB Java API. +

+

+ Additionally, if your application uses a highly dynamic + schema, then the DPL is probably a poor choice for + your application, although the use of Java annotations + can make the DPL work a little better for you in this + situation. +

+
+
+
+ + + diff --git a/docs/GettingStartedGuide/inventoryclass.html b/docs/GettingStartedGuide/inventoryclass.html new file mode 100644 index 0000000..62ab7ec --- /dev/null +++ b/docs/GettingStartedGuide/inventoryclass.html @@ -0,0 +1,148 @@ + + + + + + Inventory.java + + + + + + + + + +
+
+
+
+

Inventory.java

+
+
+
+

+ Our example's Inventory + class is much like our Vendor + class in that it is simply used to encapsulate + data. However, in this case we want to be able + to access objects two different ways: by + product SKU and by product name. +

+

+ In our data set, the product SKU is required to be + unique, so we use that as the primary key. The + product name, however, is not a unique value so we + set this up as a secondary key. +

+

+ The class appears as follows in our example: +

+
package persist.gettingStarted;
+
+import com.sleepycat.persist.model.Entity;
+import com.sleepycat.persist.model.PrimaryKey;
+import static com.sleepycat.persist.model.Relationship.*;
+import com.sleepycat.persist.model.SecondaryKey;
+
+@Entity
+public class Inventory {
+
+    // Primary key is sku
+    @PrimaryKey
+    private String sku;
+
+    // Secondary key is the itemName
+    @SecondaryKey(relate=MANY_TO_ONE)
+    private String itemName;
+
+    private String category;
+    private String vendor;
+    private int vendorInventory;
+    private float vendorPrice;
+
+    public void setSku(String data) {
+        sku = data;
+    }
+
+    public void setItemName(String data) {
+        itemName = data;
+    }
+
+    public void setCategory(String data) {
+        category = data;
+    }
+
+    public void setVendorInventory(int data) {
+        vendorInventory = data;
+    }
+
+    public void setVendor(String data) {
+        vendor = data;
+    }
+
+    public void setVendorPrice(float data) {
+        vendorPrice = data;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public String getItemName() {
+        return itemName;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public int getVendorInventory() {
+        return vendorInventory;
+    }
+
+    public String getVendor() {
+        return vendor;
+    }
+
+    public float getVendorPrice() {
+        return vendorPrice;
+    }
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/jca.html b/docs/GettingStartedGuide/jca.html new file mode 100644 index 0000000..5231582 --- /dev/null +++ b/docs/GettingStartedGuide/jca.html @@ -0,0 +1,106 @@ + + + + + + JCA Support + + + + + + + + + +
+
+
+
+

JCA Support

+
+
+
+

+ JCA is the Java Connector Architecture. This architecture provides a standard for connecting + the J2EE platform to legacy enterprise information systems (EIS), such as ERP systems, database systems, and + legacy applications not written in Java. JE supports this architecture. +

+

+ Users who want to run JE within a J2EE Application Server can use the JCA Resource Adapter to connect to + JE through a standard API. Note that the base API is required if you want to do this. + The JE Resource Adapter supports all three J2EE application server transaction + types: +

+
+
    +
  • +

    + No transaction. +

    +
  • +
  • +

    + Local transactions. +

    +
  • +
  • +

    + XA transactions. +

    +
  • +
+
+

+ JCA also includes the Java Transaction API (JTA), which means that JE supports 2 phase commit (XA). + Therefore, JEs can participate in distributed transactions managed by either a J2EE server or the + applications direct use of the JTA API. +

+

+ The JE distribution includes an example showing JCA usage in a simple EJB. The Resource Adaptor has been + tested using JBoss 3.2.6, and the Sun Java System Application Server, version 8.1. Instructions for how to build + the Resource Adapter and run a simple "smoke test" example for each of the application servers can be found + here: +

+
JE_HOME/examples/jca/HOWTO-jboss.txt
+

+ and +

+
JE_HOME/examples/jca/HOWTO-sjsas.txt
+
+ + + diff --git a/docs/GettingStartedGuide/jeexceptions.html b/docs/GettingStartedGuide/jeexceptions.html new file mode 100644 index 0000000..3d82254 --- /dev/null +++ b/docs/GettingStartedGuide/jeexceptions.html @@ -0,0 +1,154 @@ + + + + + + JE Exceptions + + + + + + + + + +
+
+
+
+

JE Exceptions

+
+
+
+

+ Before describing the Java API usage, it is first useful to examine the + exceptions thrown by those APIs. So, briefly, this section describes the + exceptions that you can generally expect to encounter when writing JE + applications. This list is not definitive. Exceptions beyond these can be + expected, depending on the specific database activity you are performing. + See the Javadoc for more information. +

+

+ All of the JE APIs throw + DatabaseException. + DatabaseException extends + java.lang.Exception. Also, the following + classes are subclasses of DatabaseException: +

+
+
    +
  • +

    + DatabaseNotFoundException +

    +

    + Thrown whenever an operation requires a database, and that + database cannot be found. +

    +
  • +
  • +

    + DiskLimitException +

    +

    + Indicates that you have reached your disk usage thresholds. Writes are + no longer allowed when these thresholds are exceeded. The thresholds + are set using the EnvironmentConfig.MAX_DISK and EnvironmentConfig.FREE_DISK properties. This exception + can be thrown as the result of any write operation, including database + record writes, checkpoints, and database and environment syncs. +

    +

    + When closing the environment, this exception can be seen. + However, the environment will still be properly closed. +

    +

    + For information on setting these properties, see + Setting Disk Thresholds. +

    +
  • +
  • +

    + EnvironmentFailureException +

    +

    + Indicates that a failure has occurred that could impact the Environment as + a whole. Depending on the nature of the failure, this exception might + indicate that Environment.close() should + be called. Use Environment.isValid() to + determine if all Environment handles must + be reopened. If true, the environment can + continue operating without being reopened. +

    +
  • +
  • +

    + LockConflictException +

    +

    + The common base class for all exceptions that result from record + lock conflicts. Upon receiving this exception, any open cursors + must be closed, the enclosing transaction aborted and, + optionally, the transaction retried. Transactions are described + in the Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

    +
  • +
  • +

    + LogWriteException +

    +

    + Thrown when an IOException or other failure occurs + when writing to the JE log. This exception might be indicative of a + full disk, although an IOException does not contain + enough information to determine this definitively. +

    +

    + This exception can be thrown as the result of any write + operation, including database record writes, checkpoints, and + database and environment syncs. +

    +
  • +
+
+

+ Note that DatabaseException and its subclasses belong to the + com.sleepycat.je package. +

+
+ + + diff --git a/docs/GettingStartedGuide/jmx.html b/docs/GettingStartedGuide/jmx.html new file mode 100644 index 0000000..4f850ce --- /dev/null +++ b/docs/GettingStartedGuide/jmx.html @@ -0,0 +1,74 @@ + + + + + + JConsole and JMX Support + + + + + + + + + +
+
+
+
+

JConsole and JMX Support

+
+
+
+

+ JMX is the Java Management Extensions. This extension provides + tools for managing and monitoring devices, applications, and service-driven networks. JE supports this extension. +

+

+ The JE distribution supplies MBeans that can be deployed for monitoring a JE environment in any JMX + server (such as an J2EE application server). Statistics and key operations can be invoked from these MBeans. + In addition, JE provides a plugin for the jconsole utility which + lets the user graphically access this information. +

+

+ For information on how to use the jconsole plugin see: +

+
JE_HOME/docs/jconsole/JConsole-plugin.html
+
+ + + diff --git a/docs/GettingStartedGuide/joins.html b/docs/GettingStartedGuide/joins.html new file mode 100644 index 0000000..600b1f4 --- /dev/null +++ b/docs/GettingStartedGuide/joins.html @@ -0,0 +1,377 @@ + + + + + + Database Joins + + + + + + + + + +
+
+
+
+

Database Joins

+
+
+
+
+
+
+ + Using Join Cursors + +
+
+ + JoinCursor Properties + +
+
+
+

+ If you have two or more secondary databases associated with a primary + database, then you can retrieve primary records based on the intersection of + multiple secondary entries. You do this using a + JoinCursor. + +

+

+ Throughout this document we have presented a + class + + that stores + inventory + information on grocery + items. + + That + class + + is fairly simple with a limited + number of data members, few of which would be interesting from a query + perspective. But suppose, instead, that we were storing + information on something with many more characteristics that can be queried, such + as an automobile. In that case, you may be storing information such as + color, number of doors, fuel mileage, automobile type, number of + passengers, make, model, and year, to name just a few. +

+

+ In this case, you would still likely be using some unique value to key your + primary entries (in the United States, the automobile's VIN would be + ideal for this purpose). You would then create a + class + + that identifies + all the characteristics of the automobiles in your inventory. + + + You would + also have to create some mechanism by which you would move instances of + this class in and out of Java byte arrays. We + described the concepts and mechanisms by which you can perform these + activities in Database Records. + +

+

+ To query this data, you might then create multiple secondary databases, + one for each of the characteristics that you want to query. For + example, you might create a secondary for color, another for number of + doors, another for number of passengers, and so forth. Of course, you + will need a unique + key creator + + for each such secondary database. You do + all of this using the concepts and techniques described throughout this + chapter. +

+

+ Once you have created this primary database and all interesting + secondaries, what you have is the ability to retrieve automobile records + based on a single characteristic. You can, for example, find all the + automobiles that are red. Or you can find all the automobiles that have + four doors. Or all the automobiles that are minivans. +

+

+ The next most natural step, then, is to form compound queries, or joins. + For example, you might want to find all the automobiles that are red, + and that were built by Toyota, and that are minivans. You can do this + using a + JoinCursor class instance. + +

+
+
+
+
+

Using Join Cursors

+
+
+
+

+ To use a join cursor: +

+
+
    +
  • +

    + Open two or more + secondary cursors. These + cursors + must be obtained from + + secondary databases that are associated with + the same primary database. +

    +
  • +
  • +

    + Position each such cursor to the secondary key + value in which you are interested. For example, to build on + the previous description, the cursor for the color + database is positioned to the red records + while the cursor for the model database is positioned to the + minivan records, and the cursor for the + make database is positioned to Toyota. +

    +
  • +
  • +

    + + Create an array of secondary cursors, and + place in it each of the cursors that are participating in your join query. + + +

    +
  • +
  • +

    + + Obtain a join cursor. You do this using the + Database.join() + + + method. You must pass this method the array of secondary cursors that you + opened and positioned in the previous steps. +

    +
  • +
  • +

    + Iterate over the set of matching records + using JoinCursor.getNext() + until + OperationStatus is not SUCCESS. + +

    +
  • +
  • +

    + Close your join cursor. +

    +
  • +
  • +

    + If you are done with them, close all your secondary cursors. +

    +
  • +
+
+

+ For example: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.JoinCursor;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.SecondaryCursor;
+import com.sleepycat.je.SecondaryDatabase;
+
+...
+
+// Database and secondary database opens omitted for brevity.
+// Assume a primary database handle:
+//   automotiveDB
+// Assume 3 secondary database handles:
+//   automotiveColorDB  -- index based on automobile color
+//   automotiveTypeDB  -- index based on automobile type
+//   automotiveMakeDB   -- index based on the manufacturer
+
+// Query strings:
+String theColor = "red";
+String theType = "minivan";
+String theMake = "Toyota";
+
+// Secondary cursors used for the query:
+SecondaryCursor colorSecCursor = null;
+SecondaryCursor typeSecCursor = null;
+SecondaryCursor makeSecCursor = null;
+
+// The join cursor
+JoinCursor joinCursor = null;
+
+// These are needed for our queries
+DatabaseEntry foundKey = new DatabaseEntry();
+DatabaseEntry foundData = new DatabaseEntry();
+
+// All cursor operations are enclosed in a try block to ensure that they
+// get closed in the event of an exception.
+
+try {
+    // Database entries used for the query:
+    DatabaseEntry color = new DatabaseEntry(theColor.getBytes("UTF-8"));
+    DatabaseEntry type = new DatabaseEntry(theType.getBytes("UTF-8"));
+    DatabaseEntry make = new DatabaseEntry(theMake.getBytes("UTF-8"));
+
+    colorSecCursor = automotiveColorDB.openSecondaryCursor(null, null); 
+    typeSecCursor = automotiveTypeDB.openSecondaryCursor(null, null); 
+    makeSecCursor = automotiveMakeDB.openSecondaryCursor(null, null); 
+
+    // Position all our secondary cursors to our query values.
+    OperationStatus colorRet = 
+        colorSecCursor.getSearchKey(color, foundData, LockMode.DEFAULT);
+    OperationStatus typeRet = 
+        typeSecCursor.getSearchKey(type, foundData, LockMode.DEFAULT);
+    OperationStatus makeRet = 
+        makeSecCursor.getSearchKey(make, foundData, LockMode.DEFAULT);
+
+    // If all our searches returned successfully, we can proceed
+    if (colorRet == OperationStatus.SUCCESS &&
+        typeRet == OperationStatus.SUCCESS &&
+        makeRet == OperationStatus.SUCCESS) {
+
+        // Get a secondary cursor array and populate it with our
+        // positioned cursors
+        SecondaryCursor[] cursorArray = {colorSecCursor,
+                                         typeSecCursor, 
+                                         makeSecCursor};
+
+        // Create the join cursor
+        joinCursor = automotiveDB.join(cursorArray, null);
+
+        // Now iterate over the results, handling each in turn
+        while (joinCursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
+                        OperationStatus.SUCCESS) {
+
+            // Do something with the key and data retrieved in
+            // foundKey and foundData
+        }
+    }
+} catch (DatabaseException dbe) {
+    // Error reporting goes here
+} catch (Exception e) {
+    // Error reporting goes here
+} finally {
+    try {
+        // Make sure to close out all our cursors
+        if (colorSecCursor != null) {
+            colorSecCursor.close();
+        }
+        if (typeSecCursor != null) {
+            typeSecCursor.close();
+        }
+        if (makeSecCursor != null) {
+            makeSecCursor.close();
+        }
+        if (joinCursor != null) {
+            joinCursor.close();
+        }
+    } catch (DatabaseException dbe) {
+        // Error reporting goes here
+    }
+} 
+
+
+
+
+
+

JoinCursor Properties

+
+
+
+

+ You can set JoinCursor properties using the + JoinConfig class. Currently there is just one property that you can + set: +

+
+
    +
  • +

    + JoinConfig.setNoSort() +

    +

    + Specifies whether automatic sorting of input cursors is disabled. The cursors are sorted from the + one that refers to the least number of data items to the one that refers to the most. +

    +

    + If the data is structured so that cursors with many data items also share many common elements, + higher performance will result from listing those cursors before cursors with fewer data + items. Turning off sorting permits applications to specify cursors in the proper order given this + scenario. +

    +

    + The default value is false (automatic cursor sorting is performed). +

    +

    + For example: +

    + +
    // All database and environments omitted
    +JoinConfig config = new JoinConfig();
    +config.setNoSort(true);
    +JoinCursor joinCursor = myDb.join(cursorArray, config); 
    +
  • +
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/keyCreator.html b/docs/GettingStartedGuide/keyCreator.html new file mode 100644 index 0000000..8bf2e3f --- /dev/null +++ b/docs/GettingStartedGuide/keyCreator.html @@ -0,0 +1,241 @@ + + + + + + Implementing Key Creators + + + + + + + + + +
+
+
+
+

Implementing Key + Creators + +

+
+
+
+

+ You must provide every secondary database with a + class + + that creates keys from primary records. You identify this + class + + + + using the SecondaryConfig.setKeyCreator() + method. + + +

+

+ You can create keys using whatever data you want. Typically you will + base your key on some information found in a record's data, but you + can also use information found in the primary record's key. How you build + your keys is entirely dependent upon the nature of the index that you + want to maintain. +

+

+ You implement a key creator by writing a class that implements the + SecondaryKeyCreator interface. This interface + requires you to implement the SecondaryKeyCreator.createSecondaryKey() + method. +

+

+ One thing to remember when implementing this method is that you will + need a way to extract the necessary information from the data's + DatabaseEntry and/or the key's + DatabaseEntry that are provided on calls to this + method. If you are using complex objects, then you are probably using the + Bind APIs to perform this conversion. The easiest thing to do is to + instantiate the EntryBinding or + TupleBinding that you need to perform the + conversion, and then provide this to your key creator's constructor. + The Bind APIs are introduced in Using the BIND APIs. +

+

+ SecondaryKeyCreator.createSecondaryKey() returns a + boolean. A return value of false indicates that + no secondary key exists, and therefore no record should be added to the secondary database for that primary record. + If a record already exists in the secondary database, it is deleted. +

+

+ For example, suppose your primary database uses the following class + for its record data: +

+ +
package je.gettingStarted;
+
+public class PersonData {
+    private String userID;
+    private String surname;
+    private String familiarName;
+
+    public PersonData(String userID, String surname, 
+                      String familiarName) {
+        this.userID = userID;
+        this.surname = surname;
+        this.familiarName = familiarName;
+    }
+
+    public String getUserID() {
+        return userID;
+    }
+
+    public String getSurname() {
+        return surname;
+    }
+
+    public String getFamiliarName() {
+        return familiarName;
+    }
+} 
+

+ Also, suppose that you have created a custom tuple binding, + PersonDataBinding, that you use to convert + PersonData objects to and from + DatabaseEntry objects. (Custom tuple bindings are + described in Custom Tuple Bindings.) +

+

+ Finally, suppose you want a secondary database that is keyed based + on the person's full name. +

+

+ Then in this case you might create a key creator as follows: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+
+import com.sleepycat.je.SecondaryKeyCreator;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.SecondaryDatabase;
+
+import java.io.IOException;
+
+public class FullNameKeyCreator implements SecondaryKeyCreator {
+ 
+    private TupleBinding theBinding;
+
+    public FullNameKeyCreator(TupleBinding theBinding1) {
+            theBinding = theBinding1;
+    }
+
+    public boolean createSecondaryKey(SecondaryDatabase secDb,
+                                      DatabaseEntry keyEntry, 
+                                      DatabaseEntry dataEntry,
+                                      DatabaseEntry resultEntry) {
+
+        try {
+            PersonData pd = 
+                (PersonData) theBinding.entryToObject(dataEntry);
+                String fullName = pd.getFamiliarName() + " " + 
+                    pd.getSurname();
+                resultEntry.setData(fullName.getBytes("UTF-8"));
+        } catch (IOException willNeverOccur) {}
+        return true;
+    }
+} 
+

Finally, you use this key creator as follows:

+ +
package je.gettingStarted;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.SecondaryDatabase;
+import com.sleepycat.je.SecondaryConfig;
+
+...
+
+Environment myEnv = null;
+Database myDb = null;
+SecondaryDatabase mySecDb = null;
+try {
+    // Environment and primary database open omitted for brevity
+...
+
+    TupleBinding myDataBinding = new MyTupleBinding();
+    FullNameKeyCreator fnkc = new FullNameKeyCreator(myDataBinding);
+
+    SecondaryConfig mySecConfig = new SecondaryConfig();
+    mySecConfig.setKeyCreator(fnkc);
+
+    //Perform the actual open
+    String secDbName = "mySecondaryDatabase";
+    mySecDb = myEnv.openSecondaryDatabase(null, secDbName, myDb, 
+                                          mySecConfig);
+} catch (DatabaseException de) {
+    // Exception handling goes here
+} finally {
+    try {
+        if (mySecDb != null) {
+            mySecDb.close();
+        }
+
+        if (myDb != null) {
+            myDb.close(); 
+        }
+
+        if (myEnv != null) {
+            myEnv.close();
+        }
+    } catch (DatabaseException dbe) {
+        // Exception handling goes here
+    }
+}
+
+ + + diff --git a/docs/GettingStartedGuide/logfilesrevealed.html b/docs/GettingStartedGuide/logfilesrevealed.html new file mode 100644 index 0000000..d429273 --- /dev/null +++ b/docs/GettingStartedGuide/logfilesrevealed.html @@ -0,0 +1,133 @@ + + + + + + Six Things Everyone Should Know about JE Log Files + + + + + + + + + +
+
+
+
+

Six Things Everyone Should Know about JE Log Files

+
+
+
+

+ JE log files are not like the log files of other database systems. Nor are they like the log files or database + files created by Berkeley DB C Edition. In this guide you will learn more about log files as you go along, but it is good + to keep the following points in mind as you begin using JE. +

+
+
    +
  1. +

    + JE log files are "append only". Record insertions, deletions, and updates are always added at the end + of the current file. The first file is named 00000000.jdb. When that file grows to a certain size + (10 MB by default) a new file named 00000001.jdb becomes the current file, and so on. +

    +
  2. +
  3. +

    + There are no separate database files. Unlike Berkeley DB C Edition, databases are not stored in files + that are separate from the transaction log. The transaction log and the database records are stored + together in a single sequential log consisting of multiple log files. +

    +
  4. +
  5. +

    + The JE cleaner is responsible for reclaiming unused disk space. When the records in a log file are + superseded by deletions or updates recorded in a later log file, the older log file is no longer fully + utilized. The cleaner, which operates by default as a separate thread, determines the least utilized + log files, copies any still utilized records in those files to the end of the current log file, and + finally deletes the now completely un-utilized log file. +

    +

    + See The Cleaner Thread for more information on the cleaner. +

    +
  6. +
  7. +

    + Cleaning does not start immediately and never produces 100% utilization. Until you have written enough + data to create several log files, and some of that data is obsoleted through deletions and updates, you + will not notice any log files being deleted by the cleaner. By default cleaning occurs in the background and + maintains the log files at 50% utilization. You can configure a higher utilization value, but + configuring too high a utilization value will reduce overall performance. +

    +
  8. +
  9. +

    + Cleaning is not automatically performed when closing the environment. If you wish to reduce unused disk + space to a minimum at a particular point in time, you must explicitly call a method to perform log + cleaning. See the Closing Database Environments for more information. +

    +
  10. +
  11. +

    + Log file deletion only occurs after a checkpoint. The cleaner prepares log files to be deleted, but + file deletion must be performed after a checkpoint to ensure that the files are no longer referenced. + Checkpoints occur on their own schedule, which is every 20 MB of log written, by default. This is part + of the reason that you will not see log files being deleted until after several files have been created. +

    +

    + When using JE's replication (high availability) feature, a checkpoint does not delete + the cleaned log file but instead instead changes the status of the file to reserved. + Reserved files are only deleted when disk utilization exceeds the values set for either + EnvironmentConfig.MAX_DISK or EnvironmentConfig.FREE_DISK. +

    +
  12. +
  13. +

    + Log files can be spread across multiple directories, and therefore across multiple + disks through the use of links or mount points. See + Multiple Environment Subdirectories + for more information. +

    +
  14. +
+
+
+ + + diff --git a/docs/GettingStartedGuide/managelogging.html b/docs/GettingStartedGuide/managelogging.html new file mode 100644 index 0000000..acafd8e --- /dev/null +++ b/docs/GettingStartedGuide/managelogging.html @@ -0,0 +1,260 @@ + + + + + + Logging + + + + + + + + + +
+
+
+
+

Logging

+
+
+
+ +

+ JE uses the java.util.logging package to + log operations and trace messages. A distinct logger is defined for + each significant component of the system. The use of distinct loggers, along with + controllable logging levels, allows the logging output to be + tuned to tell you exactly what you need to know (while avoiding a lot of + extra information that only gets in the way) in order to monitor + your application's activities and/or debug runtime problems. +

+

+ Logging output can be displayed to the console and the + je.info file in your application's + environment directory. Setting the logger level controls the + types of messages that are published to the handlers. Setting the handler level + determines if and where the published messages are displayed. +

+
+
+
+
+

Managing Logging Levels

+
+
+
+

+ The default logging level for JE loggers is + INFO. At that level, a non-replicated + environment issues messages only when critical exceptions are + encountered. A replicated environment issues node transition + messages which should be comprehensible to the user familiar with + the replication group life cycle and can be extremely useful when + monitoring your application's activities. The output at the + INFO is not verbose; it simply details the + node start up and shutdown operations. Initial configuration + problems, if any, should show up during the startup operation. + You are strongly advised to run your production application with + this level of logging. +

+

+ Finer levels of logging are available for debugging purposes. + These will generate verbose output that is rich in implementation + detail. The output at these levels is only likely to be helpful + to people familiar with JE's implementation and the + application's use of JE, so you should only configure your logging + for these more verbose levels if you are involved in a detailed + debugging effort. +

+

+ To set or change the logger level before the environment is + opened, do one of the following: +

+
+
    +
  1. +

    + Set logging levels using the standard Java LogManager + properties file. For example, you can set: +

    +
    com.sleepycat.je.level=INFO
    +

    + in the LogManager properties file to set the logger + level for all JE loggers. +

    +
  2. +
  3. +

    + Set logging levels programmatically using the + java.util.logging API. For example: +

    +
    ...
    +// All other imports are omitted for brevity
    +import java.util.logging.Logger;
    +...
    +
    +Logger parent = Logger.getLogger("com.sleepycat.je");
    +parent.setLevel(Level.FINE);  // Loggers will now publish more 
    +                              // detailed messages.   
    +
  4. +
+
+

+ To set or change the logger level after the environment is + opened, do one of the following: +

+
+
    +
  1. +

    + Use the standard java.util.logging MBean to set a + concrete JE logger. +

    +
  2. +
  3. +

    + Use the JEDiagnostic MBean to set the parent + com.sleepycat.je logger. + See the JConsole Plugin page for information on + this MBean. +

    +
  4. +
  5. +

    + Use the programmatic java.util.logging API described + above to change the logger. +

    +
  6. +
+
+
+
+
+
+
+

Managing Handler Levels

+
+
+
+

+ Output to the je.info file is managed by + the JE FileHandler, while output to the console is managed + by the JE ConsoleHandler. By default, no output is shown on + the console, and only INFO level messages are + sent to je.info. +

+

+ To set or change the handler level before the environment is + opened, do one of the following: +

+
+
    +
  1. +

    + Set logging levels using the standard Java + LogManager properties file. For example, you can + set: +

    +
    com.sleepycat.je.util.FileHandler.level=ALL
    +com.sleepycat.je.util.ConsoleHandler.level=ALL
    +

    + in the LogManager properties file to display all + logging output to the console and + je.info files. +

    +
  2. +
  3. +

    + The java.util.logging package does not supply an + API for setting handler levels. Instead, use the + following JE environment parameter: +

    +
    ...
    +EnvironmentConfig envConfig = new EnvironmentConfig();
    +envConfig.setAllowCreate(true);
    +envConfig.setConfigParam(EnvironmentConfig.FILE_LOGGING_LEVEL, "ALL");
    +envConfig.setConfigParam(EnvironmentConfig.CONSOLE_LOGGING_LEVEL, 
    +                         "ALL");
    +
    +...
    +// Open your environment as normal here
    +...   
    +
  4. +
+
+

+ To set or change the handler level after the environment is + opened, do one of the following: +

+
+
    +
  1. +

    + Use EnvironmentMutableConfig.setConfigParam() to change the + handler levels using the JE properties described + above. +

    +
  2. +
  3. +

    + Use the JEDiagnostic MBean to change handler levels. + See the JConsole Plugin page for information on + this MBean. +

    +
  4. +
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/moreinfo.html b/docs/GettingStartedGuide/moreinfo.html new file mode 100644 index 0000000..2f2fd2c --- /dev/null +++ b/docs/GettingStartedGuide/moreinfo.html @@ -0,0 +1,165 @@ + + + + + + For More Information + + + + + + + + + +
+
+
+
+

For More Information

+
+
+
+
+
+
+ + Contact Us + +
+
+
+

+ Beyond this manual, you may also find the following sources of + information useful when building a JE application: +

+ + +

+ To download the latest + + Berkeley DB Java Edition + + documentation along with white papers and other collateral, + visit http://www.oracle.com/technetwork/indexes/documentation/index.html. +

+

+ For the latest version of the Oracle + + Berkeley DB Java Edition + + downloads, visit + http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html. +

+
+
+
+
+
+

Contact Us

+
+
+
+

+ You can post your comments and questions at the Oracle + Technology (OTN) forum for + + + + Oracle Berkeley DB Java Edition at: https://forums.oracle.com/forums/forum.jspa?forumID=273. + +

+

+ For sales or support information, email to: + berkeleydb-info_us@oracle.com + You can subscribe to a low-volume email announcement list for + the Berkeley DB product family by sending email to: + bdb-join@oss.oracle.com +

+
+
+ + + diff --git a/docs/GettingStartedGuide/multiprocess.html b/docs/GettingStartedGuide/multiprocess.html new file mode 100644 index 0000000..99537ca --- /dev/null +++ b/docs/GettingStartedGuide/multiprocess.html @@ -0,0 +1,89 @@ + + + + + + Multiprocess Applications + + + + + + + + +
+
+
+
+

Multiprocess Applications

+
+
+
+

+ Note the following if you are writing an application that wants to access JE databases from multiple + processes: +

+
+
    +
  • +

    + In JE, you must use environments. Further, a database can be opened for write access only if the + environment is opened for write access. Finally, only one process may have an environment opened for + write access at a time. +

    +
  • +
  • +

    + If your process attempts to open an environment for write, and another process has already opened that + environment for write, then the open will fail. In this event, the process must either exit or open the + environment as read-only. +

    +
  • +
  • +

    + A process that opens an environment for read-only receives a snapshot of the data in that environment. + If another process modifies the environment's databases in any way, the read-only version of the data + will not be updated until the read-only process closes and reopens the environment (and by extension all + databases in that environment). +

    +
  • +
+
+
+ + + diff --git a/docs/GettingStartedGuide/mydbenv-persist.html b/docs/GettingStartedGuide/mydbenv-persist.html new file mode 100644 index 0000000..d73ab2d --- /dev/null +++ b/docs/GettingStartedGuide/mydbenv-persist.html @@ -0,0 +1,156 @@ + + + + + + MyDbEnv + + + + + + + + + +
+
+
+
+

MyDbEnv

+
+
+
+

+ The applications that we are building for our example both + must open and close environments and entity stores. One + of our applications is writing to the entity store, so this + application needs to open the store as read-write. It also + wants to be able to create the store if it does not exist. +

+

+ Our second application only reads from the store. In this + case, the store should be opened as read-only. +

+

+ We perform these activities by creating a single class that + is responsible for opening and closing our store and + environment. This class is shared by both our applications. + To use it, callers need to only provide the path to the + environment home directory, and to indicate whether the + object is meant to be read-only. The class implementation + is as follows: +

+
package persist.gettingStarted;
+
+import java.io.File;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import com.sleepycat.persist.EntityStore;
+import com.sleepycat.persist.StoreConfig;
+
+public class MyDbEnv {
+
+    private Environment myEnv;
+    private EntityStore store;
+
+    // Our constructor does nothing
+    public MyDbEnv() {}
+
+    // The setup() method opens the environment and store
+    // for us.
+    public void setup(File envHome, boolean readOnly)
+        throws DatabaseException {
+
+        EnvironmentConfig myEnvConfig = new EnvironmentConfig();
+        StoreConfig storeConfig = new StoreConfig();
+
+        myEnvConfig.setReadOnly(readOnly);
+        storeConfig.setReadOnly(readOnly);
+
+        // If the environment is opened for write, then we want to be 
+        // able to create the environment and entity store if 
+        // they do not exist.
+        myEnvConfig.setAllowCreate(!readOnly);
+        storeConfig.setAllowCreate(!readOnly);
+
+        // Open the environment and entity store
+        myEnv = new Environment(envHome, myEnvConfig);
+        store = new EntityStore(myEnv, "EntityStore", storeConfig);
+
+    }
+
+    // Return a handle to the entity store
+    public EntityStore getEntityStore() {
+        return store;
+    }
+
+    // Return a handle to the environment
+    public Environment getEnv() {
+        return myEnv;
+    }
+
+    // Close the store and environment.
+    public void close() {
+        if (store != null) {
+            try {
+                store.close();
+            } catch(DatabaseException dbe) {
+                System.err.println("Error closing store: " +
+                                    dbe.toString());
+               System.exit(-1);
+            }
+        }
+
+        if (myEnv != null) {
+            try {
+                // Finally, close the environment.
+                myEnv.close();
+            } catch(DatabaseException dbe) {
+                System.err.println("Error closing MyDbEnv: " +
+                                    dbe.toString());
+               System.exit(-1);
+            }
+        }
+    }
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/persist_access.html b/docs/GettingStartedGuide/persist_access.html new file mode 100644 index 0000000..43e22e8 --- /dev/null +++ b/docs/GettingStartedGuide/persist_access.html @@ -0,0 +1,243 @@ + + + + + + Chapter 5. Saving and Retrieving Objects + + + + + + + + + +
+
+
+
+

Chapter 5. Saving and Retrieving Objects

+
+
+
+ +

+ To store an object in an EntityStore you + must annotate the class appropriately and then store it using + PrimaryIndex.put(). +

+

+ To retrieve and object from an EntityStore + you use the get() method from either the + PrimaryIndex or + SecondaryIndex, whichever is most + appropriate for your application. +

+

+ In both cases, it simplifies things greatly if you create a data + accessor class to organize your indexes. +

+

+ In the next few sections we: +

+
+
    +
  1. +

    + Create an entity class that is ready to be stored + in an entity store. This class will have both a + primary index (required) declared for it, as well + as a secondary index (which is optional). +

    +

    + See the next section for this implementation. +

    +
  2. +
  3. +

    + Create a data accessor class which is used to + organize our data. +

    +

    + See SimpleDA.class + for this implementation. +

    +
  4. +
  5. +

    + Create a simple class that is used to put objects + to our entity store. +

    +

    + See Placing Objects in an Entity Store + for this implementation. +

    +
  6. +
  7. +

    + Create another class that retrieves objects from + our entity store. +

    +

    + See Retrieving Objects from an Entity Store + for this implementation. +

    +
  8. +
+
+
+
+
+
+

A Simple Entity Class

+
+
+
+

+ For clarity's sake, this entity class is as simple a class as we can write. + It contains only two data members, both of which are set + and retrieved by simple setter and getter methods. Beyond + that, by design this class does not do anything of particular + interest. +

+

+ Its implementation is as follows: +

+
package persist.gettingStarted;
+
+import com.sleepycat.persist.model.Entity;
+import com.sleepycat.persist.model.PrimaryKey;
+import static com.sleepycat.persist.model.Relationship.*;
+import com.sleepycat.persist.model.SecondaryKey;
+
+@Entity
+public class SimpleEntityClass {
+
+    // Primary key is pKey
+    @PrimaryKey
+    private String pKey;
+
+    // Secondary key is the sKey
+    @SecondaryKey(relate=MANY_TO_ONE)
+    private String sKey;
+
+    public void setPKey(String data) {
+        pKey = data;
+    }
+
+    public void setSKey(String data) {
+        sKey = data;
+    }
+
+    public String getPKey() {
+        return pKey;
+    }
+
+    public String getSKey() {
+        return sKey;
+    }
+} 
+
+
+ + + diff --git a/docs/GettingStartedGuide/persist_first.html b/docs/GettingStartedGuide/persist_first.html new file mode 100644 index 0000000..6d23063 --- /dev/null +++ b/docs/GettingStartedGuide/persist_first.html @@ -0,0 +1,316 @@ + + + + + + Chapter 3. Direct Persistence Layer First Steps + + + + + + + + + +
+
+
+
+

Chapter 3. Direct Persistence Layer First Steps

+
+
+
+
+

+ Table of Contents +

+
+
+ + Entity Stores + +
+
+
+
+ + Opening and Closing Environments and Stores + +
+
+
+
+ + Persistent Objects + +
+
+ + Saving and Retrieving Data + +
+
+
+

+ This chapter guides you through the first few steps required to + use the DPL with your application. These steps include: +

+
+
    +
  1. +

    + Opening your environment as was described in + + Opening Database Environments. + + +

    +
  2. +
  3. +

    + Opening your entity store. +

    +
  4. +
  5. +

    + Identifying the classes that you want to store in + JE as either a persistent + class or an entity. +

    +
  6. +
+
+

+ Once you have done these things, you can write your classes to + the JE databases, read them back from the databases, delete + them from the databases, and so forth. These activities are + described in the chapters that follow in this part of this manual. +

+
+
+
+
+

Entity Stores

+
+
+
+ +

+ Entity stores are the basic unit of storage that you use with the DPL. That is, it + is a unit of encapsulation for the classes that you want to store in JE. Under + the hood it actually interacts with JE databases, but the DPL provides a layer + of abstraction from the underlying JE APIs. The store, therefore, provides a + simplified mechanism by which you read and write your stored classes. By using a + store, you have access to your classes that is more simplified than if you were + interacting with databases directly, but this simplified access comes at the cost of + reduced flexibility. +

+

+ Entity stores have configurations in the same way that environments have + configurations. You can use a StoreConfig object + to identify store properties. Among these are methods that allow you to declare + whether: +

+
+
    +
  • +

    + the store can be created if it does not exist at the time + it is opened. Use the + StoreConfig.setAllowCreate() + method to set this. +

    +
  • +
  • +

    + deferred writes are allowed for the store. Use the + StoreConfig.setDeferredWrite() + method to set this. See + Deferred Write Databases + for general information on deferred write + databases. +

    +
  • +
  • +

    + the store is read-only. Use the + StoreConfig.setReadOnly() + method to set this. +

    +
  • +
  • +

    + the store supports transactions. Use the + StoreConfig.setTransactional() + method to set this. +

    +

    + Writing JE transactional applications is described in the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

    +
  • +
+
+

+ EntityStore objects also provide methods for retrieving + information about the store, such as: +

+
+
    +
  • +

    + the store's name. Use the + EntityStore.getStoreName() + method to retrieve this. +

    +
  • +
  • +

    + a handle to the environment in which the store is opened. Use the + EntityStore.getEnvironment + method to retrieve this handle. +

    +
  • +
+
+

+ You can also use the EntityStore to + retrieve all the primary and secondary indexes related to a given type of entity + object contained in the store. See Working with Indices for + more information. +

+
+
+
+
+

Opening and Closing Environments and Stores

+
+
+
+

+ As described in + + Database Environments, + + + + an + environment is a unit of + encapsulation for JE databases. It also provides a + handle by which activities common across the databases + can be managed. +

+

+ To use an entity store, you must first open an environment and then provide that + environment handle to the EntityStore constructor. +

+

+ For example, the following code fragment configures both + the environment and the entity store such that they can + be created if they do not exist. Both the environment and + the entity store are then opened. +

+
package persist.gettingStarted;
+
+import java.io.File;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import com.sleepycat.persist.EntityStore;
+import com.sleepycat.persist.StoreConfig;
+
+...
+
+private Environment myEnv;
+private EntityStore store;
+
+try {
+    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
+    StoreConfig storeConfig = new StoreConfig();
+
+    myEnvConfig.setAllowCreate(!readOnly);
+    storeConfig.setAllowCreate(!readOnly);
+
+    // Open the environment and entity store
+    myEnv = new Environment(envHome, myEnvConfig);
+    store = new EntityStore(myEnv, "EntityStore", storeConfig);
+} catch(DatabaseException dbe) {
+    System.err.println("Error opening environment and store: " +
+                        dbe.toString());
+    System.exit(-1);
+} 
+

+ As always, before you exit your program you should close both + your store and your environment. It is recommended that you close your store before you close your + environment. +

+
if (store != null) {
+    try {
+        store.close();
+    } catch(DatabaseException dbe) {
+        System.err.println("Error closing store: " +
+                            dbe.toString());
+        System.exit(-1);
+    }
+}
+
+if (myEnv != null) {
+    try {
+        // Finally, close environment.
+        myEnv.close();
+    } catch(DatabaseException dbe) {
+        System.err.println("Error closing MyDbEnv: " +
+                            dbe.toString());
+        System.exit(-1);
+    }
+} 
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/persist_index.html b/docs/GettingStartedGuide/persist_index.html new file mode 100644 index 0000000..414db0f --- /dev/null +++ b/docs/GettingStartedGuide/persist_index.html @@ -0,0 +1,245 @@ + + + + + + Chapter 4. Working with Indices + + + + + + + + + +
+
+
+
+

Chapter 4. Working with Indices

+
+
+
+
+

+ Table of Contents +

+
+
+ + Accessing Indexes + +
+
+
+
+ + Accessing Primary Indices + +
+
+ + Accessing Secondary Indices + +
+
+
+
+ + Creating Indexes + +
+
+
+
+ + Declaring Primary Indexes + +
+
+ + Declaring Secondary Indexes + +
+
+ + Foreign Key Constraints + +
+
+
+
+
+

+ All entity classes stored in JE using the DPL must have a + primary index, or key, identified for them. All such classes may + also have one or more secondary keys declared for them. This + chapter describes primary and secondary indexes in detail, and + shows how to access the indexes created for a given entity class. +

+

+ One way to organize access to your primary and secondary + indexes is to create a data accessor + class. We show an implementation of a data accessor class in + SimpleDA.class. +

+
+
+
+
+

Accessing Indexes

+
+
+
+ +

+ In order to retrieve any object from an entity store, you + must access at least the primary index for that object. + Different entity classes stored in an entity store can have + different primary indexes, but all entity classes must have a + primary index declared for it. The primary index is just + the default index used for the class. (That is, it is the + data's primary key for the underlying database.) +

+

+ Entity classes can optionally have secondary indexes + declared for them. In order to access these secondary + indexes, you must first access the primary index. +

+
+
+
+
+

Accessing Primary Indices

+
+
+
+

+ You retrieve a primary index using the + EntityStore.getPrimaryIndex() + method. To do this, you indicate the index key type + (that is, whether it is a String, Integer, and + so forth) and the class of the entities stored + in the index. +

+

+ For example, the following retrieves the + primary index for an Inventory + class (we provide an implementation of this class in + Inventory.java). + These index keys are of type String. +

+
PrimaryIndex<String,Inventory> inventoryBySku = 
+    store.getPrimaryIndex(String.class, Inventory.class); 
+
+
+
+
+
+

Accessing Secondary Indices

+
+
+
+

+ You retrieve a secondary index using the + EntityStore.getSecondaryIndex() + method. Because secondary indices actually + refer to a primary index somewhere in your data + store, to access a secondary index you: +

+
+
    +
  1. +

    + Provide the primary index as + returned by + EntityStore.getPrimaryIndex(). +

    +
  2. +
  3. +

    + Identify the key data type used by + the secondary index + (String, + Long, + and so forth). +

    +
  4. +
  5. +

    + Identify the name of the + secondary key field. + When you declare the + SecondaryIndex + object, you identify the entity class + to which the secondary index + must refer. +

    +
  6. +
+
+

+ For example, the following first retrieves the + primary index, and then uses that to retrieve a secondary + index. The secondary key is held by the + itemName field of the + Inventory class. +

+
PrimaryIndex<String,Inventory> inventoryBySku = 
+store.getPrimaryIndex(String.class, Inventory.class); 
+
+SecondaryIndex<String,String,Inventory> inventoryByName = 
+    store.getSecondaryIndex(inventoryBySku, String.class, "itemName"); 
+
+
+
+ + + diff --git a/docs/GettingStartedGuide/persistobject.html b/docs/GettingStartedGuide/persistobject.html new file mode 100644 index 0000000..3aecfd8 --- /dev/null +++ b/docs/GettingStartedGuide/persistobject.html @@ -0,0 +1,147 @@ + + + + + + Persistent Objects + + + + + + + + + +
+
+
+
+

Persistent Objects

+
+
+
+

+ When using the DPL, you store data in the underlying + JE databases by making objects + persistent. You do this using Java + annotations that both identify the type of persistent + object you are declaring, as well as the primary and + secondary indices. +

+

+ The following are the annotations you will use with your + DPL persistent classes: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AnnotationDescription
@Entity + Declares an entity class; that is, a class with a primary index + and optionally one or more indices. +
@Persistent + Declares a persistent class; that is, a class used by an entity + class. They do not have indices but instead are are stored or + retrieved when an entity class makes direct use of them. +
@PrimaryKey + Declares a specific data member in an entity class to be the + primary key for that object. This annotation must be used one + and only one time for every entity class. +
@SecondaryKey + Declares a specific data member in an entity class to be a + secondary key for that object. This annotation is optional, and + can be used multiple times for an entity class. +
+
+

+ For example, the following is declared to be an entity class: +

+
package persist.gettingStarted;
+
+import com.sleepycat.persist.model.Entity;
+import com.sleepycat.persist.model.PrimaryKey;
+
+@Entity
+public class ExampleEntity {
+
+    // The primary key must be unique in the database.
+    @PrimaryKey
+    private String aPrimaryKey;
+
+    @SecondaryKey(relate=MANY_TO_ONE)
+    private String aSecondaryKey;
+
+    ...
+
+    // The remainder of the class' implementation is purposefully
+    // omitted in the interest of brevity.
+
+    ...
+} 
+

+ We discuss primary and secondary keys in more detail in Working with Indices. +

+
+ + + diff --git a/docs/GettingStartedGuide/preface.html b/docs/GettingStartedGuide/preface.html new file mode 100644 index 0000000..e571bbb --- /dev/null +++ b/docs/GettingStartedGuide/preface.html @@ -0,0 +1,174 @@ + + + + + + Preface + + + + + + + + + +
+
+
+
+

Preface

+
+
+
+
+

+ Table of Contents +

+
+
+ + Conventions Used in this Book + +
+
+ + For More Information + +
+
+
+
+ + Contact Us + +
+
+
+
+
+

+ Welcome to Berkeley DB Java Edition (JE). + + + This document introduces JE, version 12c Release 2. + + +

+

+ This document is intended to provide a rapid introduction + to the JE API set and related concepts. The goal of this + document is to provide you with an efficient mechanism with which + you can evaluate JE against your project's technical + requirements. As such, this document is intended for + Java + + + developers and senior software architects who are looking for an + + in-process data management solution. + + + No prior experience with Berkeley DB Java Edition is expected or required. +

+
+
+
+
+

Conventions Used in this Book

+
+
+
+

+ The following typographical conventions are used within in this manual: +

+

+ Class names are represented in monospaced font, as are method + names. For example: + + "The Environment.openDatabase() method + returns a Database class object." + + + + + + +

+

+ Variable or non-literal text is presented in italics. For example: "Go to your + JE_HOME + + + directory." +

+

+ Program examples are displayed in a monospaced font on a shaded background. + For example: +

+
import com.sleepycat.je.Environment;
+
+...
+
+// Open the environment. Allow it to be created if it does not 
+// already exist.
+Environment myDbEnv;
+

+ In some situations, programming examples are updated from one chapter to the next. When + this occurs, the new code is presented in monospaced bold font. For example: +

+
import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import java.io.File;
+
+...
+
+// Open the environment. Allow it to be created if it does not 
+// already exist.
+Environment myDbEnv;
+EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+myDbEnv = new Environment(new File("/export/dbEnv"), envConfig); 
+
+

Note

+

+ Finally, notes of interest are represented using a note block such + as this. +

+
+
+
+ + + diff --git a/docs/GettingStartedGuide/readSecondary.html b/docs/GettingStartedGuide/readSecondary.html new file mode 100644 index 0000000..3549787 --- /dev/null +++ b/docs/GettingStartedGuide/readSecondary.html @@ -0,0 +1,125 @@ + + + + + + Reading Secondary Databases + + + + + + + + + +
+
+
+
+

Reading Secondary Databases

+
+
+
+

+ Like a primary database, you can read records from your secondary + database either by using the + + SecondaryDatabase.get() method, + + + or by using + a SecondaryCursor. + + + The main difference between reading secondary and primary databases is that when + you read a secondary database record, the secondary record's data is not + returned to you. Instead, the primary key and data corresponding to the + secondary key are returned to you. +

+

+ For example, assuming your secondary database contains keys related + to a person's full name: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.SecondaryDatabase;
+
+...
+try {
+    // Omitting all database and environment opens
+    ...
+
+    String searchName = "John Doe";
+    DatabaseEntry searchKey = 
+        new DatabaseEntry(searchName.getBytes("UTF-8"));
+    DatabaseEntry primaryKey = new DatabaseEntry();
+    DatabaseEntry primaryData = new DatabaseEntry();
+
+    // Get the primary key and data for the user 'John Doe'.
+    OperationStatus retVal = mySecondaryDatabase.get(null, searchKey, 
+                                                     primaryKey, 
+                                                     primaryData, 
+                                                     LockMode.DEFAULT); 
+} catch (Exception e) {
+    // Exception handling goes here
+}
+

+ Note that, just like + Database.get(), + + + if your secondary database supports duplicate records then + SecondaryDatabase.get() + + only return the first record found in a matching duplicates set. If you + want to see all the records related to a specific secondary key, then use a + + SecondaryCursor (described in + Using Secondary Cursors + + ). + + +

+
+ + + diff --git a/docs/GettingStartedGuide/restore.html b/docs/GettingStartedGuide/restore.html new file mode 100644 index 0000000..29f9156 --- /dev/null +++ b/docs/GettingStartedGuide/restore.html @@ -0,0 +1,103 @@ + + + + + + JE Backup and Restore + + + + + + + + + +
+
+
+
+

JE Backup and Restore

+
+
+
+

+ To backup your database, copy the log files (the + .jdb files) starting from the lowest + numbered log file to the highest numbered log file to your + backup media. Be sure to copy the bytes of the individual + database files in order from the lowest to the highest. You do + not have to close your database or otherwise cease database + operations when you do this. +

+
+

Note

+

+ Note that if you are using subdirectories to store your log + files, then you should copy those subdirectories and their + contents instead of simply copying individual files. + Multiple subdirectories can be used to improve JE + throughput, but this feature is not turned on by default. + See Multiple Environment Subdirectories + for information on how to configure this feature. +

+
+

+ Restoring a JE database from a backup consists of closing your + JE environment, copying archived log files back into your + environment directory and then opening your JE environment + again. If you are using subdirectories to store your log files, + then make sure to copy those subdirectories back into the + environment home directory, and make sure the same log files are in + each subdirectory as was there when you took the backup. +

+

+ Note that whenever a JE environment is opened, JE runs + normal recovery. This involves bringing your + database into a consistent state given the changed data found in the + database. If you are using transactions during normal operations, then + JE automatically runs checkpoints for you so as to limit the time + required to run this recovery. In any case, running normal recovery is a + routine operation, while performing database restores is not. +

+

+ For more information on JE backup and restores, and on checkpoints, see + Backing up and Restoring Berkeley DB Java Edition Applications. +

+
+ + + diff --git a/docs/GettingStartedGuide/saveret.html b/docs/GettingStartedGuide/saveret.html new file mode 100644 index 0000000..4f385db --- /dev/null +++ b/docs/GettingStartedGuide/saveret.html @@ -0,0 +1,123 @@ + + + + + + Saving and Retrieving Data + + + + + + + + + +
+
+
+
+

Saving and Retrieving Data

+
+
+
+

+ All data stored using the DPL has one primary index and + zero or more secondary indices associated with it. + (Sometimes these are referred to as the primary and + secondary keys.) So to store data under the DPL, you must: +

+
+
    +
  1. +

    + Declare a class to be an entity class. +

    +
  2. +
  3. +

    + Identify the features on the class which + represent indexed material. +

    +
  4. +
  5. +

    + Retrieve the store's primary index for a + given class using the + EntityStore.getPrimaryIndex() + method. +

    +
  6. +
  7. +

    + Put class objects to the store using the + PrimaryIndex.put() + method. +

    +
  8. +
+
+

+ In order to retrieve an object from the store, you use + the index that is most convenient for your purpose. This + may be the primary index, or it may be some other + secondary index that you declared on your entity class. +

+

+ You obtain a primary index in the same was as when you + put the object to the store: using + EntityStore.getPrimaryIndex(). + You can get a secondary index for the store using the + EntityStore.getSecondaryIndex() + method. Note that + getSecondaryIndex() requires you + to provide a PrimaryIndex class + instance when you call it, so a class's primary index is + always required when retrieving objects from an entity + store. +

+

+ Usually all of the activity surrounding saving and + retrieving data is organized within a class or classes + specialized to that purpose. We describe the construction + of these data accessor classes in SimpleDA.class. But before you perform + any entity store activity, you need to understand + indexes. We therefore describe them in the next chapter. +

+
+ + + diff --git a/docs/GettingStartedGuide/secondaryCursor.html b/docs/GettingStartedGuide/secondaryCursor.html new file mode 100644 index 0000000..0982ec8 --- /dev/null +++ b/docs/GettingStartedGuide/secondaryCursor.html @@ -0,0 +1,155 @@ + + + + + + Using Secondary Cursors + + + + + + + + + +
+
+
+
+

+ Using Secondary Cursors + +

+
+
+
+

+ Just like cursors on a primary database, you can use + secondary cursors + + to iterate over the records in a secondary database. Like + + normal cursors, + + + you can also use + secondary cursors + + to search for specific records in a database, to seek to the first + or last record in the database, to get the next duplicate record, + to get the next non-duplicate record, + and so forth. For a complete description on cursors and their capabilities, see + Using Cursors. +

+

+ However, when you use + secondary cursors: + +

+
+
    +
  • +

    + Any data returned is the data contained on the primary database + record referenced by the secondary record. +

    +
  • +
  • +

    + SecondaryCursor.getSearchBoth() and + related methods do not search based on a key/data pair. Instead, you + search based on a secondary key and a primary key. The data returned + is the primary data that most closely matches the two keys provided + for the search. +

    +
  • +
+
+

+ For example, suppose you are using the databases, classes, and key + creators + + described in Implementing Key + Creators + + . + Then the following searches for a person's + name in the secondary database, and deletes all secondary and primary + records that use that name. +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.SecondaryDatabase;
+import com.sleepycat.je.SecondaryCursor;
+  
+...
+try {
+    // Database and environment opens omitted for brevity
+    ...
+
+    String secondaryName = "John Doe";
+    DatabaseEntry secondaryKey = 
+        new DatabaseEntry(secondaryName.getBytes("UTF-8"));
+
+    DatabaseEntry foundData = new DatabaseEntry();
+
+    SecondaryCursor mySecCursor = 
+        mySecondaryDatabase.openSecondaryCursor(null, null);
+
+    OperationStatus retVal = mySecCursor.getSearchKey(secondaryKey, 
+                                                      foundData, 
+                                                      LockMode.DEFAULT);
+    while (retVal == OperationStatus.SUCCESS) {
+        mySecCursor.delete();
+        retVal = mySecCursor.getNextDup(secondaryKey, 
+                                        foundData, 
+                                        LockMode.DEFAULT);
+    } 
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+ + + diff --git a/docs/GettingStartedGuide/secondaryDelete.html b/docs/GettingStartedGuide/secondaryDelete.html new file mode 100644 index 0000000..5861dc9 --- /dev/null +++ b/docs/GettingStartedGuide/secondaryDelete.html @@ -0,0 +1,128 @@ + + + + + + Deleting Secondary Database Records + + + + + + + + + +
+
+
+
+

Deleting Secondary Database Records

+
+
+
+

+ In general, you + can + + not modify a secondary database directly. In + order to modify a secondary database, you should modify the primary + database and simply allow JE to manage the secondary modifications for you. +

+

+ However, as a convenience, you can delete + SecondaryDatabase + + records directly. Doing so causes the associated primary key/data pair to be deleted. + This in turn causes JE to delete all + SecondaryDatabase + + records that reference the primary record. +

+

+ You can use the + SecondaryDatabase.delete() + + + method to delete a secondary database record. Note that if your + + SecondaryDatabase + contains duplicate records, then deleting a record from the set of + duplicates causes all of the duplicates to be deleted as well. + +

+
+

Note

+

+ SecondaryDatabase.delete() causes the + previously described delete operations to occur + + + only if the primary database is opened for write access. +

+
+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.SecondaryDatabase;
+
+...
+try {
+    // Omitting all database and environment opens
+    ...
+
+    String searchName = "John Doe";
+    DatabaseEntry searchKey = 
+        new DatabaseEntry(searchName.getBytes("UTF-8"));
+
+    // Delete the first secondary record that uses "John Doe" as
+    // a key. This causes the primary record referenced by this secondary
+    // record to be deleted.
+    OperationStatus retVal = mySecondaryDatabase.delete(null, searchKey);
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+ + + diff --git a/docs/GettingStartedGuide/secondaryProps.html b/docs/GettingStartedGuide/secondaryProps.html new file mode 100644 index 0000000..4e66f87 --- /dev/null +++ b/docs/GettingStartedGuide/secondaryProps.html @@ -0,0 +1,94 @@ + + + + + + Secondary Database Properties + + + + + + + + + +
+
+
+
+

Secondary Database Properties

+
+
+
+

Secondary databases accept SecondaryConfig + objects. SecondaryConfig is a subclass of DatabaseConfig, + so it can manage all of the same properties as does DatabaseConfig. + See Database Properties for more information.

+

In addition to the DatabaseConfig properties, + SecondaryConfig also allows you to manage the following properties: +

+
+
    +
  • +

    + SecondaryConfig.setAllowPopulate() +

    +

    If true, the secondary database can be auto-populated. This means + that on open, if the secondary database is empty then the primary + database is read in its entirety and additions/modifications to the + secondary's records occur automatically.

    +
  • +
  • +

    + SecondaryConfig.setKeyCreator() +

    +

    Identifies the key creator object to be used for secondary key + creation. See Implementing Key + Creators + + + for more information.

    +
  • +
+
+
+ + + diff --git a/docs/GettingStartedGuide/simpleda.html b/docs/GettingStartedGuide/simpleda.html new file mode 100644 index 0000000..2526697 --- /dev/null +++ b/docs/GettingStartedGuide/simpleda.html @@ -0,0 +1,104 @@ + + + + + + SimpleDA.class + + + + + + + + + +
+
+
+
+

SimpleDA.class

+
+
+
+

+ As mentioned above, we organize our primary and + secondary indexes using a specialize data + accessor class. The main reason for this class + to exist is to provide convenient access to all + the indexes in use for our entity class (see + the previous section, A Simple Entity Class, for that + implementation). +

+

+ For a description on retrieving primary and + secondary indexes under the DPL, see + Working with Indices +

+
package persist.gettingStarted;
+
+import java.io.File;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.persist.EntityStore;
+import com.sleepycat.persist.PrimaryIndex;
+import com.sleepycat.persist.SecondaryIndex;
+
+public class SimpleDA {
+    // Open the indices
+    public SimpleDA(EntityStore store)
+        throws DatabaseException {
+
+        // Primary key for SimpleEntityClass classes
+        pIdx = store.getPrimaryIndex(
+            String.class, SimpleEntityClass.class);
+
+        // Secondary key for SimpleEntityClass classes
+        // Last field in the getSecondaryIndex() method must be
+        // the name of a class member; in this case, an 
+        // SimpleEntityClass.class data member.
+        sIdx = store.getSecondaryIndex(
+            pIdx, String.class, "sKey");
+    }
+
+    // Index Accessors
+    PrimaryIndex<String,SimpleEntityClass> pIdx;
+    SecondaryIndex<String,String,SimpleEntityClass> sIdx;
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/simpleget.html b/docs/GettingStartedGuide/simpleget.html new file mode 100644 index 0000000..d4abdbb --- /dev/null +++ b/docs/GettingStartedGuide/simpleget.html @@ -0,0 +1,170 @@ + + + + + + Retrieving Objects from an Entity Store + + + + + + + + + +
+
+
+
+

Retrieving Objects from an Entity Store

+
+
+
+

+ You retrieve objects placed in an entity store by using + either the object's primary index, or the appropriate + secondary index if it exists. The following application + illustrates this by retrieving some of the objects that + we placed in an entity store in the previous section. +

+

+ To begin, we import the Java classes that our example + needs. We also instantiate the private data members that we + require. +

+
package persist.gettingStarted;
+
+import java.io.File;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import com.sleepycat.persist.EntityStore;
+import com.sleepycat.persist.StoreConfig;
+
+public class SimpleStoreGet {
+
+    private static File envHome = new File("./JEDB");
+
+    private Environment envmnt;
+    private EntityStore store;
+    private SimpleDA sda; 
+

+ Next we create a method that simply opens our database + environment and entity store for us. +

+
   // The setup() method opens the environment and store
+    // for us.
+    public void setup()
+        throws DatabaseException {
+
+        EnvironmentConfig envConfig = new EnvironmentConfig();
+        StoreConfig storeConfig = new StoreConfig();
+
+        envConfig.setAllowCreate(true);
+        storeConfig.setAllowCreate(true);
+
+        // Open the environment and entity store
+        envmnt = new Environment(envHome, envConfig);
+        store = new EntityStore(envmnt, "EntityStore", storeConfig);
+    } 
+

+ We also need a method to close our environment and store. +

+
    // Close our environment and store.
+    public void shutdown()
+        throws DatabaseException {
+
+        store.close();
+        envmnt.close();
+    } 
+

+ Now we retrieve a few objects. To do this, we instantiate a + SimpleDA (see SimpleDA.class) class that we use to access + our primary and secondary indexes. Then we retrieve objects + based on a primary or secondary index value. And finally, we + display the retrieved objects. +

+
    // Retrieve some SimpleEntityClass objects from the store.
+    private void run()
+        throws DatabaseException {
+
+        setup();
+
+        // Open the data accessor. This is used to store
+        // persistent objects.
+        sda = new SimpleDA(store);
+
+        // Instantiate and store some entity classes
+        SimpleEntityClass sec1 = sda.pIdx.get("keyone");
+        SimpleEntityClass sec2 = sda.pIdx.get("keytwo");
+
+        SimpleEntityClass sec4 = sda.sIdx.get("skeythree");
+
+        System.out.println("sec1: " + sec1.getPKey());
+        System.out.println("sec2: " + sec2.getPKey());
+        System.out.println("sec4: " + sec4.getPKey());
+
+
+        shutdown();
+    } 
+

+ Finally, to complete our class, we need a + main() method, which simply calls our + run() method. +

+
    // main
+    public static void main(String args[]) {
+        SimpleStoreGet ssg = new SimpleStoreGet();
+        try {
+            ssg.run();
+        } catch (DatabaseException dbe) {
+            System.err.println("SimpleStoreGet: " + dbe.toString());
+            dbe.printStackTrace();
+        } catch (Exception e) {
+            System.out.println("Exception: " + e.toString());
+            e.printStackTrace();
+        }
+        System.out.println("All done.");
+    }
+
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/simpleput.html b/docs/GettingStartedGuide/simpleput.html new file mode 100644 index 0000000..9c88143 --- /dev/null +++ b/docs/GettingStartedGuide/simpleput.html @@ -0,0 +1,229 @@ + + + + + + Placing Objects in an Entity Store + + + + + + + + + +
+
+
+
+

Placing Objects in an Entity Store

+
+
+
+

+ In order to place an object in a DPL entity store, + you must: +

+
+
    +
  1. +

    + Open the environment and store. +

    +
  2. +
  3. +

    + Instantiate the object. +

    +
  4. +
  5. +

    + Put the object to the store using the + put() method + for the object's primary index. +

    +
    +

    Note

    +

    + A version of this method exists which allows you to + specify a Time to Live value for the record that you are + inserting. See Using Time to Live + for more information. +

    +
    +
  6. +
+
+

+ The following example uses the SimpleDA + class that we show in SimpleDA.class to put a + SimpleEntityClass object (see + A Simple Entity Class) to the + entity store. +

+

+ To begin, we import the Java classes that our example + needs. We also instantiate the private data members that we + require. +

+
package persist.gettingStarted;
+
+import java.io.File;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+
+import com.sleepycat.persist.EntityStore;
+import com.sleepycat.persist.StoreConfig; 
+
+public class SimpleStorePut {
+
+    private static File envHome = new File("./JEDB");
+
+    private Environment envmnt;
+    private EntityStore store;
+    private SimpleDA sda; 
+

+ Next we create a method that simply opens our database + environment and entity store for us. +

+
   // The setup() method opens the environment and store
+    // for us.
+    public void setup()
+        throws DatabaseException {
+
+        EnvironmentConfig envConfig = new EnvironmentConfig();
+        StoreConfig storeConfig = new StoreConfig();
+
+        envConfig.setAllowCreate(true);
+        storeConfig.setAllowCreate(true);
+
+        // Open the environment and entity store
+        envmnt = new Environment(envHome, envConfig);
+        store = new EntityStore(envmnt, "EntityStore", storeConfig);
+    } 
+

+ We also need a method to close our environment and store. +

+
    // Close our environment and store.
+    public void shutdown()
+        throws DatabaseException {
+
+        store.close();
+        envmnt.close();
+    } 
+

+ Now we need to create a method to actually write objects to our + store. This method creates a SimpleDA + object (see SimpleDA.class) that we + will use to access our indexes. Then we instantiate a series + of SimpleEntityClass (see A Simple Entity Class) + objects that we + will place in our store. Finally, we use our primary index + (obtained from the SimpleDA class + instance) to actually place these objects in our store. +

+

+ In Retrieving Objects from an Entity Store + we show a class that is used to retrieve these objects. +

+
    // Populate the entity store
+    private void run()
+        throws DatabaseException {
+
+        setup();
+
+        // Open the data accessor. This is used to store
+        // persistent objects.
+        sda = new SimpleDA(store);
+
+        // Instantiate and store some entity classes
+        SimpleEntityClass sec1 = new SimpleEntityClass();
+        SimpleEntityClass sec2 = new SimpleEntityClass();
+        SimpleEntityClass sec3 = new SimpleEntityClass();
+        SimpleEntityClass sec4 = new SimpleEntityClass();
+        SimpleEntityClass sec5 = new SimpleEntityClass();
+
+        sec1.setPKey("keyone");
+        sec1.setSKey("skeyone");
+
+        sec2.setPKey("keytwo");
+        sec2.setSKey("skeyone");
+
+        sec3.setPKey("keythree");
+        sec3.setSKey("skeytwo");
+
+        sec4.setPKey("keyfour");
+        sec4.setSKey("skeythree");
+
+        sec5.setPKey("keyfive");
+        sec5.setSKey("skeyfour");
+
+        sda.pIdx.put(sec1);
+        sda.pIdx.put(sec2);
+        sda.pIdx.put(sec3);
+        sda.pIdx.put(sec4);
+        sda.pIdx.put(sec5);
+
+        shutdown();
+    } 
+

+ Finally, to complete our class, we need a + main() method, which simply calls our + run() method. +

+
    // main
+    public static void main(String args[]) {
+        SimpleStorePut ssp = new SimpleStorePut();
+        try {
+            ssp.run();
+        } catch (DatabaseException dbe) {
+            System.err.println("SimpleStorePut: " + dbe.toString());
+            dbe.printStackTrace();
+        } catch (Exception e) {
+            System.out.println("Exception: " + e.toString());
+            e.printStackTrace();
+        }
+        System.out.println("All done.");
+    }
+
+} 
+
+ + + diff --git a/docs/GettingStartedGuide/timetolive.html b/docs/GettingStartedGuide/timetolive.html new file mode 100644 index 0000000..1fd0464 --- /dev/null +++ b/docs/GettingStartedGuide/timetolive.html @@ -0,0 +1,318 @@ + + + + + + Using Time to Live + + + + + + + + + +
+
+
+
+

Using Time to Live

+
+
+
+ + +

+ Time to Live (TTL) is a mechanism that allows you to automatically + expire + + database records. + TTL is expressed as the amount of time data is allowed to live in + the + + database. + Data which has reached its expiration timeout value can no longer + be retrieved, and will not appear in any + + database + statistics. Whether the data is physically removed from the + + database + is determined by an internal mechanism that is not + user-controllable. +

+

+ TTL represents a minimum guaranteed time to live. Data expires on + hour or day boundaries. This means that with a one hour TTL, there + can be as much as two hours worth of unexpired data. For example + (using a time format of hour:minute:second), given a one hour TTL, + data written between 00:00:00.000 and 00:59:59.999 will expire at + 02:00:00.000 because the data is guaranteed to expire no less than + one hour from when it is written. +

+

+ Expired data is invisible to queries and + + database + statistics, but even so it is using disk space until it has been + purged. The expired data is purged from disk at some point in + time after its expiration date. The exact time when the data is + purged is driven by internal mechanisms and the workload on your + + database. +

+

+ The TTL value for a + + database record + can be updated at any time before the expiration value has been + reached. Data that has expired can no longer be modified, and this + includes its TTL value. +

+

+ TTL is more efficient than manual user-deletion of the + + record + because it avoids the overhead of writing a database log entry for + the data deletion. The deletion also does not appear in the + replication stream. +

+

+ The following provides a brief introduction to using Time to Live. + For a more complete description of this mechanism, see the + + com.sleepycat.je.WriteOptions javadoc. + +

+
+
+
+
+
+

Specifying a TTL Value

+
+
+
+

+ TTL values are specified on a record by record basis using + the WriteOptions class, which can + but used by various put() methods + when writing to the database. For example, variations of + Database.put(), + PrimaryIndex.put(), and + Cursor.put() exist that accept a + WriteOptions class instance. +

+

+ WriteOptions allows + you to identify the number of days or hours the record will exist + in the database before expiring. A duration interval specified in + days is recommended because this results in the least amount of + storage consumed in the store. However, if you want a TTL value + that is not an even multiple of days, then specify the TTL + value in hours. +

+

+ The code example from + Writing Records to the Database + can be extended to specify a TTL value of 5 days like this: +

+
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Put;
+import com.sleepycat.je.WriteOptions;
+
+
+...
+
+// Environment and database opens omitted for clarity.
+// Environment and database must NOT be opened read-only.
+
+String aKey = "myFirstKey";
+String aData = "myFirstData";
+
+try {
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
+
+    WriteOptions wo = new WriteOptions();
+    // This sets the TTL using day units. Another variation
+    // of setTTL() exists that accepts a TimeUnit class instance.
+    wo.setTTL(5);
+    myDatabase.put(null,             // Transaction handle.
+                   theKey,           // Record's key.
+                   theData,          // Record's data.
+                   Put.NO_OVERWRITE, // If the record exists,
+                                     // do not overwrite it.
+                   wo);              // WriteOptions instance.
+
+} catch (Exception e) {
+    // Exception handling goes here
+} 
+
+
+
+
+
+

Updating a TTL Value

+
+
+
+

+ To update the expiration time for a record, you update the + record as normal, and at the same time specify the new expiration + time. However, you must also indicate that the expiration time + is to be updated. By default, you can modify the record and + the expiration time will not be modified, even if you specify a + new TTL value for the record. +

+

+ To indicate that the the expiration time is to be updated, + specify true to the + WriteOptions.setUpdateTTL() + method. For example, using the previous example, to change + the TTL value to 10 days, do the following: +

+
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Put;
+import com.sleepycat.je.WriteOptions;
+
+
+...
+
+// Environment and database opens omitted for clarity.
+// Environment and database must NOT be opened read-only.
+
+String aKey = "myFirstKey";
+String aData = "myFirstData";
+
+try {
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
+
+    WriteOptions wo = new WriteOptions();
+    // This sets the TTL using day units. Another variation
+    // of setTTL() exists that accepts a TimeUnit class instance.
+    wo.setTTL(5);
+    // If the record currently exists, update the TTL value
+    wo.setUpdateTTL(true);
+    myDatabase.put(null,             // Transaction handle.
+                   theKey,           // Record's key.
+                   theData,          // Record's data.
+                   Put.OVERWRITE,    // If the record exists,
+                                     // overwrite it.
+                   wo);              // WriteOptions instance.
+
+} catch (Exception e) {
+    // Exception handling goes here
+} 
+
+
+
+
+
+

Deleting TTL Expiration

+
+
+
+

+ If you have set a TTL value for a record and you later decide you + do not want it to ever automatically expire, you can turn off + TTL by setting a TTL value of 0: +

+
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Put;
+import com.sleepycat.je.WriteOptions;
+
+
+...
+
+// Environment and database opens omitted for clarity.
+// Environment and database must NOT be opened read-only.
+
+String aKey = "myFirstKey";
+String aData = "myFirstData";
+
+try {
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
+
+    WriteOptions wo = new WriteOptions();
+    // Turn off automatic expiration of this record.
+    wo.setTTL(0);
+    wo.setUpdateTTL(true);
+    myDatabase.put(null,             // Transaction handle.
+                   theKey,           // Record's key.
+                   theData,          // Record's data.
+                   Put.OVERWRITE,    // If the record exists,
+                                     // overwrite it.
+                   wo);              // WriteOptions instance.
+
+} catch (Exception e) {
+    // Exception handling goes here
+} 
+
+
+ + + diff --git a/docs/GettingStartedGuide/usingDbt.html b/docs/GettingStartedGuide/usingDbt.html new file mode 100644 index 0000000..5dfcb64 --- /dev/null +++ b/docs/GettingStartedGuide/usingDbt.html @@ -0,0 +1,424 @@ + + + + + + Reading and Writing Database Records + + + + + + + + + +
+
+
+
+

Reading and Writing Database Records

+
+
+
+ +

+ When reading and writing database records, be aware that there are some + slight differences in behavior depending on whether your database supports duplicate + records. Two or more database records are considered to be duplicates of + one another if they share the same key. The collection of records + sharing the same key are called a duplicates set. + + +

+

+ By default, JE databases do + not support duplicate records. Where duplicate records are supported, + cursors (see below) are used + to access all of the records in the duplicates set. +

+

+ JE provides two basic mechanisms for the storage and retrieval of database + key/data pairs: +

+
+
    +
  • +

    + The + Database.put() + + + and + Database.get() + + + methods provide the easiest access for all non-duplicate records in the database. + These methods are described in this section. +

    +
  • +
  • +

    Cursors provide several methods for putting and getting database + records. Cursors and their database access methods are described in + Using Cursors.

    +
  • +
+
+
+
+
+
+

Writing Records to the Database

+
+
+
+

+ Database records are stored in the internal BTree based on + whatever sorting routine is available to the database. Records are + sorted first by their key. If the database supports duplicate records, + then the records for a specific key are sorted by their data. +

+

+ By default, JE sorts both keys and the data portion of duplicate + records using unsigned byte-by-byte + lexicographic comparisons. This default comparison works well for the + majority of cases. However, in some case performance benefits can be + realized by overriding the default comparison routine. See Using Comparators for more information. +

+

You can use the following methods to put database records:

+
+
    +
  • +

    + Database.put() +

    +

    + Puts a database record into the database. If your database does not + support duplicate records, and if the provided key already exists in + the database, then the currently existing record is replaced with + the new data. +

    +

    + Be aware that version of this method exists which accepts a + Put enum. If Put.OVERWRITE + is provided, then existing database records are + overwritten. If Put.NO_OVERWRITE is + provided, then existing records will not be overwritten. +

    +
  • +
  • +

    + Database.putNoOverwrite() +

    +

    + Disallows overwriting (replacing) an existing record in the + database. If the provided key already exists in the database, + then this method returns + OperationStatus.KEYEXIST even if + the database supports duplicates. +

    + + + +
  • +
  • +

    + Database.putNoDupData() +

    +

    + Puts a database record into the database. If the provided key + and data already exists in the database (that is, if you are + attempting to put a record that compares equally to an existing + record), then this returns + OperationStatus.KEYEXIST. +

    +
  • +
+
+

+ When you put database records, you provide both the key and the data as + DatabaseEntry objects. This means you must + convert your key and data into a Java byte array. For + example: +

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+
+...
+
+// Environment and database opens omitted for clarity.
+// Environment and database must NOT be opened read-only.
+
+String aKey = "myFirstKey";
+String aData = "myFirstData";
+
+try {
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
+    myDatabase.put(null, theKey, theData);
+} catch (Exception e) {
+    // Exception handling goes here
+} 
+
+
+
+
+
+

Getting Records from the Database

+
+
+
+

+ The Database class provides several + methods that you can use to retrieve database records. Note that if your + database supports duplicate records, then these methods will only ever + return the first record in a duplicate set. For this reason, if your + database supports duplicates, you should use a cursor to retrieve + records from it. Cursors are described in Using Cursors. +

+

+ You can use either of the following methods to retrieve records from the database: +

+
+
    +
  • +

    + Database.get() +

    +

    Retrieves the record whose key matches the key provided to the + method. If no records exists that uses the provided key, then + OperationStatus.NOTFOUND is returned.

    + + + +
  • +
  • +

    + Database.getSearchBoth() +

    +

    Retrieve the record whose key matches both the key and the data + provided to the method. If no record exists that uses the provided + key and data, then OperationStatus.NOTFOUND is + returned.

    +
  • +
+
+

Both the key and data for a database record are returned as + byte arrays in DatabaseEntry objects. These objects are + passed as parameter values to the Database.get() method. +

+

In order to retrieve your data once Database.get() + has completed, you must retrieve the byte array stored + in the DatabaseEntry and then convert that + byte array back to the + appropriate datatype. For example:

+ +
package je.gettingStarted;
+      
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+
+...
+
+// Environment and database opens omitted for clarity.
+// Environment and database may be opened read-only.  
+  
+String aKey = "myFirstKey";
+
+try {
+    // Create a pair of DatabaseEntry objects. theKey
+    // is used to perform the search. theData is used
+    // to store the data returned by the get() operation.
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    DatabaseEntry theData = new DatabaseEntry();
+    
+    // Perform the get.
+    if (myDatabase.get(null, theKey, theData, LockMode.DEFAULT) ==
+        OperationStatus.SUCCESS) {
+
+        // Recreate the data String.
+        byte[] retData = theData.getData();
+        String foundData = new String(retData, "UTF-8");
+        System.out.println("For key: '" + aKey + "' found data: '" + 
+                            foundData + "'.");
+    } else {
+        System.out.println("No record found for key '" + aKey + "'.");
+    } 
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+
+
+
+
+

Deleting Records

+
+
+
+

+ + You can use the + Database.delete() + + + method to delete a record from the database. If your database supports + duplicate records, then all records associated with the provided key are + deleted. To delete just one record from a list of duplicates, use a + cursor. Cursors are described in Using Cursors. + +

+

+ You can also delete every record in the database by using + Environment.truncateDatabase(). + + +

+

For example:

+ +
package je.gettingStarted;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+
+...
+
+// Environment and database opens omitted for clarity.
+// Environment and database can NOT be opened read-only.  
+  
+try {
+    String aKey = "myFirstKey";
+    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
+    
+    // Perform the deletion. All records that use this key are
+    // deleted.
+    myDatabase.delete(null, theKey); 
+} catch (Exception e) {
+    // Exception handling goes here
+}
+
+
+
+
+
+

Data Persistence

+
+
+
+

+ When you perform a database modification, your modification is made + in the in-memory cache. This means that your data modifications + are not necessarily flushed to disk, and so your data may not appear + in the database after an application restart. +

+

+ Therefore, if you care if your data is durable across system + failures, and to guard against the rare possibility of + database corruption, you should use transactions to protect your + database modifications. Every time you commit a transaction, JE + ensures that the data will not be lost due to application or + system failure. Transaction usage is described in the + + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. + + + + + +

+

+ If you do not want to use transactions, then the assumption is that + your data is of a nature that it need not exist the next time your + application starts. You may want this if, for example, you are using + JE to cache data relevant only to the current application + runtime. +

+

+ If, however, you are not using transactions for some reason and you + still want some guarantee that your database modifications are + persistent, then you should periodically + run environment syncs. + + + Syncs cause any dirty entries in the in-memory cache and the + operating system's file cache to be written to disk. As + such, they are quite expensive and you should use them sparingly. +

+

+ Note that by default, a sync is run every time you close an environment. + You can also run a sync by calling the Environment.sync() + method. + + + +

+

+ For a brief description of how JE manages its data in the cache + and in the log files, and how sync works, see Databases and Log Files. +

+
+
+ + + diff --git a/docs/LICENSE.txt b/docs/LICENSE.txt new file mode 100644 index 0000000..a4e050c --- /dev/null +++ b/docs/LICENSE.txt @@ -0,0 +1,76 @@ +Copyright (C) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License") reproduced below or available at: + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +1. You must give any other recipients of the Work or Derivative Works a copy of this License; and +2. You must cause any modified files to carry prominent notices stating that You changed the files; and +3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS + + +ADDITIONAL THIRD PARTY NOTICES: + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +/*** + * ASM: a very small and fast Java bytecode manipulation framework + * Copyright (c) 2000-2005 INRIA, France Telecom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/docs/ReplicationGuide/BerkeleyDB-JE-Replication.pdf b/docs/ReplicationGuide/BerkeleyDB-JE-Replication.pdf new file mode 100644 index 0000000000000000000000000000000000000000..96654fa5c03790558b91296ae74b69392eb2e024 GIT binary patch literal 538789 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

7*#mnop=*Fbd8- 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 z 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%0A=S(vkcf(G69FtlxYF-WS-eO(9uo7IS+nx^v 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�kRs*^D_9e^Q#WcQ^G35gZvQo)w(v~;@ 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 literal 0 HcmV?d00001 diff --git a/docs/ReplicationGuide/addremovenodes.html b/docs/ReplicationGuide/addremovenodes.html new file mode 100644 index 0000000..d4b4a4f --- /dev/null +++ b/docs/ReplicationGuide/addremovenodes.html @@ -0,0 +1,147 @@ + + + + + + Adding and Removing Nodes + + + + + + + + +

+
+
+
+
+

Adding and Removing Nodes

+
+
+
+

+ As described in Adding and Removing Nodes from the Group, + a node is added to the replication group simply by starting it up + and allowing it to perform its start-up handshake with the + Master. Once an electable node has been added to the replication + group, it belongs to the replication group forever, or until you + explicitly remove it. Also, the node is uniquely identified within + the replication group by a name that you must give it when you start + up the process. +

+

+ This is worth remembering, because if you have electable nodes that + have been added to the replication group, but which you then + shutdown for a long period of time, your replication group might not + be able to perform a lot of tasks, such as: +

+
+
    +
  1. +

    + Elect a Master. +

    +
  2. +
  3. +

    + Add a new node to the replicated group. +

    +
  4. +
  5. +

    + Delete a node from the replication group. +

    +
  6. +
  7. +

    + Successfully commit a transaction (this depends on the + durability guarantees in place for your application). +

    +
  8. +
+
+

+ All of these actions might be adversely affected by a series of + unavailable electable nodes because in order to do these things the + Master must be in contact with a majority of the electable nodes + belonging to the replication group (Monitor and Secondary nodes do + not count). So if too many electable nodes are either shutdown or + unavailable due to a network partition event, then these functions + can become delayed or even completely unavailable. +

+

+ For this reason, if you have electable nodes that you want to + shutdown for a long time, then you should remove those nodes from + the replication group. JE provides a utility class that allows + for node removal, so your application developer should have provided + you with a tool of some kind that allows you to do this as a normal + administrative function. +

+

+ When removing an electable node from the replication group, remember + that: +

+
+
    +
  • +

    + for best results, shut down the node first. +

    +
  • +
  • +

    + a majority of the nodes must currently be in contact with + the Master in order to acknowledge the node removal. +

    +
  • +
+
+

+ If at some later time you want to restart the node and have it + join the replication group, you can do this using the normal + procedure that your application uses when starting a node for + the first time. Be aware, however, that you cannot reuse the + unique name that the node was using when you removed it from + the group as an electable node. Instead, give the node a + completely new unique name before having it rejoin the + replication group. +

+
+ + + diff --git a/docs/ReplicationGuide/administration.html b/docs/ReplicationGuide/administration.html new file mode 100644 index 0000000..6fefbda --- /dev/null +++ b/docs/ReplicationGuide/administration.html @@ -0,0 +1,229 @@ + + + + + + Chapter 7. Administration + + + + + + + + + +
+
+
+
+

Chapter 7. Administration

+
+
+
+ +

+ This chapter describes issues pertaining to running a JE + replication application. The topics discussed here have to do with + hardware configuration, backups, node configuration, and other + management issues that exist once the application has been + placed into production. +

+
+
+
+
+

Hardware

+
+
+
+

+ A JE replicated application should run well on typical + commodity multi-core hardware, although greater hardware + requirements than this may be driven by the architecture of your + particular application. Check with the software developers who + wrote your JE replicated application for any additional + requirements they may have over and above typical + multi-core hardware. +

+

+ That said, keep the following in mind when putting a JE + replication application into production: +

+
+
    +
  • +

    + Examine the hardware you intend to use, and review it for + common points of failure between nodes in the replication + groups, such as shared power supplies, routers and so + forth. +

    +
  • +
  • +

    + The hardware that you use does not have to be identical + across the entire production hardware. However, it is + important to ensure that the least capable electable node + has the resources to function as the Master. +

    +

    + The Master is typically the node where demand for machine + resources is the greatest. It needs to supply the + replication streams for each active Replica, in addition + to servicing the transaction load. +

    +

    + Note that JE requires Monitor nodes to have minimal + resource consumption (although, again, your application + developers may have written your Monitor nodes such that + they need resources over and above what JE requires), + because Monitor nodes only listen for changes in the + replication group. +

    +
  • +
  • +

    + Finally, your network is a critical part of your hardware + requirements. It is critical that your network be capable + of delivering adequate throughput under peak expected + production work loads. +

    +

    + Remember that your replicated application can consume + quite a lot of network resources when a Replica starts up + for the first time, or starts up after being shutdown for + a long time. This is because the Replica must obtain all + the data that it needs to operate. Essentially, this is a + duplicate of the data contained by the Master node. So + however much data the Master node holds, that much data + will be transmitted across your network per + node every time you start a new node. +

    +

    + For restarting nodes, the amount of data that will cross + your network is equal to the delta between the time the + Replica last shutdown and the state of your Master node + at the time that the Replica is starting up again. If the + Replica has been down for a long time (days or weeks), + this can be quite a lot of data, depending on your Master + node's workload. +

    +

    + Be aware, however, that restarting nodes do not have to + get their data from the Master node. It is possible for + them to catch up, or nearly catch up, using data obtained + from some other currently running Replica. See + Restoring Log Files + for more information. +

    +

    + Good application performance also depends on the + latency of network connections used by electable and + monitor nodes to perform elections, report election + results, and obtain acknowledgments. Consider + deploying secondary nodes on machines with higher + latency connections to the other members of the + replication group, keeping in mind that these nodes + still have the same throughput requirements as + electable nodes. +

    +
  • +
+
+
+
+ + + diff --git a/docs/ReplicationGuide/admintimesync.html b/docs/ReplicationGuide/admintimesync.html new file mode 100644 index 0000000..852b59e --- /dev/null +++ b/docs/ReplicationGuide/admintimesync.html @@ -0,0 +1,88 @@ + + + + + + Time Synchronization + + + + + + + + + +
+
+
+
+

Time Synchronization

+
+
+
+

+ For best results, you are strongly recommended to synchronize the + clocks on all the machines hosting your production + replication group. Running a time synchronization daemon like + NTPD is a simple way to + keep time synchronized across your replication machines. Once the + clocks are set, they are maintained by ntpd so that they rarely + stray more than 128ms away from one another. +

+

+ Be aware the JE checks for clock skew between the Master and + a starting Replica node, when the Replica node performs its + startup handshake with the Master. (See + Replica Startup + for information on the startup handshake.) If the clock skew between + the two nodes is too large, the handshake is aborted and JE + throws an EnvironmentFailureException. +

+

+ Also, well-synchronized clocks are required for a proper + implementation of a time consistency policy (see + Time Consistency Policies). + It is also required for correct internal booking by JE. +

+

+ Finally, synchronized system clocks make it easier to correlate + events in the logging output from different nodes in the group. +

+
+ + + diff --git a/docs/ReplicationGuide/availability.html b/docs/ReplicationGuide/availability.html new file mode 100644 index 0000000..ca98947 --- /dev/null +++ b/docs/ReplicationGuide/availability.html @@ -0,0 +1,220 @@ + + + + + + Availability + + + + + + + + + +
+
+
+
+

Availability

+
+
+
+
+
+
+ + Write Availability + +
+
+ + Read Availability + +
+
+
+

+ A key difference between standalone JE and JE HA is + that for standalone JE the environment is available for + both reads and writes as long as the application (including + the underlying hardware) is functioning correctly. That is, + the availability of a standalone JE application is + independent of the local durability policy set for the + transaction. However, the distributed nature of JE HA, means + that availability can be dependent upon the state of other + nodes in the replication group. It can also be dependent upon + the policies you set for your HA application. +

+
+
+
+
+

Write Availability

+
+
+
+

+ JE HA requires that a simple majority of electable nodes be + available to elect a Master. If a simple majority of those + nodes is not available, the group is not available for + writes because the group is unable to elect a Master. +

+

+ In the presence of a Master, the availability of a + replicated environment (at the Master) for write + operations is determined by the durability + requirements associated with the transaction: +

+
+
    +
  • +

    + If the transaction's durability requirements + specify an acknowledgement policy of NONE, the + Master is always available for write operations, + just as is the case for standalone JE + applications. +

    +
  • +
  • +

    + If the durability requirements are made more + stringent and specify a simple majority for + acknowledgements, or if all + the electable group members must acknowledge transaction + commits, the environment might not be available for + writes when one or more of the Electable Replicas is unable + to provide an acknowledgment. This loss of write + availability can occur even in the absence of + hardware failures. +

    +

    + Replicas might be unable to provide + acknowledgements because a node is down. It could + also occur if the Replica is simply lagging + too far behind in the replication stream and so + needs to commit earlier transactions before it can + commit the current transaction. Note that in the + absence of system level failures, the Replica will + eventually commit the transaction, it just can not + do so in the window of time required to indicate a + successful commit of the transaction to the Master. +

    +
  • +
+
+

+ In other words, a durability policy that calls for commit + acknowledgments can result in decreased availability of + the system for write operations. It is important for + you to keep this tradeoff in mind when choosing a + durability policy. +

+
+
+
+
+
+

Read Availability

+
+
+
+

+ A Master is always available for read operations because + the data on it is always absolutely consistent. However, + Replica read availability can be affected by the + consistency policy that you are using: +

+
+
    +
  • +

    + A Replica is always available for read operations + that do not have any read consistency requirements. + That is, when the Replica is allowed to lag + arbitrarily far behind the Master, then the Replica + will always be available to service read requests. +

    +
  • +
  • +

    + If you are using higher levels of read consistency, + then Replicas might not be available for read + operations. This occurs when the Replica is forced + to wait until it has caught up far enough in the + replication stream before it can service a read + operation. For example, if you choose a time + consistency policy, and the the Replica cannot meet + that consistency policy for a specific read + operation, then the operation might be delayed or + even abandoned entirely until the consistency + policy can be met. This represents a loss of read + availability. +

    +

    + There are many reasons why a Replica might not be + able to meet a consistency policy. For example, + the Master might be very busy and so is unable to + supply the Replica with the replication stream + fast enough. Or, it could be because the Replica + is experiencing very heavy read loads and so + the replication stream might not be fast enough + to keep up. It is also possible that the Replica + has been down and is trying to catch up, which + means that it might not be able to meet a + consistency policy. +

    +

    + All of these scenarios represent a loss of read + availability, albeit a temporary one. +

    +
  • +
+
+

+ In other words, a consistency policy that requires the + Replica to match the state of the Master to one degree or + another can affect the Replica's read availability. It + is important for you to keep this tradeoff in mind when + choosing a consistency policy. +

+
+
+ + + diff --git a/docs/ReplicationGuide/backups.html b/docs/ReplicationGuide/backups.html new file mode 100644 index 0000000..9f0a448 --- /dev/null +++ b/docs/ReplicationGuide/backups.html @@ -0,0 +1,92 @@ + + + + + + Running Backups + + + + + + + + + +
+
+
+
+

Running Backups

+
+
+
+

+ Because JE replication causes a current copy of your + environment to be available at every data node in the group, the need + for frequent backups is greatly reduced. Basically, every time a + change is made on the Master, that change is backed up to every + Replica node currently running. The result is that for each write + operation you get a real-time incremental backup to + n-1 nodes, where n are + the total number of data nodes (including the Master) currently + running in your replication group. +

+

+ For this reason, JE does not currently support formal + incremental backups of replicated environments. An application + based upon the DbBackup utility class can be written to allow + administrators to create full backups. This is useful for + creating a backup to be stored on offline media, if your data + strategy calls for that level of protection. +

+

+ Remember that when performing a full backup, you should obtain + the backup from a node that is current. Either use the Master + node itself, or use a Replica node that must acknowledge a + transaction commit before the commit operation can complete on + the Master. +

+

+ Note that DbBackup has some functionality that + is specifically useful for replicated environments. See + Backing up a Replicated Application + for details. +

+
+ + + diff --git a/docs/ReplicationGuide/cons_and_dur.html b/docs/ReplicationGuide/cons_and_dur.html new file mode 100644 index 0000000..6f2e951 --- /dev/null +++ b/docs/ReplicationGuide/cons_and_dur.html @@ -0,0 +1,390 @@ + + + + + + Consistency and Durability Use Cases + + + + + + + + + +
+
+
+
+

Consistency and Durability Use Cases

+
+
+
+
+
+
+ + Out on the Town + +
+
+ + Bio Labs, Inc + +
+
+
+

+ As discussed throughout this chapter, there is an interaction + between consistency and durability. This interaction results in + design decisions that you will have to make when designing your + HA application. To further illustrate this interaction, this + section provides several use cases as examples of how + durability and consistency policies are used to reach + application design goals. +

+
+
+
+
+

Out on the Town

+
+
+
+

+ Out on the Town is a social networking + site about restaurants and artistic events. Restaurant + locations and an event calendar are available on the site. + Members can submit reviews about restaurants and events, + and other members can comment on the reviews. Further, + members maintain accounts and profiles. +

+

+ The site experiences most of its traffic as read-only + requests. There is heavy read traffic from users who are + browsing the site. In addition, periodic write traffic + occurs as reviews and comments are submitted to the site. +

+
+
+
+
+

Reading Reviews

+
+
+
+

+ Based on the site's usage characteristics, the web developers + know that it is critical that the site perform well for read traffic. + Listings must be readily available, and the site must be + able to adapt to changing read loads. However, the site + only needs a low threshold for most reads. +

+

+ While users should not experience a delay when they + access the site, it is okay if read requests do not see + the very latest reviews. For this reason, when starting + read-only transactions for the purpose of viewing + reviews, the application specifies a consistency policy + of NoConsistencyRequiredPolicy. This provides the highest + possible availability for read requests for the Replica + nodes, which is the critical thing for this particular + site. (Any other consistency policy might cause the + node to delay reads while waiting for the node to meet + its consistency policy, which would represent an + unacceptable loss of availability as it could cost the + site lost readership.) +

+
+
+
+
+
+

Writing Reviews

+
+
+
+

+ Most write operations are for new user reviews, and for comments on those + reviews. For these writes, the application needs only a very lenient durability + policy. It is not critical that a new review is immediately + available to other users, nor is it critical that they are saved in the event of + a catastrophic failure. +

+

+ Therefore, the application uses the convenience + constant Durability.COMMIT_WRITE_NO_SYNC as the system default durability + policy. (This is done by specifying the durability policy using + EnvironmentMutableConfig.setDurability().) This means: +

+
+
    +
  • +

    + Write operations on the Master use + Durability.SyncPolicy.WRITE_NO_SYNC. +

    +
  • +
  • +

    + When the write operation is forwarded by the Master to the Replicas, those Replicas use + Durability.SyncPolicy.NO_SYNC when they internally update their own + databases. +

    +
  • +
  • +

    + Only a simple majority of the Electable nodes need to acknowledge the + update. +

    +
  • +
+
+
+
+
+
+
+

Updating Events and Restaurant Listings

+
+
+
+

+ Periodically, the calendar of events and restaurant locations are updated. These + write operations happen fairly infrequently relative to reviews and comments, + but the site's operators deem this information to be of more importance (or + valuable) than the reviews and comments. Therefore, they want a stronger + guarantee that the information is backed up to all nodes, which is the same + thing as saying they want a stronger durability guarantee. Nevertheless, they + also want this class of writes to consume few resources. +

+

+ To achieve this, for transactions performing these kind of writes, the web + engineers choose to override the site's default durability guarantee. Instead, + they use a durability guarantee that: +

+
+
    +
  • +

    + Uses Durability.SyncPolicy.SYNC for the local synchronization policy. + This ensures that the write is fully backed up to the Master's local + disk before the transaction commit operation returns. +

    +
  • +
  • +

    + Uses Durability.SyncPolicy.WRITE_NO_SYNC for the synchronization + policy on the Replica nodes. This causes the updates to be written to + the disk controller's buffers, but they are not flushed to disk before + the Electable Replicas acknowledge the commit operation. +

    +
  • +
  • +

    + Stays with a simply majority for acknowledgements, which is the same as + is used for the default durability policy. +

    +
  • +
+
+

+ That is, for updating events and restaurant locations, the application uses this + durability policy: +

+
    useForUpdates = 
+         new Durability(Durability.SyncPolicy.SYNC,
+                        Durability.SyncPolicy.WRITE_NO_SYNC,
+                        Durability.ReplicaAckPolicy.SIMPLE_MAJORITY); 
+
+
+
+
+
+

Updating Account Profiles

+
+
+
+

+ If a user makes an account profile change as part of a + web session, she will naturally expect to see her + changes when she next looks at the profile during the + same session. From the user's perspective, this is all + one operation: she causes her profile to change and + then the profile page is refreshed with her new + information. +

+

+ However, from the application's perspective, there are + several things going on: +

+
+
    +
  • +

    + A write transaction is performed on the Master. +

    +
  • +
  • +

    + One or more read transactions are performed on the + Replica node in use by the user as she updates + her profile and then reads back the changes she + just made. +

    +
  • +
+
+

+ To ensure that the session interaction looks + intuitively consistent to the user, the application: +

+
+
    +
  • +

    + Performs the write transaction on the Master. +

    +
  • +
  • +

    + Saves the CommitToken for the account profile + update within the web session. +

    +
  • +
  • +

    + The Replica node uses a CommitPointConsistencyPolicy policy for the + follow-on account profile read(s). To do this, the application uses the + CommitToken stored in the previous step when beginning the read + transactions. In this way, the Replica will not serve up the new profile + page until it has received the profile updates from the Master. From the + user's perspective, there may be a delay in her page refresh when she + submits her updates. How long of a delay experienced by the user is a + function of how busy the site is with write updates, as well as the + performance characteristics of the hardware and networks in use by the + site. +

    +
  • +
+
+
+
+
+
+
+
+

Bio Labs, Inc

+
+
+
+

+ Bio Labs, Inc is a biotech company that is doing pharmaceutical + production which must be audited by government agencies. Production sampling results + are logged frequently. All such updates must be guaranteed to be backed up. (In + other words, this application requires a very high durability guarantee.) +

+

+ In addition, there are frequent application defined sample points that represent + phases in the production cycle. The application performs monitoring of the + production stream. These reads are time critical, so the data must be no older + than a specific point in time. +

+
+
+
+
+

Logging Sampling Results

+
+
+
+

+ Due to the auditing requirement for the sampling results, the application + developers want an extremely high data durability guarantee. Therefore, they + require the synchronization policy on both the + Master and all Electable Replica nodes to + be Durability.SyncPolicy.SYNC, which means that the logging data is guaranteed to + be written to stable storage before the host returns from its transaction + commit. +

+

+ For an acknowledgement policy, the engineers + considered requiring all Electable nodes to + acknowledge the commit. This would provide them with the strongest possible + durability guarantee. However, they decided against this because it represents a + possible loss of write availability for the + application; if even one Electable node is + shutdown or hidden by a network outage, then the Master would not be able to + perform any write operations at all. So instead, the engineers stick with the + default acknowledgement policy, which is to require a simple majority of the + Electable nodes to acknowledge the commit. +

+

+ The durability policy, then, looks like this: +

+
    resultsDurability = 
+         new Durability(Durability.SyncPolicy.SYNC,
+                        Durability.SyncPolicy.SYNC,
+                        Durability.ReplicaAckPolicy.SIMPLE_MAJORITY); 
+
+
+
+
+
+

Monitoring the Production Stream

+
+
+
+

+ The BioLabs application is required to monitor the production stream. All such + monitoring must be of data that is no older than a defined age. +

+

+ This represents a read activity that has a time concurrency policy requirement. + Therefore, whenever the application performs a write (that is, logs sampling + results), the application creates a CommitToken. Each of the nodes, then, use + this commit token to specify a CommitPointConsistencyPolicy policy when the + Environment.beginTransaction() method is called. This guarantees that the + application's data monitoring activities will be performed on data that is not + out of date or stale. +

+
+
+
+ + + diff --git a/docs/ReplicationGuide/consistency.html b/docs/ReplicationGuide/consistency.html new file mode 100644 index 0000000..4191a9f --- /dev/null +++ b/docs/ReplicationGuide/consistency.html @@ -0,0 +1,508 @@ + + + + + + Managing Consistency + + + + + + + + + +
+
+
+
+

Managing Consistency

+
+
+
+ +

+ In a traditional stand-alone transactional application, consistency + means that a transaction takes the database from one consistent state to another. What + defines a consistent state is application-specific. This transition is made atomically, + that is, either all the operations that constitute the transaction are performed, or + none of them are. JE HA supports this type of transactional consistency both on the + Master, as well as on the Replicas as the replication stream is replayed. That is, in + the absence of failures, the Replicas will see exactly the same sequence of transitions, + from one consistent state to another, as the Master. + +

+

+ A JE HA application must additionally concern itself with the data consistency of + the Replica with respect to the Master. In a distributed system like JE HA, the + changes made at the Master are not always instantaneously available at every Replica, + although they eventually will be. For example, consider a + three node group, containing only Electable nodes, where a + change is made on the Master and the transaction is committed with a durability policy + requiring acknowledgments from a simple majority of nodes. After a successful commit of + this transaction, the changes will be available at the Master and at one other Replica, + thus satisfying the requirement for a simple majority of acknowledgments. The state of + the Master and the acknowledging Replica will be consistent with each other after the + transaction has been committed, but the transaction commit makes no guarantees about the + state of the third Replica after the commit. +

+

+ In general, Replicas not directly involved in contributing to the acknowledgment of a + transaction commit will lag in the replay of the replication stream because they do not + synchronize their commits with the Master. As a consequence, their state, on an + instantaneous basis, may not be current with respect to the Master. However, in the + absence of further updates, all Replicas will eventually catch up and reflect the + instantaneous state of the Master. This means that a Replica which is not + consistent with the Master simply reflects an earlier locally consistent state at the + Master because transaction updates on the Replica are always applied, atomically and in + order. From the application's perspective, the environment on the Replica goes through + exactly the same sequence of changes to its persistent state as the Master. +

+

+ A Replica may similarly lag behind the Master if it has been down for some period of + time and was unable to communicate with the Master. Such a Replica will catch up, when + it is brought back up and will eventually become consistent with the Master. +

+

+ Given the distributed nature of a JE HA application, and the fact that some nodes + might lag behind the Master, the question you have to ask yourself is how long will it take for + that node to be consistent relative to the Master. More to the + point: how far behind the Master are you willing to allow the node to lag? +

+

+ This should be one of your biggest concerns when it comes to + architecting a JE HA application. +

+

+ You define how current the nodes in your replication group must + be by defining a consistency policy. + You define your consistency policy using an implementation of the + ReplicaConsistencyPolicy interface. This interface allows you + to define how current the Replica must be before a transaction + can be started on the Replica. (Remember that all read + operations are performed within a transaction.) If the Replica + is not current enough, then the start of that transaction is + delayed until that level of consistency has been reached. This + means that Replicas that are not current enough will block read + operations until they are brought up to date. +

+

+ Obviously your consistency policy can have an affect on your Replica's read performance + by increasing the latency experienced by read transactions. This is because transactions + may have to wait to either begin or commit until the consistency policy can be + satisfied. If the consistency policy is so stringent that it cannot be satisfied using + the available resources, the Replica's availability for reads may deteriorate as + transactions timeout. A Durability.SyncPolicy.SYNC policy on the Replica can slow + down write operations on the Replica, making it harder for the Replica to meet its + consistency guarantee. Conversely, a Durability.SyncPolicy.NO_SYNC policy on the + Replica makes it easy for the Replica to keep up, which means you can have a stronger + consistency guarantee. +

+

+ One of three interface implementations are available for you to + use when defining your consistency policy: +

+
+
    +
  • +

    + NoConsistencyRequiredPolicy +

    +

    + No consistency policy is enforced. This policy allows + a transaction on a Replica to proceed regardless of the + state of the Replica relative to the Master. This + policy can also be used to access a database when the + replication node is in a DETACHED state. +

    +
  • +
  • +

    + TimeConsistencyPolicy +

    +

    + Defines how far back in time the Replica is permitted + to lag the Master. +

    +
  • +
  • +

    + CommitPointConsistencyPolicy +

    +

    + Defines consistency in terms of a specified commit + token. That is, the Replica must be at least as current + as the CommitToken provided to this class. +

    +
  • +
+
+
+
+
+
+

Setting Consistency Policies

+
+
+
+

+ You set a consistency policy by using + ReplicationConfig.setConsistencyPolicy(). + For example: +

+
   EnvironmentConfig envConfig = new EnvironmentConfig();
+   envConfig.setAllowCreate(true);
+   envConfig.setTransactional(true);
+
+   // Require no synchronization for transactional commit on the 
+   // Master, but full synchronization on the Replicas. Also,
+   // wait for acknowledgements from a simple majority of Replicas.
+   Durability durability =
+          new Durability(Durability.SyncPolicy.NO_SYNC,
+                         Durability.SyncPolicy.SYNC,
+                         Durability.ReplicaAckPolicy.SIMPLE_MAJORITY);
+
+   envConfig.setDurability(durability);
+
+   // Identify the node
+   ReplicationConfig repConfig = 
+        new ReplicationConfig("PlanetaryRepGroup",
+                              "Jupiter",
+                              "jupiter.example.com:5002");
+ 
+   // Use the node at mercury.example.com:5001 as a helper to find the rest
+   // of the group.
+   repConfig.setHelperHosts("mercury.example.com:5001");
+
+   // Turn off consistency policies. Transactions can occur
+   // regardless of how consistent the Replica is relative
+   // to the Master.
+   NoConsistencyRequiredPolicy ncrp =
+        new NoConsistencyRequiredPolicy();
+   repConfig.setConsistencyPolicy(ncrp);
+
+   ReplicatedEnvironment repEnv =
+      new ReplicatedEnvironment(home, repConfig, envConfig); 
+

+ Note that the consistency policy is set on a node-by-node + basis. There is no requirement that you set the same policy for + every node in your replication group. +

+

+ You can also set consistency policies on a + transaction-by-transaction basis when you begin the + transaction: +

+
   // Turn off consistency policies. The transactions can
+   // be performed regardless of how consistent the Replica is 
+   // relative to the Master.
+   NoConsistencyRequiredPolicy ncrp =
+        new NoConsistencyRequiredPolicy();
+
+   TransactionConfig tc = new TransactionConfig();
+   tc.setConsistencyPolicy(ncrp);
+   // env is a ReplicatedEnvironment handle
+   env.beginTransaction(null, tc); 
+
+
+
+
+
+

Time Consistency Policies

+
+
+
+

+ A time consistency policy is a time-oriented policy that + defines how far back in time the Replica is permitted to + lag the Master. It does so by comparing the time + associated with the latest transaction committed on the + Master with the current time. If the Replica lags by an + amount greater than the permissible lag, it will hold back + the start of the transaction until the Replica has replayed + enough of the replication stream to narrow the lag to + within the permissible lag. +

+

+ Use of a time based consistency policy requires that nodes + in a replication group have their clocks reasonably + synchronized. This can be easily achieved using a daemon + like NTPD. +

+

+ You implement a time-based consistency policy by using the + TimeConsistencyPolicy class. To instantiate this class, + you provide it with the following: +

+
+
    +
  • +

    + A number representing the permissible lag. +

    +
  • +
  • +

    + A TimeUnit constant indicating the units of time + that the permissible lag represents. +

    +
  • +
  • +

    + A number representing the timeout period during + which a transaction will wait for the Replica to + catch up so that the consistency policy can be met. + If the transaction waits more than the timeout + period, a ReplicaConsistencyException is thrown. +

    +
  • +
  • +

    + A TimeUnit constant indicating the units of time + in use for the timeout value. +

    +
  • +
+
+

+ For example: +

+
   EnvironmentConfig envConfig = new EnvironmentConfig();
+   envConfig.setAllowCreate(true);
+   envConfig.setTransactional(true);
+
+   // Require no synchronization for transactional commit on the 
+   // Master, but full synchronization on the Replicas. Also,
+   // wait for acknowledgements from a simple majority of Replicas.
+   Durability durability =
+          new Durability(Durability.SyncPolicy.NO_SYNC,
+                         Durability.SyncPolicy.SYNC,
+                         Durability.ReplicaAckPolicy.SIMPLE_MAJORITY);
+
+   envConfig.setDurability(durability);
+
+   // Identify the node
+   ReplicationConfig repConfig = 
+        new ReplicationConfig("PlanetaryRepGroup",
+                              "Jupiter",
+                              "jupiter.example.com:5002");
+ 
+   // Use the node at mercury.example.com:5001 as a helper to find the rest
+   // of the group.
+   repConfig.setHelperHosts("mercury.example.com:5001");
+
+   // Set consistency policy for replica.
+   TimeConsistencyPolicy consistencyPolicy = new TimeConsistencyPolicy
+       (1, TimeUnit.SECONDS, /* 1 sec of lag */
+       10, TimeUnit.SECONDS /* Wait up to 10 sec */);
+   repConfig.setConsistencyPolicy(consistencyPolicy);
+
+   ReplicatedEnvironment repEnv =
+      new ReplicatedEnvironment(home, repConfig, envConfig); 
+
+
+
+
+
+

Commit Point Consistency Policies

+
+
+
+

+ A commit point consistency policy defines consistency in + terms of the commit of a specific transaction. This policy + can be used to ensure that a Replica is at least current + enough to have the changes made by a specific transaction. + Because transactions are applied serially, by ensuring a + Replica has a specific commit applied to it, you know that + all transaction commits occurring prior to the specified + transaction have also been applied to the Replica. +

+

+ As is the case with a time consistency policy, if the + Replica is not current enough relative to the Master, all + attempts to begin a transaction will be delayed until the + Replica has caught up. If the Replica does not catch up + within a specified timeout period, the transaction will + throw a ReplicaConsistencyException. +

+

+ In order to specify a commit point consistency policy, you + must provide a CommitToken that is used to identify the + transaction that the Replica must have in order to be + current enough. Because the commit point that you care + about will change from transaction to transaction, you do + not specify commit point consistency policies on an + environment-wide basis. Instead, you specify them when you + begin a transaction. +

+

+ For example, suppose the application is a web application + where a replicated group is implemented within a load + balanced web server group. Each request to the web server + consists of an update operation followed by read operations + (say from the same client), The read operations naturally + expect to see the data from the updates executed by the + same request. However, the read operations might have been + routed to a node that did not execute the update. +

+

+ In such a case, the update request would generate a + CommitToken, which would be resubmitted by the browser, + along with subsequent read requests. The read request could + be directed at any one of the available web servers by a + load balancer. The node which executes the read request + would create a CommitPointConsistencyPolicy with that + CommitToken and use it at transaction begin. If the + environment at the web server was already current enough, + it could immediately execute the transaction + and satisfy the request. If not, the "transaction begin" + would stall until the Replica replay had caught up and the + change was available at that web server. +

+

+ You obtain a commit token using the + Transaction.getCommitToken() method. Use this method after + you have successfully committed the transaction that you + want to base a CommitPointConsistencyPolicy upon. +

+

+ For example: +

+
Database myDatabase = null;
+Environment myEnv = null;
+CommitToken ct = null;
+try {
+    ...
+    // Environment and database setup removed for brevity
+    ...
+
+    Transaction txn = myEnv.beginTransaction(null, null);
+
+    try {
+        myDatabase.put(txn, key, data);
+        txn.commit();
+        ct = txn.getCommitToken();
+        if (ct != null) {
+            // Do something with the commit token to
+            // forward it to the Replica where you
+            // want to use it.
+        }
+    } catch (Exception e) {
+        if (txn != null) {
+            txn.abort();
+            txn = null;
+        }
+    }
+
+} catch (DatabaseException de) {
+    // Exception handling goes here
+} 
+

+ To create your commit point token consistency policy, transfer the + commit token to the Replica performing a read using whatever + mechanism that makes sense for your HA application, and then create + the policy for that specific transaction handle: + Note that CommitToken implements Serializable, so you can + use the standard Java serialization mechanisms when passing the + commit token between processes. +

+
Database myDatabase = null;
+Environment myEnv = null;
+CommitToken ct = null;
+try {
+    ...
+    // Environment and database setup removed for brevity
+    ...
+
+    CommitPointConsistencyPolicy cpcp = 
+        new CommitPointConsistencyPolicy(ct,      // The commit token
+                           10, TimeUnit.SECONDS); // Timeout value
+
+    TransactionConfig txnConfig = new TransactionConfig();
+    txnConfig.setConsistencyPolicy(cpcp);
+
+
+    Transaction txn = myEnv.beginTransaction(null, txnConfig);
+
+    try {
+        // Perform your database read here using the transaction
+        // handle, txn.
+        txn.commit();
+    } catch (Exception e) {
+        // There are quite a lot of different exceptions that can be
+        // seen at this level, including the LockConflictException.
+        // We just catch Exception for this example for simplicity's 
+        // sake.
+        if (txn != null) {
+            txn.abort();
+            txn = null;
+        }
+    }
+
+} catch (ReplicaConsistencyException rce) {
+        // Deal with this timeout error here. It is thrown by the
+        // beginTransaction operation if the consistency policy 
+        // cannot be met within the timeout time.
+} catch (DatabaseException de) {
+    // Database exception handling goes here.
+} catch (Exception ee) {
+    // General exception handling goes here.
+}
+
+
+ + + diff --git a/docs/ReplicationGuide/datamanagement.html b/docs/ReplicationGuide/datamanagement.html new file mode 100644 index 0000000..77034fa --- /dev/null +++ b/docs/ReplicationGuide/datamanagement.html @@ -0,0 +1,278 @@ + + + + + + Managing Data Guarantees + + + + + + + + + +
+
+
+
+

Managing Data Guarantees

+
+
+
+
+
+
+ + Durability + +
+
+ + Managing Data Consistency + +
+
+
+

+ All replicated applications are first transactional + applications. This means that you have the standard data + guarantee issues to consider, all of which have to do with + how durable and consistent you want your data to be. Of + course, considerations of this nature also play a role in + your application's performance. These issues are even more + important for replicated applications because replication + adds additional dimensions to them. +

+

+ Notably, in a replicated application you must decide how + durable your data is, by deciding how careful the Master will + be to make sure a data write has been written to disk on its + various Replica nodes before completing the transaction. +

+

+ Consistency also adds an additional dimension in a replicated + application, because now you must decide how consistent the + various nodes in the replication group will be relative to + the Master at any given time. If no writes are being + performed on the Master, all Replicas will eventually catch + up to the Master and so be completely consistent with it. + But for most HA applications, writes are occurring on the + Master, and so it is possible for some number of your + Replicas to lag behind the Master. What you have to decide, + then, is how sensitive your application is to this kind of + temporary inconsistency. +

+

+ Note that your consistency requirements can be gated by your + durability requirements. Durability, in turn, can be gated by + any concerns you might have on write throughput. At the same + time, your consistency requirement can have an affect on the + read performance of your Replicas. It is + therefore a mistake to think about any one of these + requirements in the absence of the others. +

+
+
+
+
+

Durability

+
+
+
+

+ One of the reasons you might be writing a replicated + application is to achieve a higher durability guarantee + than you can get with a traditional transactional + application. In a traditional application, your data's + durability is a function of how you perform your + transactional commits, and how frequently you perform + your backups. For this class of application, the + strongest durability guarantee you can have is to use + synchronous commits (the commit does not + complete until the data is written to disk), coupled with + very frequent backups of your environment. +

+

+ The problem with a stand-alone application in which you + are seeking a very high durability guarantee is that your + write throughput will suffer. Synchronous commits + require disk writes, and disk I/O is one of the most + expensive operations you can ask a database to perform. +

+

+ In order to increase write throughput in your + transactional application, you may decide to use + asynchronous commits that do not require the disk I/O to + complete before the transaction commit completes. + The problem with this is that your application can + potentially crash before a transaction has been + completely written to disk. This represents a loss of + data, which is to say the data is not durable. +

+

+ Replication can help with your data durability in a + couple of ways. Most importantly, replication allows you to + commit to the network. This means + that when your Master commits a transaction, the results + of that commit are sent to one or more nodes available + over the network. Consequently, multiple disks, disk + controllers, power supplies, and CPUs are used to ensure + the data modification makes it to stable storage. +

+

+ Usually JE makes the commit operation on the Master + wait until it receives acknowledgements from some number + of electable nodes before returning from the + operation. However, if you want to increase write + throughput, you can configure your Master to proceed + without acknowledgements, and so return immediately from + the commit operation (once the commit operation has met + the local durability requirement). The price that you pay + for this is a reduced durability guarantee. How reduced + the guarantee is, is a function of the number of electable + nodes in your replication group (the more you have, the + higher your durability guarantee is) and the quality and + stability of your network. +

+

+ Alternatively, you can obtain an + extremely high durability guarantee by configuring the Master + to wait for all electable nodes to acknowledge a commit + operation before returning from the operation. The price + you pay for this very high guarantee is greatly reduced + write throughput. +

+

+ For information on configuring and managing durability + guarantees for your replicated application, see + Managing Durability. +

+
+
+
+
+
+

Managing Data Consistency

+
+
+
+

+ Data consistency means that the data you thought you + wrote to your environment is in fact written to your + environment. It also means that you will never find + partial records written to your environment. +

+

+ In a replicated application, consistency also means that + data which is available on the Master is also available + on the Replicas. +

+

+ A simple transactional application offers consistency + guarantees that are enforced when you commit a + transaction. Your replicated application also offers this + consistency guarantee (because it is also a transactional + application). For this reason, the environment on the + Master is always absolutely consistent. But beyond that, you need to manage + consistency for data across all the nodes in your + replication group. +

+

+ When you commit a transaction on the Master, your + Replica nodes may or may not have the data changes + performed by that transaction at the end of the commit. + Whether they do depends on how high a durability + guarantee you implemented for your Master (see the + previous section). If, for example, you configured your + Master to require acknowledgements from all electable + nodes before returning from the commit, then the data + will be consistently available across all of those nodes + in the replication group, although not necessarily by + secondary nodes. However, if you configured the Master + such that no acknowledgements are necessary, then your + data is probably not consistent across the replication + group. +

+

+ To ensure that read transactions on the Replicas see a + sufficiently consistent view of the environment, you can + set a consistency policy for each transaction. This + policy describes how current the Replica must be before a + transaction can be initiated on it. If the Replica is not + current enough, the start of the transaction is delayed + until the Replica has caught up. +

+

+ There are two possible consistency policies. First, there + is a time-based policy that describes how far back in + time the Replica is allowed to lag behind the Master. + Secondly, you can use a commit-based consistency + policy that is based on the commit of a specified + transaction. This policy is used to ensure the Replica is + at least current enough to have the changes made by a + specific transaction, and by all transactions committed + prior to the specified transaction. The start of a + transaction on a Replica can be delayed until the Replica + can meet the consistency policy defined for that transaction. +

+

+ This means that a stringent consistency policy can affect + your Replica's read throughput. Transactions, even + read-only transactions, cannot begin until the Replica is + consistent enough. So if you have a + Replica that has lagged far behind the Master, and which + is having trouble catching up due to network latency or + other issues, then read requests may stall, and perhaps + even time out, which will affect the latency of your + Replica's read requests, and perhaps even its + overall availability for read requests. For this reason, + give careful consideration to how well you want your + Replica to perform on reads, versus how consistent you + want the Replica to be with other nodes in the + replication group. +

+

+ For more information on managing consistency in your + replicated application, see + Managing Consistency. +

+
+
+ + + diff --git a/docs/ReplicationGuide/dbbackup.html b/docs/ReplicationGuide/dbbackup.html new file mode 100644 index 0000000..85b8d54 --- /dev/null +++ b/docs/ReplicationGuide/dbbackup.html @@ -0,0 +1,111 @@ + + + + + + Backing up a Replicated Application + + + + + + + + + +
+
+
+
+

Backing up a Replicated Application

+
+
+
+

+ In a stand-alone, non-replicated JE application, the log is + strictly append only. You use the DbBackup class to help + applications coordinate while database operations are + continuing to add to the log. This helper class does this by + defining the log files needed for a consistent backup, and then freezes + all changes to those files, including any changes that might be + made by JE background operations. The application can copy + that defined set of files and finish operation without checking + for the ongoing creation of new files. Also, there will be no + need to check for a newer version of the last file on the next + backup. +

+

+ When you are using JE HA, however, log files other than the + last log file might be modified as part of the HA sync-up + operation. Though a rare occurrence, such + modifications would invalidate the backup because there is the + chance that files are modified after being copied. +

+

+ If this happens, DbBackup.endBackup() throws a + LogOverwriteException. Upon encountering this exception, the + backup files should be discarded and a new set of backup files + created. +

+

+ For example: +

+
        for (int i=0; i < BACKUP_RETRIES; i++) {
+            final ReplicatedEnvironment repEnv = ...;
+            final DbBackup backupHelper = new DbBackup(repEnv);
+            
+            backupHelper.startBackup();
+            String[] filesForBackup = 
+                backupHelper.getLogFilesInBackupSet();
+
+            /* Copy the files to archival storage. */
+            myApplicationCopyMethod(filesForBackup);
+            
+            try {
+                backupHelper.endBackup();
+                break;
+            } catch (LogOverwriteException e) {
+                /* Remove backed up files. */ 
+                myApplicationCleanupMethod();
+                continue;
+            } finally {
+                repEnv.close();
+            }
+        } 
+
+ + + diff --git a/docs/ReplicationGuide/election-override.html b/docs/ReplicationGuide/election-override.html new file mode 100644 index 0000000..d0f8446 --- /dev/null +++ b/docs/ReplicationGuide/election-override.html @@ -0,0 +1,331 @@ + + + + + + Appendix A. Managing a Failure of the Majority + + + + + + + + +
+
+
+
+

Appendix A. Managing a Failure of the Majority

+
+
+
+

+ Normal operation of JE HA requires that at least a simple majority + of electable nodes be available to form a quorum for election of a + new Master, or when committing a transaction with default + durability requirements. The number of electable nodes (the + Electable Group Size) is obtained from persistent internal metadata + that is stored in the environment and replicated across all + members. See Replication Group Life Cycle for details. +

+

+ Under exceptional circumstances, a simple majority of electable nodes may + become unavailable for some period of time. With only a minority + of electable nodes available, the overall availability of the group can be + adversely affected. For example, the group may be unavailable for + writes because a master cannot be elected. Also, the Master may be + unable to satisfy the durability requirements for a transaction + commit. The group may also be unavailable for reads, because the + absence of a Master might cause a Replica to be unable to meet + consistency requirements. +

+

+ To deal with this exceptional circumstance + — especially if the situation is likely to persist for an + unacceptably long period of time — JE HA provides a + mechanism by which you can modify the way in which the number of + electable nodes, and consequently the quorum requirements for + elections and commit acknowledgments, is calculated. The escape + mechanism provides a way to override the normal computation of the + Electable Group Size. The override is accomplished by specifying + the size using the mutable replication configuration parameter + ELECTABLE_GROUP_SIZE_OVERRIDE. +

+
+

Note

+

+ You should use this parameter sparingly, if at all. Overriding + your Electable Group Size can have the consequence of allowing + your replication group's election participants to elect two Masters + simultaneously. This is especially likely to occur if a + majority of the nodes are unavailable due to a network + partition event, and so all nodes are running but are simply + not communicating with one another. +

+

+ Be very cautious when using this configuration + option. +

+
+
+
+
+
+

Overriding the Electable Group Size

+
+
+
+ +

+ When you set ELECTABLE_GROUP_SIZE_OVERRIDE to a non-zero value, the + number that you provide identifies the number of electable nodes that + are required to meet quorum requirements. This means that the + internally stored Electable Group Size value is ignored (but + not changed) when this option is non-zero. By setting + ELECTABLE_GROUP_SIZE_OVERRIDE to the number of electable nodes known to be + available, the remaining replication group participants can + make forward progress, both in terms of electing a new + Master (if this is required) and in terms of meeting durability + and consistency requirements. +

+

+ When this option is zero (0), then the node will behave + normally, and the internal Electable Group Size is honored by + the node. This is the default value and behavior. +

+
+
+
+
+

Setting the Override

+
+
+
+

+ To override the internal Electable Group Size value: +

+
+
    +
  1. +

    + Verify that the simple majority of electable nodes are in fact + down and cannot elect their own independent Master. +

    +
  2. +
  3. +

    + Set ELECTABLE_GROUP_SIZE_OVERRIDE to the number of + electable nodes known to be available. For best + results, set this override on all available + electable nodes. +

    +

    + It might be sufficient to set ELECTABLE_GROUP_SIZE_OVERRIDE + on just one electable node in order to hold an election, because + the proposer at that one node can conclude the + election. However, if the election results in + Master that is not configured with this override, it + might result in InsufficientAcksExceptions at the Master. + So, again, set the override on all available + electable nodes. +

    +
  4. +
+
+

+ Having set the override, the available electable members of the + replication group can now meet quorum requirements. +

+
+
+
+
+
+

Restoring the Default State

+
+
+
+

+ Having restored the group to a functioning state by use of + the ELECTABLE_GROUP_SIZE_OVERRIDE override, it is desirable + to return the group to its normal state as soon as possible. The + normal operating state is one where the Electable Group + Size is maintained by JE HA, and the override is no longer + used. +

+

+ To restore the group to its normal operational state, do + one of the following: +

+
+
    +
  • +

    + Remove from the group any electable nodes that you + know will be down for an extended period of time. + Remove the nodes using the + ReplicationGroupAdmin.removeMember() API. +

    +
  • +
  • +

    + Bring up electable nodes as they once again come on + line, so that they can join the functioning group. + This must be done carefully one node at a time in + order to avoid the small possibility that a majority of the + downed nodes hold an election amongst themselves + and elect a second Master. +

    +
  • +
  • +

    + Perform some combination of node removal and + bringing up nodes which were previously down. +

    +
  • +
+
+

+ As soon as there is a sufficient number of electable nodes + up and running that election quorum requirements can be met in the + absence of the override, the override can be removed, and + normal HA operations resumed. +

+
+
+
+
+
+

Override Example

+
+
+
+

+ Consider a group consisting of 5 electable nodes: + n1-n5. Suppose a + simple majority of the nodes + (n3-n5) have become + unavailable. +

+

+ If one of the nodes in + n3-n5 was the + Master, then nodes n1 and + n2 will try to hold an election, and + fail due to the lack of a quorum. We now carry out the steps described, above: +

+
+
    +
  1. +

    + Verify that n3-n5 are down. +

    +
  2. +
  3. +

    + Set ELECTABLE_GROUP_SIZE_OVERRIDE to 2. Do this + at both n1 and n2. + You can do this dynamically using JConsole, or by + setting the property in the je.properties file and + restarting the node. +

    +
  4. +
  5. +

    + n1 and n2 + will choose a new Master, say, n1. + n1 can now process write + operations, and n2 can + acknowledge transaction commits. +

    +
  6. +
  7. +

    + Suppose that n3 is now repaired. + You can bring it back online and it will + automatically locate the new Master and join the + group. As is normal, it will catch up to + n1 and n2 in + the replication stream, and then begin + acknowledging commits as requested by + n1. +

    +
  8. +
  9. +

    + We now have three electable nodes that are operational. Because + we have a true simple majority of electable nodes available, we + can now reset ELECTABLE_GROUP_SIZE_OVERRIDE to 0 + (do this on n1 and n2), + which causes the replication group to resume normal + operations. Note that n1 remains + the Master. +

    +
  10. +
+
+

+ If n2 was the Master at the time of the + failure, then the situation is similar, except that an + election is not held. In this case, n2 will continue to + remain the Master throughout the entire process described + above. However, n2 might not be able to meet quorum + requirements for transaction commits until step 2 (above) is + performed. +

+
+
+
+ + + diff --git a/docs/ReplicationGuide/enablerep.html b/docs/ReplicationGuide/enablerep.html new file mode 100644 index 0000000..369c87b --- /dev/null +++ b/docs/ReplicationGuide/enablerep.html @@ -0,0 +1,140 @@ + + + + + + Converting Existing Environments for Replication + + + + + + + + + +
+
+
+
+

Converting Existing Environments for Replication

+
+
+
+

+ JE HA environments log files contain information and data + used only by replication. Non-replicated environments are + lacking this information, so in order to use a + previously-existing non-replicated environment in an HA + application, it must undergo a one time conversion. +

+
+

Note

+

+ If you try to open a non-replicated environment as a + replicated environment, the operation will throw an + UnsupportedOperationException. This is the only way your + code can tell if an environment needs to be converted. +

+
+

+ You use the DbEnableReplication class to perform this + one-time conversion. This class is particularly useful if you + want to prototype a standalone transactional application, and + then add in replication after the transactional application is + working as desired. +

+

+ The conversion process is one-way; once an environment + directory is converted, the rules that govern + ReplicatedEnvironment apply. This means the environment can + no longer be opened for writes by a standalone Environment handle + (however, it still can be opened by a standalone + Environment handle in read-only mode). +

+

+ Note that DbEnableReplication only adds a minimum amount of + replication metadata. The conversion process is not in any way + dependent on the size of the environment you are converting. +

+

+ The converted environment can be used to start a new + replication group. After conversion, the environment can be + opened as a ReplicatedEnvironment. Additional nodes that join + the group are then populated with data from the converted + environment. +

+

+ For example: +

+
// Create the first node using an existing environment 
+DbEnableReplication converter = 
+    new DbEnableReplication(envDirMars,          // env home dir
+                            "UniversalRepGroup", // group name
+                            "nodeMars",          // node name
+                            "mars:5001");        // node host,port
+converter.convert();
+
+ReplicatedEnvironment nodeMars =
+           new ReplicatedEnvironment(envDirMars, ...);
+
+// Bring up additional nodes, which will be initialized from 
+// nodeMars.
+ReplicationConfig repConfig = new ReplicationConfig();
+try {
+    repConfig.setGroupName("UniversalRepGroup");
+    repConfig.setNodeName("nodeVenus");
+    repConfig.setNodeHostPort("venus:5008");
+    repConfig.setHelperHosts("mars:5001");
+
+    nodeVenus = new ReplicatedEnvironment(envDirVenus, 
+                                          repConfig, 
+                                          envConfig);
+} catch (InsufficientLogException insufficientLogEx) {
+
+    // log files will be copied from another node in the group
+    NetworkRestore restore = new NetworkRestore();
+    restore.execute(insufficientLogEx, new NetworkRestoreConfig());
+
+    // try opening the node now
+    nodeVenus = new ReplicatedEnvironment(envDirVenus, 
+                                          repConfig,
+                                          envConfig);
+} 
+
+ + + diff --git a/docs/ReplicationGuide/events.html b/docs/ReplicationGuide/events.html new file mode 100644 index 0000000..222edfa --- /dev/null +++ b/docs/ReplicationGuide/events.html @@ -0,0 +1,179 @@ + + + + + + Listening for Events + + + + + + + + + +
+
+
+
+

Listening for Events

+
+
+
+

+ One of the things the Monitor class allows you to do is to + listen for certain events that occur in the composition of the + replication group. Your Monitor can be notified of these events + by running an event listener using Monitor.startListener(). + For example: +

+

+ Monitor.startListener() takes a single + argument, and that is an instance of MonitorChangeListener. + MonitorChangeListener is an interface + that you implement for the purpose of handling replication + group events. +

+

+ There are four events that the change listener can be notified + of. Each of these are represented by a unique class: +

+
+
    +
  1. +

    + GroupChangeEvent +

    +

    + A new instance of this event is generated each time + an electable or monitor node, but not a secondary + node, is added or removed from the replication group. +

    +
  2. +
  3. +

    + NewMasterEvent +

    +

    + A new instance of this event is generated each time a + new Master is elected. +

    +
  4. +
  5. +

    + JoinGroupEvent +

    +

    + A new instance of this event is generated each time an + electable or secondary node, but not a monitor node, + joins a group. The event is generated on a "best + effort" basis. It may not be generated, for example, + if the joining node was unable to communicate with the + monitor due to a network problem. The application must + be resilient in the face of such missing events. +

    +
  6. +
  7. +

    + LeaveGroupEvent +

    +

    + A new instance of this event is generated each time an + electable or secondary node, but not a monitor node, + node leaves the group. The event is generated on a + "best effort" basis. It may not be generated if the + node leaving the group dies (for example, it was + killed) before it has a chance to generate the event, + or if the node was unable to communicate with the + monitor due to a network problem. The application must + be resilient in the face of such missing events. +

    +
  8. +
+
+

+ For example, an implementation of the MonitorChangeListener + interface might be: +

+
class MyChangeListener implements MonitorChangeListener {
+
+   public void notify(NewMasterEvent newMasterEvent) {
+
+    String newNodeName = newMasterEvent.getNodeName();
+
+    InetSocketAddress newMasterAddr = 
+           newMasterEvent.getSocketAddress();
+    String newMasterHostName = newMasterAddr.getHostName();
+    int newMasterPort = newMasterAddr.getPort();
+
+    // Do something with this information here.
+   }
+
+   public void notify(GroupChangeEvent groupChangeEvent) {
+    ReplicationGroup repGroup = groupChangeEvent.getRepGroup();
+
+    // Do something with the new ReplicationGroup composition here.
+   }
+
+   ...
+
+} 
+

+ You can then start the Monitor listener as follows: +

+
 // Initialize the monitor node config
+ReplicationConfig config = 
+       new ReplicationConfig("MyRepGroupName",
+                             "mon1",
+                             "monhost1.acme.com:7000");
+config.setNodeType(NodeType.MONITOR);
+config.setHelperHosts("node1.acme.com:5000,node2.acme.com:5000");
+
+Monitor monitor = new Monitor(config);
+
+// If the monitor has not been registered as a member of the 
+// group, register it now. register() returns the current node 
+// that is the master.
+ReplicationNode currentMaster = monitor.register();
+
+// Start up the listener, so that it can be used to track changes 
+// in the master node, or group composition.
+monitor.startListener(new MyChangeListener()); 
+
+ + + diff --git a/docs/ReplicationGuide/exceptions.html b/docs/ReplicationGuide/exceptions.html new file mode 100644 index 0000000..7024c2c --- /dev/null +++ b/docs/ReplicationGuide/exceptions.html @@ -0,0 +1,318 @@ + + + + + + HA Exceptions + + + + + + + + + +
+
+
+
+

HA Exceptions

+
+
+
+ +

+ JE HA requires you to manage more error situations that you + would have to if you were writing a non-replicated application. + These error situations translate to additional exceptions that + you must contend with in your code. Before continuing with our + description of how to write a replicated application, it is + useful to review the HA-specific exceptions that your + application must manage. +

+
+
+
+
+

Master-Specific HA Exceptions

+
+
+
+

+ There are two exceptions that you can see on a Master node, + and which you will not see anywhere else. They are: +

+
+
    +
  • +

    + InsufficientReplicasException +

    +

    + This exception can be raised on a transaction begin or commit. It means that the + Master cannot successfully commit a transaction, or begin one, because it is not in contact + with enough Electable Replicas. The number of Electable Replicas required to successfully commit + the transaction is a function of the durability policy that + you have set for the transaction. See + Managing Durability + for more information. +

    +

    + If raised on a transaction commit operation, this + exception means that the transaction has not been + committed. Instead, it has been marked as invalid. + In response to this exception, your application + must at a minimum abort the transaction. It is up + to you whether you want to retry the transaction at + some later time when more Replicas are in contact + with the Master. +

    +

    + If raised on a transaction begin operation, this + exception means that the transaction has not begun. + If the application intended to initiate a read-only + transaction on a Master, it can avoid this + exception by ensuring that the transaction is + configured to not require any acknowledgments. For + information on configuring acknowledgments, see + Managing Acknowledgements. +

    +
  • +
  • +

    + InsufficientAcksException +

    +

    + This exception can be raised on a transaction commit. It means that the + Master has successfully committed the transaction locally, but it has not + received enough acknowledgements from its Electable Replicas in the timeframe + allocated for acknowledgements to be received. +

    +

    + The application should respond to this exception in such a way as to alert + the administrator that there might be a problem with the health of the + network or the nodes participating in the replication group. +

    +

    + For information on how to manage acknowledgement policies, see + Managing Acknowledgements. +

    +
  • +
+
+
+
+
+
+
+

Replica-Specific HA Exceptions

+
+
+
+

+ The exceptions that you can see on a Replica, and nowhere else, are: +

+
+
    +
  • +

    + ReplicaConsistencyException +

    +

    + Indicates that the Replica was unable to meet the defined consistency + requirements in the allocated period of time. +

    +

    + If this exception is encountered frequently, it indicates that the + consistency policy requirements are too strict and cannot be met routinely + given the load being placed on the system and the hardware resources that + are available to service the load. The exception may also indicate that + there is a network related issue that is preventing the Replica from + communicating with the Master and keeping up with the replication stream. +

    +

    + In response to this exception, your application can either attempt to retry + the transaction, or you can relax your application's consistency + requirements until the transaction can successfully complete. +

    +

    + For information on managing consistency policies, see + Managing Consistency. +

    +
  • +
  • +

    + ReplicaWriteException +

    +

    + An attempt was made to perform a write operation on a Replica. The exception + typically indicates an error in the application logic. In some extremely + rare cases it could be the result of a transition of the node from Master to + Replica, while a transaction was in progress. +

    +

    + The application must abort the current transaction and redirect all + subsequent update operations to the Master. For + example code that performs this action, see + Example Run Transaction Class. +

    +
  • +
  • +

    + LockPreemptedException +

    +

    + A read lock currently held by a Replica has been preempted by an HA write + operation. The Replica should abort and retry the read operation in response + to this exception. +

    +

    + Note that your application should attempt to catch the + LockConflictException base class rather than this class because all of the + locking exceptions are managed in the same way (abort and retry the + transaction). +

    +
  • +
  • +

    + DatabasePreemptedException +

    +

    + The database handle on a Replica was forcibly closed due to the replay of an + Environment.truncateDatabase(), Environment.removeDatabase() or + Environment.renameDatabase() operation in the + replication stream. +

    +

    + When this exception occurs, the application must close any open Cursors and + abort any open Transactions that are using the database, and then close the + Database handle. If the application wishes, it may reopen the database if it + still exists. +

    +
  • +
  • +

    + RollbackException +

    +

    + A new master has been selected, this Replica's log is ahead of the current + Master, but the Replica was unable to rollback without a + recovery. As a consequence, one or more of the most recently committed + transactions may need to be rolled back, before the Replica can synchronize + its state with that of the current Master. This + exception can happen if the electable Replica with the most + recent log files was unable to participate in the + election of the Master, perhaps because the node + had been shut down. +

    +

    + For details on how to handle this exception, see + Managing Transaction Rollbacks. +

    +
  • +
  • +

    + InsufficientLogException +

    +

    + Indicates that the log files constituting the Environment are insufficient + and cannot be used as the basis for continuing with the replication stream + provided by the current master. +

    +

    + This exception generally means that the node has been down for a long enough + time that it can not be brought up-to-date by the Master. For information on + how to respond to this condition, see + Restoring Log Files. +

    +
  • +
+
+
+
+
+
+
+

Replicated Environment Handle-Specific Exceptions

+
+
+
+

+ In addition to Master- and Replica-specific exceptions, it is possible for a + ReplicatedEnvironment handle to throw an UnknownMasterException. This exception + indicates that the operation being tried requires communication with a Master, but + the Master is not available. +

+

+ This exception typically indicates that there is a problem with your physical + infrastructure. It might mean that an insufficient number of electable nodes are available to + elect a Master, or that the current node is unable to communicate with other nodes + due to, for example, network problems. +

+

+ In response to this exception, your application can try any number of corrective + actions, from immediately retrying the operation, to logging the problem and then + abandoning the operation, to waiting some predetermined period of time before + attempting the operation again. Your application can also + use the Monitor or the StateChangeListener to be + notified when a Master becomes available. For more + information see Writing Monitor Nodes + or Using the StateChangeListener. +

+
+
+ + + diff --git a/docs/ReplicationGuide/gettingStarted.css b/docs/ReplicationGuide/gettingStarted.css new file mode 100644 index 0000000..6a2b24b --- /dev/null +++ b/docs/ReplicationGuide/gettingStarted.css @@ -0,0 +1,50 @@ +body { width: 45em; + margin-left: 3em; + font-family: Arial, Helvetica, sans-serif; + font-size: 11pt; + } + +h2.title { margin-left: -1em; + font-family: Verdana, serif; + font-size: 16pt; + } + +h3.title { font-family: Verdana, serif; + font-size: 14pt; + } + +pre.programlisting { + font-family: monospace; + background-color: #eae8e9; +} + +div.navheader { font-size: 10pt; + width: 60em; + margin-left: -2em; + } + +div.navheader table tr td { font-size: 10pt; } + +div.navfooter { font-size: 10pt; + width: 60em; + margin-left: -2em; + } +div.navfooter table tr td { font-size: 10pt; } + +span.emphasis { font-style: italic;} + +div.appendix div.informaltable { font-size: 9pt; } +div.appendix div.informaltable td { vertical-align: top; } +div.appendix div.informaltable p { margin-top: .25em; } +div.appendix div.informaltable p { margin-bottom: .25em; } + +div.variablelist dl dt {margin-top: 1em; } + +div.libver p { + font-size: 8pt; + width: 30%; + margin-left: 2px; + margin-right: 2px; + padding-top: 3px; + padding-bottom: 3px; + } diff --git a/docs/ReplicationGuide/groupreset.html b/docs/ReplicationGuide/groupreset.html new file mode 100644 index 0000000..813946a --- /dev/null +++ b/docs/ReplicationGuide/groupreset.html @@ -0,0 +1,75 @@ + + + + + + Resetting a Replication Group + + + + + + + + + +
+
+
+
+

Resetting a Replication Group

+
+
+
+

+ Under some circumstances it is useful to reset a group. Resetting + a group means taking a node from an existing group and using it to + form a brand new group of size 1. You can then grow the new group + as normal by adding additional nodes to it. In this way, you can + create an additional group that has the exact same data as the + original group. +

+

+ This functionality is useful when a copy of an existing group needs + to be made for use at some other site. +

+

+ To reset a group, use the DbResetRepGroup utility. +

+
+ + + diff --git a/docs/ReplicationGuide/hotupgrade.html b/docs/ReplicationGuide/hotupgrade.html new file mode 100644 index 0000000..d778d0a --- /dev/null +++ b/docs/ReplicationGuide/hotupgrade.html @@ -0,0 +1,288 @@ + + + + + + Upgrading a JE Replication Group + + + + + + + + + +
+
+
+
+

Upgrading a JE Replication Group

+
+
+
+ +

+ After deploying a BDB JE HA application, you may later want to + upgrade to a new version. Berkeley DB JE supports hot upgrade of a + replication group, by allowing mixed version operation. That is, + replication nodes running the newer software version can + inter-operate with older version nodes and both can be available for + user operations. However, in some cases, there are certain + constraints to performing such a hot upgrade. +

+
+
+
+
+

Upgrade Process

+
+
+
+

+ Each release of Berkeley DB JE is tied to a given log file + on-disk format. Log file formats do not necessarily change + every release. The Change Log for each release specifies + whether the log file format has changed or not. There are + no restrictions on upgrades across releases that use the + same log file format. For best performance and to take + advantage of bug fixes, ensure all nodes in a replication + group run with the same BDB JE version during normal + operations. Occasionally, a new release of Berkeley DB JE + includes a log file format change. The constraints that + apply to upgrades which introduce new log file formats are + explained in this section. +

+

+ In a replication group, the Master transmits log records that + must be read by the replicas. If a group is operating with + mixed version nodes, the Master must be running a version of + JE that is older than, equal to, or (by default) no more + than one version greater than the replicas. This is required + so that the Master can supply the replicas with a version of + the replication stream that they can understand. +

+

+ Note that some releases may support online upgrades with + replicas running versions that are more than one log file + format version different from each other. But any such + additional flexibility will be called out in the release + notes. +

+

+ To support the versioning requirement, make sure to upgrade + all nodes to the version with the next log file format before + upgrading any nodes to a still later log file format. If you + cannot meet this restriction, then a hot upgrade should be + performed. Instead, all nodes in the replication group should + be taken offline and upgraded before any are restarted. +

+

+ The recommended steps for upgrading Berkeley DB JE HA when + log file formats have changed are as follows: +

+
+
    +
  1. +

    + Determine if the upgrade skips any log file format + versions. If it has, and it is not possible to + upgrade to the intermediate versions, then plan to + perform an offline upgrade. +

    +
  2. +
  3. +

    + Bring all Replicas up to date with the Master. That + is, all Replicas must have the same environment + content as the Master. You can ascertain this by + using the DbGroupAdmin.dumpGroup() utility, or + programmatically using the + ReplicaConsistencyPolicy. +

    +
  4. +
  5. +

    + Perform the following upgrade procedures on each of + the environments that are part of the replication + group. +

    +
    +
      +
    • +

      + Shut down the old version of the application. +

      +
    • +
    • +

      + Install the new BDB JE jar file. +

      +
    • +
    • +

      + Restart the application. +

      +
    • +
    +
    +

    + Upgrade each individual data node, both Replicas and + the Master, and restart them to join the replication + group. +

    +
  6. +
+
+
+
+
+
+
+

Things To Remember While Upgrading

+
+
+
+

+ During a hot replication upgrade: +

+
+
    +
  • +

    + Upgrading BDB JE 4.0 directly to BDB JE 5 and higher + versions is prohibited. Upgrade BDB JE 4.0 to BDB JE + 4.1 first, and then upgrade BDB JE 4.1 to higher + versions. There is no constraint if you upgrade from + BDB JE 4.1 or later versions to a higher BDB JE + version. +

    +
  • +
+
+
+
+
+
+
+

Handling Problems While Upgrading

+
+
+
+

+ There are exceptions that you may run into during the upgrade + process. The following exceptions may be thrown when a + replication group node is restarted during the upgrade, and a + ReplicatedEnvironment object is instantiated: +

+
+
    +
  • +

    + RollbackException +

    +

    + This exception can be thrown by a Replica when its log + is ahead of the current Master and the Replica is + unable to rollback without a recovery. As a + consequence, one or more of the most recently committed + transactions may need to be rolled back, before the + Replica can synchronize its state with that of the + current Master. This exception can also be thrown if + the current Master crashes. To solve this exception + restart the ReplicatedEnvironment with the new JE + version. +

    +
  • +
  • +

    + RollbackProhibitedException +

    +

    + During synchronization, a Replica that has a newer log, + may have to roll back a number of committed + tranactions. If the number of rolled back transactions + exceeds the limit defined by TXN_ROLLBACK_LIMIT, the + Replica throws a RollbackProhibitedException. To solve + this exception you may have to truncate logs manually + by using DbTruncateLog and restart the + ReplicatedEnvironment with the new JE version. +

    +
  • +
  • +

    + EnvironmentFailureException +

    +

    + EnvironmentFailureException is thrown due to log + version incompatibility between the Master and the + Replica. This exception is thrown with the message: +

    +

    + "Incompatible log versions. Feeder log version: xxxx, + Feeder JE version: xxxx, Replica log version: xxxx, + Replica JE version: xxxx". +

    +

    + To solve this exception restart the + ReplicatedEnvironment with the new JE version. +

    +
  • +
+
+
+
+ + + diff --git a/docs/ReplicationGuide/index.html b/docs/ReplicationGuide/index.html new file mode 100644 index 0000000..4d36054 --- /dev/null +++ b/docs/ReplicationGuide/index.html @@ -0,0 +1,679 @@ + + + + + + Getting Started with Berkeley DB, Java Edition High Availability Applications + + + + + + + +
+
+
+
+

Getting Started with Berkeley DB, Java Edition High Availability Applications

+
+
+
+ +

+ Legal Notice +

+

+ Copyright © 2002 - 2017 Oracle and/or its affiliates. All rights + reserved. +

+

+ This software and related documentation are provided under a + license agreement containing restrictions on use and disclosure + and are protected by intellectual property laws. Except as + expressly permitted in your license agreement or allowed by + law, you may not use, copy, reproduce, translate, broadcast, + modify, license, transmit, distribute, exhibit, perform, + publish, or display any part, in any form, or by any means. + Reverse engineering, disassembly, or decompilation of this + software, unless required by law for interoperability, is + prohibited. +

+

+ The information contained herein is subject to change without + notice and is not warranted to be error-free. If you find any + errors, please report them to us in writing. +

+

+ Berkeley DB, + + Berkeley DB Java Edition + and + Sleepycat are trademarks or registered trademarks of + Oracle. All rights to these marks are reserved. + No third-party use is permitted without the + express prior written consent of Oracle. +

+

+ Other names may be trademarks of their respective owners. +

+

+ If this is software or related documentation that is delivered + to the U.S. Government or anyone licensing it on behalf of the + U.S. Government, the following notice is applicable: +

+

+ U.S. GOVERNMENT END USERS: Oracle programs, including any + operating system, integrated software, any programs installed + on the hardware, and/or documentation, delivered to U.S. + Government end users are "commercial computer software" + pursuant to the applicable Federal Acquisition Regulation and + agency-specific supplemental regulations. As such, use, + duplication, disclosure, modification, and adaptation of the + programs, including any operating system, integrated software, + any programs installed on the hardware, and/or documentation, + shall be subject to license terms and license restrictions + applicable to the programs. No other rights are granted to the + U.S. Government. +

+

+ This software or hardware is developed for general use in a + variety of information management applications. It is not + developed or intended for use in any inherently dangerous + applications, including applications that may create a risk of + personal injury. If you use this software or hardware in + dangerous applications, then you shall be responsible to take + all appropriate fail-safe, backup, redundancy, and other + measures to ensure its safe use. Oracle Corporation and its + affiliates disclaim any liability for any damages caused by use + of this software or hardware in dangerous applications. +

+

+ Oracle and Java are registered trademarks of Oracle and/or its + affiliates. Other names may be trademarks of their respective + owners. +

+

+ Intel and Intel Xeon are trademarks or registered trademarks of + Intel Corporation. All SPARC trademarks are used under license + and are trademarks or registered trademarks of SPARC + International, Inc. AMD, Opteron, the AMD logo, and the AMD + Opteron logo are trademarks or registered trademarks of + Advanced Micro Devices. UNIX is a registered trademark of The + Open Group. +

+

+ This software or hardware and documentation may provide access + to or information on content, products, and services from third + parties. Oracle Corporation and its affiliates are not + responsible for and expressly disclaim all warranties of any + kind with respect to third-party content, products, and + services. Oracle Corporation and its affiliates will not be + responsible for any loss, costs, or damages incurred due to + your access to or use of third-party content, products, or + services. +

+
+
+
+

31-Oct-2017

+
+
+
+
+
+

+ Table of Contents +

+
+
+ + Preface + +
+
+
+
+ + Conventions Used in this Book + +
+
+
+
+ + For More Information + +
+
+ + Contact Us + +
+
+
+
+
+
+ + 1. Introduction + +
+
+
+
+ + Overview + +
+
+
+
+ + Replication Group Members + +
+
+ + Replicated Environments + +
+
+ + Selecting a Master + +
+
+ + Replication Streams + +
+
+
+
+ + Managing Data Guarantees + +
+
+
+
+ + Durability + +
+
+ + Managing Data Consistency + +
+
+
+
+ + Replication Group Life Cycle + +
+
+
+
+ + Terminology + +
+
+ + Node States + +
+
+ + New Replication Group Startup + +
+
+ + Subsequent Startups + +
+
+ + Replica Startup + +
+
+ + Master Failover + +
+
+ + Two Node Groups + +
+
+
+
+
+
+ + 2. Replication API First Steps + +
+
+
+
+ + Using Replicated Environments + +
+
+
+
+ + Configuring Replicated Environments + +
+
+
+
+ + HA Exceptions + +
+
+
+
+ + Master-Specific HA Exceptions + +
+
+ + Replica-Specific HA Exceptions + +
+
+ + Replicated Environment Handle-Specific Exceptions + +
+
+
+
+ + Opening a Replicated Environment + +
+
+ + Managing Write Requests at a Replica + +
+
+
+
+ + Using the StateChangeListener + +
+
+ + Catching ReplicaWriteException + +
+
+
+
+ + Secondary Nodes + +
+
+ + Time Synchronization + +
+
+ + Configuring Two-Node Groups + +
+
+
+
+ + 3. Transaction Management + +
+
+
+
+ + Managing Durability + +
+
+
+
+ + Durability Controls + +
+
+ + Commit File Synchronization + +
+
+ + Managing Acknowledgements + +
+
+
+
+ + Managing Consistency + +
+
+
+
+ + Setting Consistency Policies + +
+
+ + Time Consistency Policies + +
+
+ + Commit Point Consistency Policies + +
+
+
+
+ + Availability + +
+
+
+
+ + Write Availability + +
+
+ + Read Availability + +
+
+
+
+ + Consistency and Durability Use Cases + +
+
+
+
+ + Out on the Town + +
+
+ + Bio Labs, Inc + +
+
+
+
+ + Managing Transaction Rollbacks + +
+
+ + Example Run Transaction Class + +
+
+
+
+ + RunTransaction Class + +
+
+ + Using RunTransaction + +
+
+
+
+
+
+ + 4. Utilities + +
+
+
+
+ + Administering the Replication Group + +
+
+
+
+ + Listing Group Members + +
+
+ + Locating the Current Master + +
+
+ + Adding and Removing Nodes from the Group + +
+
+
+
+ + Restoring Log Files + +
+
+
+
+ + Reclaiming Log Files + +
+
+ + Suspending Writes Due to Disk Thresholds + +
+
+
+
+ + Backing up a Replicated Application + +
+
+ + Converting Existing Environments for Replication + +
+
+
+
+ + 5. Writing Monitor Nodes + +
+
+
+
+ + Monitor Class + +
+
+ + Listening for Events + +
+
+
+
+ + 6. Replication Examples + +
+
+ + 7. Administration + +
+
+
+
+ + Hardware + +
+
+ + Time Synchronization + +
+
+ + Node Configuration + +
+
+ + Running Backups + +
+
+ + Adding and Removing Nodes + +
+
+ + Upgrading a JE Replication Group + +
+
+
+
+ + Upgrade Process + +
+
+ + Things To Remember While Upgrading + +
+
+ + Handling Problems While Upgrading + +
+
+
+
+ + Resetting a Replication Group + +
+
+
+
+ + A. Managing a Failure of the Majority + +
+
+
+
+ + Overriding the Electable Group Size + +
+
+
+
+ + Setting the Override + +
+
+ + Restoring the Default State + +
+
+ + Override Example + +
+
+
+
+
+
+
+
+ + + diff --git a/docs/ReplicationGuide/introduction.html b/docs/ReplicationGuide/introduction.html new file mode 100644 index 0000000..6beb90b --- /dev/null +++ b/docs/ReplicationGuide/introduction.html @@ -0,0 +1,587 @@ + + + + + + Chapter 1. Introduction + + + + + + + + + +
+
+
+
+

Chapter 1. Introduction

+
+
+
+
+

+ Table of Contents +

+
+
+ + Overview + +
+
+
+
+ + Replication Group Members + +
+
+ + Replicated Environments + +
+
+ + Selecting a Master + +
+
+ + Replication Streams + +
+
+
+
+ + Managing Data Guarantees + +
+
+
+
+ + Durability + +
+
+ + Managing Data Consistency + +
+
+
+
+ + Replication Group Life Cycle + +
+
+
+
+ + Terminology + +
+
+ + Node States + +
+
+ + New Replication Group Startup + +
+
+ + Subsequent Startups + +
+
+ + Replica Startup + +
+
+ + Master Failover + +
+
+ + Two Node Groups + +
+
+
+
+
+

+ This book provides a thorough introduction to + replication as used with Berkeley DB, Java Edition (JE). It begins by offering a + general overview to replication and the benefits it provides. It also + describes the APIs that you use to implement replication, and it + describes architecturally the things that you need to do to your + application code in order to use the replication APIs. +

+

+ You should understand the concepts from the Berkeley DB, Java Edition Getting Started with Transaction Processing + guide before reading this book. +

+
+
+
+
+

Overview

+
+
+
+ +

+ Welcome to the JE High Availability (HA) product. JE HA + is a replicated, single-master, embedded database engine based + on Berkeley DB, Java Edition. JE HA offers important improvements in + application availability, as well as offering improved read + scalability and performance. JE HA does this by extending + the data guarantees offered by a traditional transactional + system to processes running on multiple physical hosts. +

+

+ The JE replication APIs allow you to distribute your + database contents (performed on a read-write Master) to one or + more read-only Replicas. + For this reason, JE's replication implementation is said to be a + single master, multiple replica replication strategy. +

+

+ Replication offers your application a number of benefits that + can be a tremendous help. Primarily, replication's benefits + revolve around performance, but there is also a benefit in + terms of data durability guarantees. +

+

+ Briefly, some of the reasons why you might choose to implement + replication in your JE application are: +

+
+
    +
  • +

    + Improved application availability. +

    +

    + By spreading your data across multiple + machines, you can ensure that your + application's data continues to be + available even in the event of a + hardware failure on any given machine in + the replication group. +

    +
  • +
  • +

    + Improve read performance. +

    +

    + By using replication you can spread data reads across + multiple machines on your network. Doing so allows you + to vastly improve your application's read performance. + This strategy might be particularly interesting for + applications that have readers on remote network nodes; + you can push your data to the network's edges thereby + improving application data read responsiveness. +

    +
  • +
  • +

    + Improve transactional commit performance +

    +

    + In order to commit a transaction and achieve a + transactional durability guarantee, the commit must be + made durable. That is, the commit + must be written to disk (usually, but not always, + synchronously) before the application's thread of + control can continue operations. +

    +

    + Replication allows you to batch disk I/O so that it is + performed as efficiently as possible while still + maintaining a degree of durability by committing + to the network. In other words, you relax + your transactional durability guarantees on the machine + where you perform the database write, + but by virtue of replicating the data across the + network you gain some additional durability guarantees + beyond what is provided locally. +

    +
  • +
  • +

    + Improve data durability guarantee. +

    +

    + In a traditional transactional application, you commit your + transactions such that data modifications are saved to + disk. Beyond this, the durability of your data is + dependent upon the backup strategy that you choose to + implement for your site. +

    +

    + Replication allows you to increase this durability + guarantee by ensuring that data modifications are + written to multiple machines. This means that multiple + disks, disk controllers, power supplies, and CPUs are + used to ensure that your data modification makes it to + stable storage. In other words, replication allows you + to minimize the problem of a single point of failure + by using more hardware to guarantee your data writes. +

    +

    + If you are using replication for this reason, then you + probably will want to configure your application such + that it waits to hear about a successful commit from + one or more replicas before continuing with the next + operation. This will obviously impact your + application's write performance to some degree + — with the performance penalty being largely dependent + upon the speed and stability of the network connecting + your replication group. +

    +
  • +
+
+
+
+
+
+

Replication Group Members

+
+
+
+

+ Processes that take part in a JE HA application are + generically called nodes. Most nodes + serve as a read-only Replica. One node in the HA + application can perform database writes. This is the Master node. +

+

+ The sum totality of all the nodes taking part in the + replicated application is called the replication + group. While it is only a logical entity + (there is no object that you instantiate and destroy which + represents the replication group), the replication group is + the first-order element of management for a replicated HA + application. It is very important to remember that the + replication group is persistent in that it exists + regardless of whether its member nodes are currently + running. In fact, nodes that have been added to a replication + group (with the exception of Secondary nodes) will remain in + the group until they are manually removed from the group by + you or your application's administrator. +

+

+ Replication groups consist of electable nodes and, + optionally, Monitor and Secondary nodes. +

+

+ Electable nodes are replication group + members that can be elected to become the group's Master node + through a replication election. Electable + nodes are also the group members that vote in these elections. + If an electable node is not a Master, then it serves in the + replication group as a read-only Replica. Electable nodes have + access to a JE environment, and are persistent members of + the replication group. Electable nodes that are Replicas also + participate in transaction durability decisions by providing the + master with acknowledgments of transaction commits. +

+
+

Note

+

+ Beyond Master and Replica, a node can also be in + several other states. See + Replication Group Life Cycle + for more information. +

+
+

+ Most of the nodes in a replication group are electable + nodes, but it is possible to have nodes of the other types + as well. +

+

+ Secondary nodes also have access to a + JE environment, but can only serve as read-only replicas, + not masters, and do not participate in elections. Secondary + nodes can be used to provide read-only data access from + locations with higher latency network connections to the rest + of the replication group without introducing communication + delays into elections. Secondary nodes are not persistent + members of the replication group; they are only considered + members when they are connected to the current master. + Secondary nodes do not participate in transaction durability + decisions. +

+

+ Monitor nodes do not have access to a + JE environment and do not participate in elections. For + this reason, they cannot serve as either a Master or a + Replica. Instead, they merely monitor the composition of the + replication group as changes are made by adding and removing + electable nodes, joining and leaving of electable and + secondary nodes, and as elections are held to select a new + Master. Monitor nodes are therefore used by applications + external to the JE replicated application to route data + requests to the various members of the replication + group. Monitor nodes are persistent members of the + replication group. Monitor nodes do not participate in + transaction durability decisions. +

+

+ Note that all nodes in a replication group have a unique + group-wide name. Further, all replication groups are also + assigned a unique name. This is necessary because it is + possible for a single process to have access to multiple + replication groups. Further, any given collection of + hardware can be running multiple replication groups (a + production and a test group, for example.) By uniquely + identifying the replication group with a unique name, it is + possible for JE HA to internally check that nodes have + not been misconfigured and so make sure that messages are + being routed to the correct location. +

+
+
+
+
+
+

Replicated Environments

+
+
+
+

+ All electable and secondary nodes must have access to a + database environment. Further, no node can share a database + environment with another node. +

+

+ More to the point, in order to create an electable or + secondary node in a replication group, you use a + specialized form of the environment handle: + ReplicatedEnvironment. +

+

+ There is no JE-specified limit to the number of + environments which can join a replication group. + The only limitation here is one of resources — + network bandwidth, for example. +

+

+ We discuss ReplicatedEnvironment handle usage in + Using Replicated Environments. + For an introduction to database environments, see the + Getting Started with Berkeley DB, Java Edition guide. +

+
+
+
+
+
+

Selecting a Master

+
+
+
+

+ Every replication group is allowed one and only one + Master. Masters are selected by + holding an election. All such + elections are performed by the underlying Berkeley DB, Java Edition + replication code. +

+

+ When a node joins a replication group, it attempts to + locate the Master. If it is the first electable node added + to the replication group, then it automatically becomes + the Master. If it is an electable node, but is not the + first to startup in the replication group and it cannot + locate the Master, it calls for an election. Further, if + at any time the Master becomes unavailable to the + replication group, the electable replicas will call for an + election. +

+

+ When holding an election, election participants vote on + who should be the Master. Among the electable nodes + participating in the election, the node with the most + up-to-date set of logs will win the election. In order + to win an election, a node must win a simple majority + of the votes. +

+

+ Usually JE requires a majority of electable nodes to be + available to hold an election. If a simple majority is + not available, then the replication group will no + longer be able to accept write requests as there will + be no Master. +

+

+ Note that an electable node is part of the replication + group even if it is currently not running or is + otherwise unreachable by the rest of the replication + group. Membership of electable nodes in the replication + group is persistent; once an electable node joins the + group, it remains in the group regardless of its current + state. The only way an electable node leaves a + replication group is if you manually remove it from the + group (see + Adding and Removing Nodes from the Group + for details). This is a very important point to remember + when considering elections. An election cannot be held + if the majority of electable nodes in the group are not + running or are otherwise unreachable. +

+
+

Note

+

+ There are two circumstances under which a majority + of electable nodes need not be available in order + to hold an election. The first is for the special + circumstance of the two-node group. See Configuring Two-Node Groups for + details. +

+

+ The second circumstance is if you explicitly relax + the requirement for a majority of electable nodes to + be available in order to hold an election. This is a + dangerous thing to do, and your replication group + should rarely (if ever) be configured this way. See + Managing a Failure of the Majority + for more information. +

+
+

+ Once a node has been elected Master, it remains in that + role until the replication group has a reason to hold + another election. Currently, the only reason why the group + will try to elect a new Master is if the current Master + becomes unavailable to the group. This can happen + because you shutdown the current Master, the current Master + crashes due to bugs in your application code, or a network + outage causes the current Master to be unreachable by a + majority of the electable nodes in your replication group. +

+

+ In the event of a tie in the number of votes, JE's + underlying implementation of the election code will + pick the Master. Moreover, the election code will + always make a consistent choice when settling a tie. + That is, all things being even, the same node will + always be picked to win a tied election. +

+
+
+
+
+
+

Replication Streams

+
+
+
+

+ Write transactions can only be performed at the Master. + The results of these transactions are replicated to + Replicas using a logical replication stream. +

+

+ Logical replication streams are performed over a TCP/IP + connection. The stream contains a description of the + logical changes (for example, insert, update or delete) + operations that were performed on the database as a result + of the transaction commit. Each such replicated change is + assigned a group-wide unique identifier called a Virtual + Log Sequence Number (VLSN). The VLSN can be used to locate + the replicated change in the log files associated with any + member of the group. Through the use of the VLSN, each + operation described by the replication stream can be + replayed at each Replica using an efficient internal replay + mechanism. +

+

+ A consequence of this logical replaying of a transaction is + that physical characteristics of the log files contained at + the Replicas can be different across the replication group. + The data contents of the environments found across the replication + group, however, should be identical. +

+

+ Note that there is a process by which a non-replicated + environment can be converted such that it has the log + structure and metadata required for replication. See + Converting Existing Environments for Replication + for more information. +

+
+
+
+ + + diff --git a/docs/ReplicationGuide/lifecycle.html b/docs/ReplicationGuide/lifecycle.html new file mode 100644 index 0000000..381bbac --- /dev/null +++ b/docs/ReplicationGuide/lifecycle.html @@ -0,0 +1,622 @@ + + + + + + Replication Group Life Cycle + + + + + + + + + +
+
+
+
+

Replication Group Life Cycle

+
+
+
+
+
+
+ + Terminology + +
+
+ + Node States + +
+
+ + New Replication Group Startup + +
+
+ + Subsequent Startups + +
+
+ + Replica Startup + +
+
+ + Master Failover + +
+
+ + Two Node Groups + +
+
+
+

+ This section describes how your replication group behaves + over the course of the application's lifetime. Startup is + described, both for new nodes as well as for existing nodes + that are restarting. This section also describes Master + failover. +

+
+
+
+
+

Terminology

+
+
+
+

+ Before continuing, it is necessary to define some terms + used in this document as they relate to + node membership in a replication group. +

+
+
    +
  • +

    + Add/Remove +

    +

    + When we say that a node has been persistently + added to a replication group, + this means that it has become a persistent member of + the group. Regardless of whether the node is running + or otherwise reachable by the group, once it has been + added to the group it remains a member of the group. + If the added node is an electable node, the group size + used during elections, or transaction commit + acknowledgements, is increased by one. Note that + secondary nodes are not persistent members of the + replication group, so they are not considered to be + persistently added or removed. +

    +

    + A node that has been persistently added to a + replication group remains a member of that group + until it is explicitly removed + from the group. Once a node has been removed from + the group, it is no longer a member of the group. If + the node that was removed was an electable node, the + group size used during elections, or transaction + commit acknowledgements, is decreased by one. +

    +
  • +
  • +

    + Join/Leave +

    +

    + We say that a member has joined the + replication group when it starts up and begins + operating in the group as an active node. + Electable and secondary nodes join a replication + group by successfully opening a + ReplicatedEnvironment handle. Monitor nodes are + not considered to join a replication group because + they do not actively participate in replication or + elections. +

    +

    + A member, then, leaves a + replication group by shutting down, or losing the + network contact that allows it to operate as an + active member of the group. When operating + normally, member nodes leave a replication group by + closing their last ReplicatedEnvironment handle. +

    +

    + Joining or leaving a group does not change the + electable group size, and so the number of nodes + required to hold an election, as well as the + number of nodes required to acknowledge + transaction commits, does not change. +

    +
  • +
+
+
+
+
+
+
+

Node States

+
+
+
+

+ Member nodes can be in the following states: +

+
+
    +
  • +

    + Master +

    +

    + When in the Master state, a member node can service read and + write requests. At any given time, there can be only one node in the + Master state in the replication group. +

    +
  • +
  • +

    + Replica +

    +

    + Member nodes in the Replica state can only service + read requests. All of the electable nodes other + than the Master, and all of the secondary nodes, + should be in the Replica state. +

    +
  • +
  • +

    + Unknown +

    +

    + The member node is not aware of a Master and is actively + trying to discover or elect a Master. A node in this + state is constantly striving to transition to the + more productive Master or Replica state. +

    +

    + A node in the Unknown state can still process read + transactions if the node can satisfy its transaction + consistency requirements. +

    +
  • +
  • +

    + Detached +

    +

    + The member node has been shutdown (that is, it has + left the group, but it has not been removed from the + group — see the previous section). It is still + a member of the replication group, but is not active + in elections or replicating data. Note that + secondary nodes do not remain members when they are + in the detached state; when they lose contact with + the Master, they are no longer considered members of + the group. +

    +
  • +
+
+

+ Note that from time to time this documentation uses the + term active node. An active node is a + member node that is in the Master, Replica or Unknown + state. More to the point, an active node is a node that is + available to participate in elections — if it is an + electable node — and in data replication. Monitor + nodes are not considered active and do not report their + state. +

+
+
+
+
+
+

New Replication Group Startup

+
+
+
+

+ The first time you start up a replication group using an + electable node, the group + exists (for at least a small time) as a group of size one. At + this time, the single node belonging to the group becomes the + Master. So long as there is only one electable node in the + replication group, that one node behaves as if it is a + non-replicated application. There are some differences in the + format of the log file that the application maintains, but it + otherwise behaves identically to a non-replicated transactional + application. +

+

+ Subsequently, upon startup a new node must be given the contact + information for at least one currently active node in the + replication group in order for it to be added to the + group. The new node contacts this active node + who will identify the Master for the new node. +

+
+

Note

+

+ As is the case with elections, an electable node cannot + be added to the replication group unless a simple + majority of electable nodes are active at the time that + it starts up. If too many nodes are down or otherwise + unavailable, you cannot add a new electable node to the + group. +

+
+

+ The new node then contacts the Master, and provides all + necessary identification information about itself to the + Master. This includes host and port information, the + node's unique name, and the replication group name. For + electable nodes, the Master stores this identifying + information about the node persistently, meaning the + effective number of electable members of the replication + group has just grown by one. For secondary nodes, the + information about the node is only maintained while the + secondary node is active; the number of electable + members does not change. +

+
+

Note

+

+ Note that the new electable node is now a permanent member + of the replication group until you manually remove + it. This is true even if you shutdown the node for a long + time. See Adding and Removing Nodes from the Group for details. +

+
+

+ Once the new node is an established member of the group, the + Master provides the Replica with the logical logs needed to + replicate the environment. The sequence of logical log + records sent from the Master to the Replica constitutes the + Replication Stream. At this time, the + node is said to have joined the group. + Once a replication stream is established, it is maintained until either the + Replica or the Master goes down. +

+
+
+
+
+
+

Subsequent Startups

+
+
+
+

+ Each node stores information about + other persistent replication group members in its replicated + environment so that this information is available to it + upon restart. +

+

+ When a node that is already an established + member of a replication group is restarted, the node uses its + knowledge of other members of the replication group to + locate the Master. It does this by by querying the + members of the group to locate the current Master. If it + finds a Master, the node joins the group and proceeds to operate in the + group as a Replica. +

+

+ If a Master is not available and the restarting node is an + electable node, the node initiates an election so as to + establish a Master. If a simple majority of electable + nodes are available for the election, a Master is + elected. If the restarting node is elected Master, it then + waits for Replicas to connect to it so that it can supply + them a replication stream. If the restarting node is a + secondary node, then it continues to try to find the + Master, waiting for the electable nodes to elect a Master + as needed. +

+

+ Under ordinary circumstances, if a Master cannot be + determined for some reason, the restarting node will fail to + open. However, you can permit the node to instead open + in the UNKOWN state. While in this state, the node is + persistently attempting to find a Master, but it is also + available for read-only requests. +

+

+ To configure a node in this way, use the + ReplicationConfig.setConfigParam() method to set the + ReplicationConfig.ENV_UNKNOWN_STATE_TIMEOUT parameter. + This parameter requires you to define a Master election + timeout period. If this election timeout expires while + the node is attempting to restart, then the node opens in + the UNKNOWN state instead of failing its open operation + entirely. +

+
+
+
+
+
+

Replica Startup

+
+
+
+

+ Regardless of how it happens, when a node joins + a replication group, it contacts the + Master and then goes through the following three steps: +

+
+
    +
  1. +

    + Handshake +

    +

    + The Replica sends the Master its configuration + information, along with the unique name + associated with the Replica's environment. This + name is a pseudo-randomly generated Universal + Unique Identifier (UUID). +

    +

    + This handshake establishes the node as a valid + member of the group. It is used both by new nodes + joining the group for the first time, and by + existing nodes that are simply restarting. +

    +

    + In addition, during this handshake process, the + Master and Replica nodes will compare their + clocks. If the clocks are too far off from one + another, the handshake will fail and the Replica + node will fail to start up. See + Time Synchronization + for more information. +

    +
  2. +
  3. +

    + Replication Stream Sync-Up +

    +

    + The Replica sends the Master its current position + in the replication stream sequence. The Master + and Replica then negotiate a point in the + replication stream that the Master can use as a + starting point to resume the flow of logical + records to the Replica. +

    +

    + Note that normally this sync-up process will be + transparent to your application. However, in rare + cases the sync-up may require that committed + transactions be undone. +

    +

    + Also, if the Replica has been offline for a long + time, it is possible that the Master can no + longer supply the Replica with the required contiguous + interval of the replication stream. (This can + happen due to log cleaning on the Master.) In + this case, the log files must be copied to the + restarting node from some other up-to-date node + in the replication group. See + Restoring Log Files + for details. +

    +
  4. +
  5. +

    + Steady state replication stream flow +

    +

    + Once the Replica has successfully started up and + joined the group, the + Master maintains a flow of log records to the + Replica. Beyond that, the Master will request + acknowledgements from electable Replicas whenever the + Master needs to meet transaction commit + durability requirements. +

    +
  6. +
+
+
+
+
+
+
+

Master Failover

+
+
+
+

+ A Master failing or shutting down causes all of the replication streams + between the Master and its various Replicas to terminate. + In reaction, the Replicas transition to the Unknown state + and the electable nodes initiate an election. +

+

+ An election can be held if at least a simple majority of + the replication group's electable nodes are active. The + electable node + that wins the election transitions to the Master state, + and all other active nodes transition to the Replica + state. +

+

+ Upon transitioning to the Replica state, nodes connect to + the new Master and proceed through the handshake, + sync-up, replication replay process described in the + previous section. +

+

+ If no Master can be elected (because a majority of electable nodes + are not available to participate in the election), then + the nodes remain in the Unknown state until such a time + as a Master can be elected. In this state, the nodes + might be able to service read-only requests, but the + replication group is incapable of servicing write + requests. Read requests can be serviced so long as the + transaction's consistency requirements can be met (see + Managing Consistency). +

+

+ Note that the JE Replication application needs to make + provisions for the following state transitions after + failover: +

+
+
    +
  • +

    + A node that transitions from the Replica state to + the Master state as a result of a failover needs + to start accepting update requests. There are + several ways to determine whether a node can + handle update requests. See + Managing Write Requests at a Replica + for more information. +

    +
  • +
  • +

    + If a node remains in the Replica state after a + failover, the failover should be transparent to + the application. However, an application may need + to take corrective action in the rare situation + where the sync-up process has to roll back + committed transactions. +

    +

    + See Managing Transaction Rollbacks + for an example of how handle a transaction commit roll back. +

    +
  • +
+
+
+
+
+
+
+

Two Node Groups

+
+
+
+

+ Replication groups comprised of just two electable nodes + represents a unique corner case for JE replication. In + order to elect a master, usually a simple majority of + electable nodes must be available to participate in an + election. However, for replication groups of size two, if + even one electable node is unavailable for the election then + by default it is impossible to hold an election. +

+

+ However, for some classes of application, it is desirable + for the application to proceed with operations using just + one electable node. That is, the application trades off the + durability guarantees offered by using two electable nodes + for the higher availability permissible by allowing the + application to run with just one of the nodes. +

+

+ JE allows you to do this by designating one of the nodes + in a two electable node group as a primary + node. When the non-primary node of the pair is + not available, the number of nodes required for a simple + majority is reduced from two to one by the primary + node. Consequently, the primary node is able to elect itself + as the Master. It can then commit transactions that require + a simple majority to acknowledge commits. When the + non-primary node becomes available again, the number of + nodes required for a simple majority at the primary once + again reverts to two. +

+

+ At any given time, there must be either zero or one + electable nodes designated as the primary node, but it is up + to your application to make sure both nodes are not + erroneously designated as the primary. Your application must + be very careful not to mistakenly designate two nodes as the + primary. If this happened, and the two nodes could not + communicate with one another (due to a network malfunction + of some kind, for example), they could both then consider + themselves to be Masters and start accepting write + requests. This violates a fundamental requirement that at + any given instant in time, there should be exactly one node + that is permitted to perform writes on the replicated + environment. +

+

+ Note that the non-primary electable node always needs two + electable nodes for a simple majority, so it can never + become the Master in the absence of the primary node. If the + primary node fails, you can make provisions to swap the + primary and non-primary designations so that the surviving + node is now the primary. This swap must be performed + carefully so as to ensure that both nodes are not + concurrently designated the primary. The most important + thing is that the failed node comes up as the non-primary + after it has been repaired. +

+

+ For more information on using two-node groups, see + Configuring Two-Node Groups. +

+
+
+ + + diff --git a/docs/ReplicationGuide/logfile-restore.html b/docs/ReplicationGuide/logfile-restore.html new file mode 100644 index 0000000..e582fe3 --- /dev/null +++ b/docs/ReplicationGuide/logfile-restore.html @@ -0,0 +1,210 @@ + + + + + + Restoring Log Files + + + + + + + + + +
+
+
+
+

Restoring Log Files

+
+
+
+ +

+ During normal operations, the nodes in a replication group + communicate with one another to ensure that the JE cleaner + does not reclaim log files still needed by the group. The tail + end of the replication stream may still be needed by a lagging + Replica in order to make it current with the Master, and so the + replication group tries to make sure the trailing log files needed to + bring lagging Replicas up-to-date are not reclaimed. +

+

+ However, if a node is unavailable for a long enough period + of time, then log files needed to bring it up to date might + have been reclaimed by the cleaner. + For information on how and when log files are reclaimed in + a replicated environment, see + Reclaiming Log Files. +

+

+ Once log files have been reclaimed by a cleaner, then the + Replica can no longer be brought up to date using the normal + replication stream. Your application code will know this has + happened when the ReplicatedEnvironment constructor throws + an InsufficientLogException. +

+

+ When your code catches an InsufficientLogException, then you + must bring the Replica up-to-date using a mechanism other than + the normal replication stream. You do this using the + NetworkRestore class. A call to NetworkRestore.execute() + causes the Replica to copy the missing log files from a member + of the replication group who owns the files and seems to be the + least busy. Once the Replica has obtained the log files that it + requires, it automatically re-establishes its replication stream + with the Master so that the Master can finish bringing the + Replica up-to-date. +

+

+ For example: +

+
 ...
+  try {
+     node = new ReplicatedEnvironment(envDir, repConfig, envConfig);
+ } catch (InsufficientLogException insufficientLogEx) {
+
+     NetworkRestore restore = new NetworkRestore();
+     NetworkRestoreConfig config = new NetworkRestoreConfig();
+     config.setRetainLogFiles(false); // delete obsolete log files.
+
+     // Use the members returned by insufficientLogEx.getLogProviders() 
+     // to select the desired subset of members and pass the resulting 
+     // list as the argument to config.setLogProviders(), if the 
+     // default selection of providers is not suitable.
+
+     restore.execute(insufficientLogEx, config);
+
+     // retry
+     node = new ReplicatedEnvironment(envDir, repConfig, envConfig);
+ } ...  
+

+ Note that the replication group does not maintain information + about the log files needed by secondary nodes. Instead, the + system retains a set of log files beyond those required for a + network restore based on the NETWORK_RESTORE_OVERHEAD property, + which you can manage using ReplicationConfig.setConfigParam(). + The default value is 10, which means that the system uses the + estimate of 10 percent for the additional amount of data that + performing a network restore needs to send over the network as + compared to using the same log files to perform replication. In + this case, the system saves files containing an additional 10 + percent of log data beyond the amount needed for a network + restore. +

+
+
+
+
+

Reclaiming Log Files

+
+
+
+

+ Ordinarily JE's cleaner thread reclaims log files as soon as possible + so as to minimize the amount of disk space used by the database. Log files + are reclaimed as records are deleted, and log files are subsequently compacted. +

+

+ However, various database activities might cause log files + to be temporarily reserved or protected temporarily. A + reserved file is a file that JE + can delete but has yet done so. A + protected file is a file that should + be deleted, but JE cannot do so due to some database + activity, such as a backup. +

+

+ For replicated environments, JE hangs on to log files as long + as possible in case they are needed to bring a replica up to date. Log + files that have been cleaned but then saved due because of replication + are in a reserved state. All such files are + retained until the disk usage thresholds as defined by EnvironmentConfig.MAX_DISK + and EnvironmentConfig.FREE_DISK are exceeded. At that point, JE deletes reserved + log files. +

+
+
+
+
+
+

Suspending Writes Due to Disk Thresholds

+
+
+
+

+ In the previous section, we mentioned that JE reserves + cleaned log files until disk threshold limits are encountered, + at which time log files are reclaimed (deleted). +

+

+ Be aware that if reclaiming log files does not allow JE + to meet its disk usage threshold limits, then writes are + disabled for one or more nodes in the replication group. +

+

+ If the threshold limits cannot be met on the Master, then + write operations will throw DiskLimitException just as + they would for a non-replicated environment. +

+

+ If the threshold limit cannot be met on a replica, then + writes are disabled only on that replica. In this case, the + Master might see InsufficientAcksException thrown in + response to a write — if your application's + durability guarantee cannot be met due to the replica being + unable to perform writes. +

+
+
+ + + diff --git a/docs/ReplicationGuide/monitors.html b/docs/ReplicationGuide/monitors.html new file mode 100644 index 0000000..4b57467 --- /dev/null +++ b/docs/ReplicationGuide/monitors.html @@ -0,0 +1,164 @@ + + + + + + Chapter 5. Writing Monitor Nodes + + + + + + + + + +
+
+
+
+

Chapter 5. Writing Monitor Nodes

+
+
+
+
+

+ Table of Contents +

+
+
+ + Monitor Class + +
+
+ + Listening for Events + +
+
+
+

+ So far in this book we have mostly discussed electable and + secondary nodes, which are by definition nodes that have access + to a JE ReplicatedEnvironment. However, replication groups + can include any number of nodes that have no access to the JE + replicated environment in use by the replication group. +

+

+ These type of nodes without environments are called + monitor nodes. The point of a monitor node + is to allow a process to have some understanding of the + replication group's structure such as which node is the Master + and what nodes belong to the group as Replicas. Monitor nodes + also have the ability to know when certain events have happened + in the replication group, such as when a new Master is elected or + when new nodes are added to, or removed from, the group. +

+

+ There are many uses for Monitor nodes, starting with the ability to + write processes that monitor the current status of your HA + application. But another, arguably more interesting, use for + Monitor nodes is for request routing. As we have explained earlier + in this book, Replicas can only service read-only requests; all + write requests must occur on the Master. However, Replicas are only + capable of noticing that they have been asked to process a write + request. At most, out of the box, they can complain about it by + throwing a ReplicaWriteException, and then completely rejecting + the request. +

+

+ One way to handle this problem is by writing an request router that + sits on your network between the data nodes and your clients. + This router can send write requests to the Master, and read + requests to the Replicas. A robust example of this sort of thing + could also perform load balancing across the various Replicas, so + that no one Replica becomes swamped by too many read requests. +

+
+
+
+
+

Monitor Class

+
+
+
+

+ You implement Monitor nodes using the Monitor class. The + Monitor class allows you to obtain + information about the replication group, such as its name, + where the Master is, and other such information. The + Monitor class also allows you to run an + event listener that can alert you to changes in the composition + of the replication group. +

+

+ You instantiate a Monitor class object + in much the same way as you instantiate a + ReplicatedEnvironment class object. It is necessary to give + the node a name, to indicate that it is a Monitor node, to + identify the node's host and port information, and to identify + helper hosts. You use a MonitorConfig object to do these + things. +

+

+ Once the Monitor object has been + instantiated, it must be registered at least once with the + Master so that the replication group will know to keep the node + informed about changes in the group composition. (Subsequent + attempts to register the node are simply ignored by the + Master.) You use the Monitor.register() method to register a + Monitor node with a Master. +

+

+ For example: +

+
 // Initialize the monitor node config
+MonitorConfig config = new MonitorConfig();
+config.setGroupName("MyRepGroupName");
+config.setNodeName("mon1");
+config.setNodeHostPort("monhost1.acme.com:7000");
+config.setHelperHosts("node1.acme.com:5000,node2.acme.com:5000");
+
+Monitor monitor = new Monitor(config);
+
+// If the monitor has not been registered as a member of the 
+// group, register it now. register() returns the current node 
+// that is the master.
+ReplicationNode currentMaster = monitor.register(); 
+
+
+ + + diff --git a/docs/ReplicationGuide/nodeconfig.html b/docs/ReplicationGuide/nodeconfig.html new file mode 100644 index 0000000..1fbf15a --- /dev/null +++ b/docs/ReplicationGuide/nodeconfig.html @@ -0,0 +1,227 @@ + + + + + + Node Configuration + + + + + + + + + +
+
+
+
+

Node Configuration

+
+
+
+

+ When you place a node into service, there is a set of information + that you must provide which will be unique to each and every + node. The application development team may or may not have provided + defaults for some or all of these values, so you should check + with them to see exactly what you need to override. +

+

+ This information can be provided to the application in two + different ways. One is by using JE API calls. Typically you + will pass the information to those calls using command line + parameters. Again, how you do this is specific to your + application. +

+

+ In addition, you can provide this information to the application + using the je.properties file. Note that the + information provided in this file is handled as if it is a + default setting. Therefore, if you also + provide conflicting information using the JE APIs (again, + usually passed to a production application using command line + parameters), then the information provided directly to the APIs + takes priority over whatever might be found in the + je.properties file. +

+

+ No matter how it is done, there are three pieces of information + that you must provide every JE replicated application: +

+
+
    +
  • +

    + Group Name +

    +

    + This is the replication's group name. This value must be + the same for every node in a given + replication group. This name must be made up of + alpha numeric characters and must not be zero length. +

    +

    + JE developers can provide this information to the + application using the + ReplicationConfig.GROUP_NAME + field. In the je.properties file, + it is defined using the + je.rep.group.name parameter. +

    +
  • +
  • +

    + Node Name +

    +

    + This is the name of the node. This name must be unique + within the group. This name combined with the group name + uniquely identifies the node. +

    +

    + JE developers can provide this information to the + application using the + ReplicationConfig.NODE_NAME + field. In the je.properties file, + it is defined using the + je.rep.node.name parameter. +

    +
  • +
  • +

    + Node Host +

    +

    + This is the hostname and port pair that is used by other + nodes in the replication group to communicate with this + node. The node uses this property to establish a TCP/IP + socket for communication with other members of the group. +

    +

    + The string that you provide to this property takes the + form: +

    +
    hostname[:port]
    +

    + The hostname provided to this property must be reachable + by the other nodes in the replication group. +

    +

    + The port number is optional for this property because a + default port can be defined using the + je.properties file (you use the + je.rep.defaultPort property to do + this). However, if a port is provided explicitly to this + property, then je.rep.defaultPort is + ignored. +

    +

    + Be careful to ensure that the port you identify for the + node does not conflict with ports used by other applications + (including other nodes, if any) currently running on the local machine. +

    +

    + Note that monitor nodes will use the socket identified by + this property so that they can be kept informed of the + results of elections, and so they can keep track of + changes in group composition. +

    +

    + Electable nodes use this socket to: +

    +
    +
      +
    • +

      + Hold elections +

      +
    • +
    • +

      + Supply commit acknowledgements +

      +
    • +
    +
    +

    + Both electable and secondary nodes use this socket to: +

    +
    +
      +
    • +

      + Establish replication streams between the Master + and its Replicas +

      +
    • +
    • +

      + Support network-based JE HA utility services, + such as JE's network restore utility. (See + Restoring Log Files + for details on this utility.) +

      +
    • +
    +
    +
    +

    Note

    +

    + You can change the hostname and/or port number for + an existing electable or monitor node using the + DbGroupAdmin.updateAddress() or + ReplicationGroupAdmin.updateAddress() methods. + Hostnames and port numbers for secondary nodes can + be changed by restarting the nodes with the + desired values. +

    +
    +
  • +
+
+

+ The properties discussed here are simply the bare-bones minimum + properties required to configure a JE node. For a complete + description of all the replication properties available to a + JE application, see the ReplicationConfig and + ReplicationMutableConfig class descriptions. +

+
+ + + diff --git a/docs/ReplicationGuide/preface.html b/docs/ReplicationGuide/preface.html new file mode 100644 index 0000000..bc55971 --- /dev/null +++ b/docs/ReplicationGuide/preface.html @@ -0,0 +1,260 @@ + + + + + + Preface + + + + + + + + + +
+
+
+
+

Preface

+
+
+
+
+

+ Table of Contents +

+
+
+ + Conventions Used in this Book + +
+
+
+
+ + For More Information + +
+
+ + Contact Us + +
+
+
+
+
+

+ This document describes how to write replicated Berkeley DB, Java Edition + applications. The APIs used to implement replication in your + application are described here. This book describes the concepts + surrounding replication, the scenarios under which you might choose + to use it, and the architectural requirements that a replication + application has over a transactional application. +

+

+ This book is aimed at the software engineer responsible for writing a + replicated JE application. +

+

+ This book assumes that you have already read and understood the + concepts contained in the Berkeley DB, Java Edition Getting Started with Transaction Processing guide. +

+
+
+
+
+

Conventions Used in this Book

+
+
+
+
+
+
+ + For More Information + +
+
+ + Contact Us + +
+
+
+

+ The following typographical conventions are used within in this manual: +

+

+ Class names are represented in monospaced font, as are method + names. For example: + + "The Environment() + constructor returns an Environment class object." +

+

+ Variable or non-literal text is presented in italics. For example: "Go to your + JE_HOME directory." +

+

+ Program examples are displayed in a monospaced font on a shaded background. + For example: +

+
import com.sleepycat.je.Environment;
+
+...
+
+// Open the environment. Allow it to be created if it does not already 
+// exist.
+Environment myDbEnv;
+

+ In some situations, programming examples are updated from one chapter to the next. When + this occurs, the new code is presented in monospaced bold font. For example: +

+
import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import java.io.File;
+
+...
+
+// Open the environment. Allow it to be created if it does not already 
+// exist.
+Environment myDbEnv;
+EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+myDbEnv = new Environment(new File("/export/dbEnv"), envConfig); 
+
+

Note

+

+ Finally, notes of special interest are represented using a note block such + as this. +

+
+
+
+
+
+

For More Information

+
+
+
+

+ Beyond this manual, you may also find the following sources of + information useful when building a replicated JE + application: +

+ + +

+ To download the latest + + Berkeley DB Java Edition + + documentation along with white papers and other collateral, + visit http://www.oracle.com/technetwork/indexes/documentation/index.html. +

+

+ For the latest version of the Oracle + + Berkeley DB Java Edition + + downloads, visit + http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html. +

+
+
+
+
+
+
+

Contact Us

+
+
+
+

+ You can post your comments and questions at the Oracle + Technology (OTN) forum for + + + + Oracle Berkeley DB Java Edition at: https://forums.oracle.com/forums/forum.jspa?forumID=273. + +

+

+ For sales or support information, email to: + berkeleydb-info_us@oracle.com + You can subscribe to a low-volume email announcement list for + the Berkeley DB product family by sending email to: + bdb-join@oss.oracle.com +

+
+
+
+ + + diff --git a/docs/ReplicationGuide/progoverview.html b/docs/ReplicationGuide/progoverview.html new file mode 100644 index 0000000..5a6a053 --- /dev/null +++ b/docs/ReplicationGuide/progoverview.html @@ -0,0 +1,498 @@ + + + + + + Chapter 2. Replication API First Steps + + + + + + + + + +
+
+
+
+

Chapter 2. Replication API First Steps

+
+
+
+ +

+ From an API point of view, there are two basic requirements that + every replicated application must meet: +

+
+
    +
  1. +

    + It must be a transactional application. +

    +
  2. +
  3. +

    + It must use a specific form of the Environment handle, + which you get by using the ReplicatedEnvironment class. +

    +
  4. +
+
+

+ Beyond that, there are some additional requirements in terms of + exception handling that your application should perform. +

+

+ The transactional nature of your replicated application is + described in Transaction Management. + This chapter discusses replicated environments and the exceptions + unique to exceptions in detail. +

+
+
+
+
+

Using Replicated Environments

+
+
+
+ +

+ Every electable or secondary node manages a single replicated + JE environment directory. The environment follows the usual + regulations governing a JE environment; namely, only a single + read/write process can access the environment at a single point in + time. +

+

+ Usually this requirement is met naturally, because usually each + node in a replicated application is also operating on a machine + that is independent of all the other nodes. However, in some + test and development scenarios, this one node to one machine + rule might not be met, so the bottom line is that you need to + make sure that no two processes are ever attempting to manage + the same environment. +

+
+

Note

+

+ An application can access a replicated JE environment + directory using a read only Environment handle. The usual + semantics of read only non-replicated Environment handles + apply in this case. That is, the application can view a + snapshot of the replicated environment as of the time the + Environment handle was opened, through the Environment + handle. An application can therefore open a + ReplicatedEnvironment handle in one process, and + concurrently open read only Environment handles in other + processes. Any changes subsequently made to the replicated + environment, either by virtue of the node being a Master, + or due to a replay of the replication stream (if the node is a + Replica), are not accessible through the read only Environment + handles until they are closed and reopened. +

+
+

+ Normally you manage your JE environments using the + Environment class. However, to provide for the underlying + infrastructure needed to implement replication, your JE HA + application must instead use the ReplicatedEnvironment class, + which is a subclass of Environment. Its constructor accepts + the normal environment configuration properties using the + EnvironmentConfig class, just as you would normally configure + an Environment object. However, the ReplicatedEnvironment + class also accepts an ReplicationConfig class object, which + allows you to manage the properties specific to replication. +

+

+ The following is an example of how you instantiate a + ReplicatedEnvironment object. Note that there are some + differences in how this is used, depending on whether you are + starting a brand-new node or you are restarting an existing + node. We discuss these differences in the next section. +

+

+ For a general description of environments and environment + configuration, see the Getting Started with Berkeley + DB Java Edition guide. +

+
EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+envConfig.setTransactional(true);
+
+// Identify the node
+ReplicationConfig repConfig = new ReplicationConfig();
+repConfig.setGroupName("PlanetaryRepGroup");
+repConfig.setNodeName("Mercury");
+repConfig.setNodeHostPort("mercury.example.com:5001");
+
+// This is the first node, so its helper is itself
+repConfig.setHelperHosts("mercury.example.com:5001");
+ 
+ReplicatedEnvironment repEnv =
+     new ReplicatedEnvironment(envHome, repConfig, envConfig);  
+
+
+
+
+

Configuring Replicated Environments

+
+
+
+

+ You configure a JE ReplicatedEnvironment handle using + two different configuration classes: EnvironmentConfig + and ReplicationConfig. Your usage of EnvironmentConfig + is no different than if you were writing a non-replicated + application, so we will not describe its usage here. + For an introduction to basic environment configuration, see + the Getting Started with Berkeley DB, Java Edition guide. +

+

+ The ReplicationConfig class allows you to configure + properties that are specific to + replicated applications. Some of these properties are + important in terms of how your application will behave + and how well it will perform. These properties are + discussed in detail later in this book. +

+

+ To an extent, you can get away with ignoring most of the + configuration properties until you are ready to tune your + application's performance and behavior. However, no matter + what, there are four properties you must always configure + for a ReplicatedEnvironment before opening it. They are: +

+
+
    +
  1. +

    + Group Name +

    +

    + The group name is a string that uniquely identifies + the group to which the node belongs. This name must + be unique. It is possible to operate multiple + replication groups on the same network. In fact, a + single process can even interact with multiple + replication groups, so long as it maintains + separate replicated environments for each group in + which it is participating. +

    +

    + By using unique group names, the JE replication + code can make sure that messages arriving at a + given client are actually meant for that client. +

    +

    + You set the group name by using the + ReplicationConfig.setGroupName() method. + Note that if you do not set a group name, then the + default GROUP_NAME value is used. +

    +
  2. +
  3. +

    + Node Name +

    +

    + This name must be unique to the replication group. + This name plus the replication group name uniquely + identifies a node in your enterprise. +

    +

    + You set the node name by using the + ReplicationConfig.setNodeName() method. +

    +
  4. +
  5. +

    + Host +

    +

    + The host property identifies the network name and + port where this node can be reached. Other nodes in + the replication group will use this host/port pair + to establish a TCP/IP connection to this node. This + connection is used to transfer data between + machines, hold elections, and monitor the status of + the replication group. +

    +

    + You provide the host and port information using a string of the + form: +

    +
    host:[port]
    +

    + The port that you provide must be higher than 1023. +

    +

    + You set the host information by using the + ReplicationConfig.setNodeHostPort() method. + Note that if you do not set a node host, then the + default NODE_HOST_PORT value is used. +

    +
  6. +
  7. +

    + Helper Host +

    +

    + The helper host or hosts are used by a node the + very first time it starts up to find the Master. + Basically, this string should provide one or more + host/port pairs for nodes who should know where the + Master is. +

    +

    + One of the nodes that you provide on this string + can be the current Master, but that is not + required. All that matters is that the hosts + identified here can tell a new node where the + current Master is. +

    +

    + If the brand new node is an electable node and cannot + find a Master, it will initiate an election. If no + other electable nodes are available to the new node, + and the current node is specified as the only helper + host, then it will elect itself as Master. If the + current node is truly the very first electable node + starting up in the replication group, then + self-electing itself to be the Master is probably what + you want it to do. +

    +

    + However, if the current node + is not the very first node starting up + in the replication group, then a misconfiguration of + this property can cause you to end up with multiple + replication groups, each with the same group name. + This represents an error situation, one that can be + very difficult to diagnose by people who are + inexperienced with managing replication groups. + For this reason, it is very important to make sure + the hosts identified on this string do NOT identify + only the local host except when creating the first + node. +

    +

    + On subsequent start ups after the very first + startup, the node should be able to locate other + participants in the replication group using + information located in its own database. In that + case, the information provided on this string is + largely ignored unless the current node has been + down or otherwise out of communication with the + rest of the group for so long that its locally + cached information has grown stale. In this case, + the node will attempt to use the information provided here to + locate the current Master. +

    +

    + You set the helper host information by using the + ReplicationConfig.setHelperHosts() method. +

    +
  8. +
+
+

+ When configuring and instantiating a + ReplicatedEnvironment object, you should usually + configure the environment so that a helper host other than + the local machine is used: +

+
EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+envConfig.setTransactional(true);
+ 
+// Identify the node
+ReplicationConfig repConfig = new ReplicationConfig();
+repConfig.setGroupName("PlanetaryRepGroup");
+repConfig.setNodeName("Jupiter");
+repConfig.setNodeHostPort("jupiter.example.com:5002");
+ 
+// Use the node at mercury.example.com:5001 as a helper to find the rest
+// of the group.
+repConfig.setHelperHosts("mercury.example.com:5001");
+ 
+ReplicatedEnvironment repEnv =
+   new ReplicatedEnvironment(envHome, repConfig, envConfig);  
+

+ Note that if you are restarting a node that has already been added to + the replication group, then you do not have to supply a helper host at + all. This is because the node will already have locally stored host and port + information about the other nodes in the group. +

+
EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+envConfig.setTransactional(true);
+ 
+// Identify the node
+ReplicationConfig repConfig = 
+    new ReplicationConfig("PlanetaryRepGroup", 
+                          "Jupiter", 
+                          "jupiter.example.com:5002");
+ 
+ReplicatedEnvironment repEnv =
+   new ReplicatedEnvironment(envHome, repConfig, envConfig);  
+

+ However, if you are starting the very first node in the replication + group for the very first time, then there is no other helper host that + the node can use to locate a Master. In this case, identify the current + node as the helper host, and it will then go ahead and become a + replication group of size 1 with itself as a Master. +

+
+

Note

+

+ Do this ONLY if you are truly starting the very first electable + node in a replication group for the very first time. +

+
+
EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+envConfig.setTransactional(true);
+ 
+// Identify the node
+ReplicationConfig repConfig = 
+    new ReplicationConfig("PlanetaryRepGroup", 
+                          "Jupiter", 
+                          "jupiter.example.com:5002");
+ 
+// This is the first node, so the helper is itself.
+repConfig.setHelperHosts("jupiter.example.com:5002");
+ 
+ReplicatedEnvironment repEnv =
+   new ReplicatedEnvironment(envHome, repConfig, envConfig);  
+
+
+
+ + + diff --git a/docs/ReplicationGuide/repenvironmentopen.html b/docs/ReplicationGuide/repenvironmentopen.html new file mode 100644 index 0000000..fb43752 --- /dev/null +++ b/docs/ReplicationGuide/repenvironmentopen.html @@ -0,0 +1,157 @@ + + + + + + Opening a Replicated Environment + + + + + + + + + +
+
+
+
+

Opening a Replicated Environment

+
+
+
+

+ In the previous two sections we looked at the basics of how to create a + replicated environment, and what exceptions you can expect to see in a JE HA + application. Now we need to combine these two topics in order to examine how you should + open a ReplicatedEnvironment handle to an existing replicated + environment. +

+

+ When you open the handle, the underlying HA code will attempt to open a TCP/IP + connection to other nodes in the replication group, based on the node's stored + replication group metadata or the helper host information that you provide. In doing so, + the node will attempt to locate a Master or, failing that, will hold an election in order + to select a new Master, if it is an electable node. +

+

+ Due to issues of timing and network performance, the node may or may not be able to: +

+
+
    +
  1. +

    + locate the master; and +

    +
  2. +
  3. +

    + hold an election. +

    +
  4. +
+
+

+ This can happen if there simply are not enough electable nodes available in order for the current + node to start up, find the current master, or hold an election. Remember that a majority + of the electable nodes registered in the replication group must be available in order to hold an + election. +

+

+ If this situation occurs, the ReplicatedEnvironment constructor will throw an + UnknownMasterException. Therefore, typically, it is best that you prepare for this + situation by performing the handle creation in a retry loop, as shown in the following + code snippet. +

+

+ In addition, if the Replica has been down for a long enough + period of time, it might be so far out of date that it cannot + be brought up to date using the normal replication stream. In + this case, the ReplicatedEnvironment constructor will throw + an InsufficientLogException. See Restoring Log Files for information on how to handle this + exception. +

+
private static int REP_HANDLE_RETRY_MAX = 100;
+
+   ...
+
+ReplicatedEnvironment getEnvironment(File envHome, String groupName, 
+                                     String nodeName, String nodeHost,
+                                     String helperHosts) 
+     throws IllegalStateException, InterruptedException {
+
+   EnvironmentConfig envConfig = new EnvironmentConfig();
+   envConfig.setAllowCreate(true);
+   envConfig.setTransactional(true);
+
+   // Identify the node
+   ReplicationConfig repConfig = 
+        new ReplicationConfig();
+   repConfig.setGroupName(groupName);
+   repConfig.setNodeName(nodeName);
+   repConfig.setNodeHostPort(nodeHost);
+   repConfig.setHelperHosts(helperHosts);
+
+   for (int i = 0; i < REP_HANDLE_RETRY_MAX; i++) {
+        try {
+            return new 
+                ReplicatedEnvironment(envHome, repConfig, envConfig);
+        } catch (UnknownMasterException ume) {
+            /*
+             * Insert application specific code here to indicate that
+             * this problem was encountered, such as writing the 
+             * condition to a log file.
+             */
+
+            Thread.sleep(5 * 1000);
+            continue;
+        } catch (InsufficientLogException ile) {
+            /* A network restore is required, make the necessary calls */
+        }
+
+   }
+   throw new 
+        IllegalStateException("getEnvironment: reached max retries");
+} 
+

+ Note that for production code, you may want to retry the handle open without any maximum + retry limit. +

+
+ + + diff --git a/docs/ReplicationGuide/repexample.html b/docs/ReplicationGuide/repexample.html new file mode 100644 index 0000000..1fe8393 --- /dev/null +++ b/docs/ReplicationGuide/repexample.html @@ -0,0 +1,127 @@ + + + + + + Chapter 6. Replication Examples + + + + + + + + + +
+
+
+
+

Chapter 6. Replication Examples

+
+
+
+

+ JE HA provides three different example programs that illustrate + the concepts discussed in this manual. You can find them in your + JE distribution in the + <JE HOME>/examples/je/rep/quote directory, + where <JE HOME> is the directory where you + installed your JE distribution. +

+

+ The examples provided for you are each based on a mock stock ticker + application which stores stock values in a replicated JE + environment. The differences in the three examples have to do with + how each example handles requests for database access; in + particular, database write requests. +

+

+ Briefly, each of the examples are: +

+
+
    +
  • +

    + StockQuotes: Illustrates the most basic demonstration of + a replicated application. It is intended to help you gain + an understanding of basic HA concepts. It demonstrates use + of the HA APIs to create a replicated environment and issue + read and write transactions. +

    +

    + For this example, no attempt is made to route or forward + write requests. Instead, the application blindly attempts + any write requests that are made at the node. If the node + is in the Replica state, a ReplicaWriteException is + raised by the underlying HA code. The example then informs + you of the problem by way of rejecting the operation. +

    +
  • +
  • +

    + RouterDrivenStockQuotes and HARouter: Illustrates + how a software load balancer might be integrated with + JE HA, where HARouter plays the role of the load + balancer for purposes of the example. It does this by + using the Monitor class to direct application + requests to the appropriate node. Read-only requests + are sent to Replicas, while read-write requests are sent + to the replication group's Master. +

    +
  • +
  • +

    + UpdateForwardingStockQuotes and SimpleRouter: + Illustrates the use of an HA unaware router that load + balances read and write requests across the nodes in a + replication group. The router is implemented in + SimpleRouter, and is meant to illustrate how a load + balancer appliance might fit into the JE HA + architecture. +

    +

    + This example is based on RouterDrivenStockQuotes. +

    +
  • +
+
+

+ Usage of each of these examples is described in the Javadoc page + for each example. +

+
+ + + diff --git a/docs/ReplicationGuide/replicawrites.html b/docs/ReplicationGuide/replicawrites.html new file mode 100644 index 0000000..bbfff24 --- /dev/null +++ b/docs/ReplicationGuide/replicawrites.html @@ -0,0 +1,276 @@ + + + + + + Managing Write Requests at a Replica + + + + + + + + + +
+
+
+
+

Managing Write Requests at a Replica

+
+
+
+ +

+ For a replicated JE application, read requests can be + serviced by any electable or secondary node in the replication group, but + write requests can only be serviced by the Master node. For + this reason, your application must be prepared to deal with the + difference in operating behavior between read-only Replicas and + read-write Masters. +

+

+ It is possible to be quite sophisticated in terms of tracking + which node is the Master and so which node can service write + requests. You can even route write requests to the Master node + by writing a special router process. For an example of an + application that does this, see RouterDrivenStockQuotes and + HARouter, both of which are available in your JE + distribution in the + <JE HOME>/examples/je/rep/quote + directory. +

+

+ However, for our purposes here, we simply want to + make sure our Replica nodes can gracefully handle a situation + where they receive a write request. The write request should be + rejected by the node, with some notification being returned to + the requester that the write activity is rejected. While not + the most robust solution, this is the simplest thing your + JE replicated application can do if it receives a write + request at a Replica node. +

+

+ There are two ways to determine whether a write request can be + handled at the local node: +

+
+
    +
  • +

    + Use a monitor node to implement request routing. + Monitor nodes are described in Writing Monitor Nodes. +

    +
  • +
  • +

    + Use the StateChangeListener to detect when the local + node becomes a Master. Otherwise, forward the write + request to the Master node instead of attempting to + service it locally. +

    +
  • +
+
+

+ Either way, any code that attempts database writes for an HA + application should always be prepared to handle a + ReplicaWriteException. +

+
+
+
+
+

Using the StateChangeListener

+
+
+
+

+ You use the StateChangeListener interface to implement a + class that is capable of notifying your node when it has + changed state. In this way, you can track whether a node + is in the Master, Replica or Unknown state, and so know + whether the node is capable of handling write requests. +

+

+ To do this, you must implement StateChangeListener.stateChange(), + which receives a StateChangeEvent object whenever it is + called. +

+

+ If the node is not in the Master state, then the node + can either reject write requests outright or, more + usefully, forward write requests to the Master. For an + example of an HA application that forwards write requests + and uses the StateChangeListener, see the + UpdateForwardingStockQuotes example. +

+

+ Alternatively, you can write a router based on an HA + Monitor. See Writing Monitor Nodes + for more information. +

+

+ Briefly, you can implement + StateChangeListener as follows. Notice that this partial + implementation relies on StateChangeEvent.getState() to + determine the state that the node has just transitioned to. + It then uses StateChangeEvent.getMasterNodeName() to + determine where write requests should be forwarded to in + the event that the new state is not + MASTER. +

+
private class Listener implements StateChangeListener {
+
+    private String currentMaster = null;
+
+    public void stateChange(StateChangeEvent se)
+        throws RuntimeException {
+
+        switch (stateChangeEvent.getState()) {
+
+            case MASTER:
+                // Do whatever your code needs you to do when the 
+                // current node is the MASTER.  For example,
+                // set a flag to indicate that the local node
+                // is in the MASTER state. Here, we just fall
+                // through and do the same thing as if we
+                // transitioned to the REPLICA state.
+            case REPLICA:
+                // Again, do whatever your code needs done when
+                // a node is in the REPLICA state. At a minimum,
+                // you should probably capture which node is the
+                // current Master.
+                currentMaster = se.getMasterNodeName();
+                break;
+
+            // We get here if we have transitioned to the UNKNOWN
+            // state.
+            default:
+                currentmasterName = null;
+                break;
+        }
+    }
+
+    public String getCurrentMasterName() {
+        return currentMaster;
+   }
+} 
+

+ In order to make use of the new listener, the application + must call ReplicatedEnvironment.setStateChangeListener(). + Note that this method can be called at any time after the + ReplicatedEnvironment handle has been created. Also, the + listener is set per environment, not per handle. So if you + set different listeners for different + ReplicatedEnvironment handles, the last listener + configured is used environment-wide. +

+
   EnvironmentConfig envConfig = new EnvironmentConfig();
+   envConfig.setAllowCreate(true);
+   envConfig.setTransactional(true);
+
+   // Identify the node   
+   ReplicationConfig repConfig = new ReplicationConfig();
+   repConfig.setGroupName("PlanetaryRepGroup");
+   repConfig.setNodeName("Saturn");
+   repConfig.setNodeHostPort("saturn.example.com:5001");
+
+   // Use the node at mars.example.com:5002 as a helper to find
+   // the rest of the group.
+   repConfig.setHelperHosts("mars.example.com:5002");
+
+   ReplicatedEnvironment repEnv =
+        new ReplicatedEnvironment(home, repConfig, envConfig); 
+   StateChangeListener listener = new Listener();
+   repEnv.setStateChangeListener(listener);  
+
+
+
+
+
+

Catching ReplicaWriteException

+
+
+
+

+ If you perform a Database write operation on a node that is not in the + Master state, a ReplicaWriteException is thrown when you attempt to commit the + transaction. Therefore, whenever performing database write + operations in an HA application, you should catch and + handle ReplicaWriteException. +

+

+ For example: +

+
Transaction txn = null;
+try {
+    txn = env.beginTransaction(null, null);
+    /* 
+     * Perform your write operations under the protection 
+     * of the transaction handle here.
+     */
+    txn.commit();
+} catch (ReplicaWriteException replicaWrite) { 
+    /* 
+     * Perform whatever reporting (logging) activies you want
+     * to do in order to acknowledge that the write operation(s)
+     * failed. Then abort the transaction.
+     */
+
+     if (txn != null) {
+        txn.abort();
+     }
+} 
+
+
+ + + diff --git a/docs/ReplicationGuide/runtransaction.html b/docs/ReplicationGuide/runtransaction.html new file mode 100644 index 0000000..f4f6c65 --- /dev/null +++ b/docs/ReplicationGuide/runtransaction.html @@ -0,0 +1,572 @@ + + + + + + Example Run Transaction Class + + + + + + + + + +
+
+
+
+

Example Run Transaction Class

+
+
+
+
+
+
+ + RunTransaction Class + +
+
+ + Using RunTransaction + +
+
+
+

+ Usage of JE HA requires you to handle many different + HA-specific exceptions. While some of these are Master-specific + and others are Replica-specific, your code may still need to + handle both. The reason why is that it is not uncommon for HA + applications to have standard classes that perform database + access, regardless of whether the class is used for a node in + the Master state or a node in the Replica state. +

+

+ The following class is an example class that can be used to + perform transactional reads and writes in an HA application. + This class is used by the on-disk HA examples that you can find + in your JE distribution (see Replication Examples for more information). However, we + think this particular example class is important enough that we + also describe it here. +

+
+
+
+
+

RunTransaction Class

+
+
+
+

+ The RunTransaction abstract class is + used to implement a utility class that performs database access + for HA applications. It provides all the + transaction error handling and retry framework that + is required for database access in an HA environment. +

+

+ Because RunTransaction is a class that + is meant to be used by different example HA applications, it + does not actually implement the database operations. Instead, + it provides an abstract method that must be implemented by the + HA application that uses RunTransaction. +

+

+ We begin by importing the classes that + RunTransaction uses. +

+
package je.rep.quote;
+
+import java.io.PrintStream;
+
+import com.sleepycat.je.EnvironmentFailureException;
+import com.sleepycat.je.LockConflictException;
+import com.sleepycat.je.OperationFailureException;
+import com.sleepycat.je.Transaction;
+import com.sleepycat.je.rep.InsufficientAcksException;
+import com.sleepycat.je.rep.InsufficientReplicasException;
+import com.sleepycat.je.rep.ReplicaConsistencyException;
+import com.sleepycat.je.rep.ReplicaWriteException;
+import com.sleepycat.je.rep.ReplicatedEnvironment;
+

+ Then we define a series of private data members that identify how + our HA transactions are going to behave in the event of an error + condition. +

+
abstract class RunTransaction {
+
+    /* The maximum number of times to retry the transaction. */
+    private static final int TRANSACTION_RETRY_MAX = 10;
+
+    /*
+     * The number of seconds to wait between retries when a sufficient
+     * number of replicas are not available for a transaction.
+     */
+    private static final int INSUFFICIENT_REPLICA_RETRY_SEC = 1;
+
+    /* Amount of time to wait to let a replica catch up before 
+     * retrying. 
+     */
+    private static final int CONSISTENCY_RETRY_SEC = 1;
+
+    /* Amount of time to wait after a lock conflict. */
+    private static final int LOCK_CONFLICT_RETRY_SEC = 1;
+
+    private final ReplicatedEnvironment env;
+    private final PrintStream out; 
+

+ Then we implement our class constructor, which is very simple + because all the heavy lifting is done by whatever application calls + this utility class. +

+
    RunTransaction(ReplicatedEnvironment repEnv, 
+                   PrintStream printStream) {
+        env = repEnv;
+        out = printStream;
+    } 
+

+ Now we implement our run() + method. This is what actually performs all the error checking and + retry work for the class. +

+

+ The run() method catches the exceptions + most likely to occur as we are reading and writing the database, + and then handles them, but it will also throw + InterruptedException and EnvironmentFailureException. +

+

+ InterruptedException can be thrown if the thread calling this + method is sleeping and some other thread interrupts it. The + exception is possible because this method calls Thread.sleep in + the retry cycle. +

+

+ EnvironmentFailureException can occur both when beginning a + transaction and also when committing a transaction. It means that + there is something significantly wrong with the node's environment. +

+

+ The readOnly parameter for this method is + used to indicate that the transaction will only perform + database reads. When that happens, the durability guarantee for + the transaction is changed to Durability.READ_ONLY_TXN + because that policy does not call for any acknowledgements. + This eliminates the possibility of an + InsufficientReplicasException being thrown from the + Environment.beginTransaction() operation. +

+
+    public void run(boolean readOnly)
+        throws InterruptedException, EnvironmentFailureException { 
+

+ Now we begin our retry loop and define our sleep cycle between + retries. Initially, we do not actually sleep before + retrying the transaction. However, some of the + error conditions caught by this method will cause the thread to + sleep before the operation is retried. After every sleep operation, + the sleep time is returned to 0 because usually putting the thread + to sleep is of no benefit. +

+
        OperationFailureException exception = null;
+        boolean success = false;
+        long sleepMillis = 0;
+        final TransactionConfig txnConfig = readOnly ?
+         new TransactionConfig().setDurability(Durability.READ_ONLY_TXN) :
+         null;
+
+        for (int i = 0; i < TRANSACTION_RETRY_MAX; i++) {
+            /* Sleep before retrying. */
+            if (sleepMillis != 0) {
+                Thread.sleep(sleepMillis);
+                sleepMillis = 0;
+             } 
+

+ Now we create our transaction, perform the database operations, and + then do the work. The doTransactionWork() + method is an abstract method that must be implemented by the + application using this class. Otherwise, this is standard + transaction begin/commit code that should hold no surprises for + you. +

+
            Transaction txn = null;
+            try {
+                txn = env.beginTransaction(null, null);
+                doTransactionWork(txn); /* CALL APP-SPECIFIC CODE */
+                txn.commit();
+                success = true;
+                return; 
+

+ The first error case that we check for is + InsufficientReplicasException. This exception means that the + Master is not in contact with enough Electable Replicas to successfully + commit the transaction. It is possible that Replicas are still + starting up after an application restart, so we put the thread to + sleep before attempting the transaction again. +

+

+ InsufficientReplicasException is thrown by Transaction.commit(), + so we do have to perform the transaction all over again. +

+
            } catch (InsufficientReplicasException insufficientReplicas) {
+
+                /*
+                 * Retry the transaction.  Give replicas a chance to 
+                 * contact this master, in case they have not had a 
+                 * chance to do so following an election.
+                 */
+                exception = insufficientReplicas;
+                out.printf(insufficientReplicas.toString());
+                sleepMillis = INSUFFICIENT_REPLICA_RETRY_SEC * 1000;
+                continue; 
+

+ Next we check for InsufficientAcksException. This exception + means that the transaction has successfully committed on the + Master, but not enough Electable Replicas have acknowledged the commit + within the allowed period of time. Whether you consider this to + be a successful commit depends on your durability policy. +

+

+ As provided here, the code considers this situation to be + an unsuccessful commit. But if you have a lot of Electable Replicas and you + have a strong durability guarantee on the Master, then you might + be able to still consider this to be a successful commit. If so, + you should set success = true; before + returning from the method. +

+

+ For more information on this error case, see + Managing Acknowledgement Timeouts. +

+
             } catch (InsufficientAcksException insufficientReplicas) {
+
+                /*
+                 * Transaction has been committed at this node. The 
+                 * other acknowledgments may be late in arriving, 
+                 * or may never arrive because the replica just 
+                 * went down.
+                 */
+
+                /*
+                 * INSERT APP-SPECIFIC CODE HERE: For example, repeat
+                 * idempotent changes to ensure they went through.
+                 *
+                 * Note that 'success' is false at this point, although
+                 * some applications may consider the transaction to be 
+                 * complete.
+                 */
+                out.println(insufficientReplicas.toString());
+                txn = null;
+                return; 
+

+ Next we check for ReplicaWriteException. This happens when a + write operation is attempted on a Replica. In response to this, any + number of things can be done, including reporting the problem to + the application attempting the write operation and then aborting, + to forwarding the write request to the Master. This particular + method responds to this condition based on how the + onReplicaWrite() method is implemented. +

+

+ For more information on how to handle this exception, see + Managing Write Requests at a Replica. +

+
            } catch (ReplicaWriteException replicaWrite) {
+
+                /*
+                 * Attempted a modification while in the Replica 
+                 * state.
+                 *
+                 * CALL APP-SPECIFIC CODE HERE: Cannot accomplish 
+                 * the changes on this node, redirect the write to 
+                 * the new master and retry the transaction there.  
+                 * This could be done by forwarding the request to 
+                 * the master here, or by returning an error to the
+                 * requester and retrying the request at a higher 
+                 * level.
+                 */
+                onReplicaWrite(replicaWrite);
+                return; 
+

+ Now we check for LockConflictException, which is thrown whenever + a transaction experiences a lock conflict with another thread. Note + that by catching this exception, we are also catching the + LockPreemptedException, which happens whenever the underlying HA + code "steals" a lock from an application transaction. The most + common cause of this is when the HA replication stream is updating + a Replica, and the Replica is holding a read lock that the + replication stream requires. +

+

+ Here, it is useful to sleep for a period of time before retrying + the transaction. +

+
            } catch (LockConflictException lockConflict) {
+
+                /*
+                 * Retry the transaction.  Note that LockConflictException
+                 * covers the HA LockPreemptedException.
+                 */
+                exception = lockConflict;
+                out.println(lockConflict.toString());
+                sleepMillis = LOCK_CONFLICT_RETRY_SEC * 1000;
+                continue; 
+

+ The last error we check for is ReplicaConsistencyException. This + exception can be thrown when the transaction begins. It means that + the beginTransaction() method has waited + too long for the Replica to catch up relative to the Master. This + situation does not really represent a failed transaction because + the transaction never had a chance to proceed in the first place. +

+

+ In any case, the proper thing to do is to put the thread to sleep + for a period of time so that the Replica has the chance to meet its + consistency requirements. Then we retry the transaction. +

+

+ Note that at this point in time, the transaction handle is in + whatever state it was in when beginTransaction() + was called. If the handle was in the null state before + attempting the operation, then it will still be in the null + state. The important thing to realize here is that the + transaction does not have to be aborted, because the + transaction never began in the first place. +

+

+ For more information on consistency policies, see + Managing Consistency. +

+
            } catch (ReplicaConsistencyException replicaConsistency) {
+
+                /*
+                 * Retry the transaction. The timeout associated with 
+                 * the ReplicaConsistencyPolicy may need to be 
+                 * relaxed if it's too stringent.
+                 */
+                exception = replicaConsistency;
+                out.println(replicaConsistency.toString());
+                sleepMillis = CONSISTENCY_RETRY_SEC * 1000;
+                continue; 
+

+ Finally, we abort our transaction and loop again as needed. + onRetryFailure() is called if the + transaction has been retried too many times (as defined by + TRANSACTION_RETRY_MAX. It provides the option to + log the situation. +

+
            } finally {
+
+                if (!success) {
+                    if (txn != null) {
+                        txn.abort();
+                    }
+
+                    /*
+                     * INSERT APP-SPECIFIC CODE HERE: Perform any 
+                     * app-specific cleanup.
+                     */
+                }
+            }
+        }
+
+        /*
+         * CALL APP-SPECIFIC CODE HERE: 
+         * Transaction failed, despite retries.
+         */
+        onRetryFailure(exception);
+    } 
+

+ Having done that, the class is almost completed. Left to do is to + define a couple of methods, one of which is an abstract method + that must be implemented by the application that uses this + class. +

+

+ doTransactionWork() is an abstract method + where the actual database operations are performed. +

+

+ onReplicaWrite() is a method that should be + implemented by the HA application that uses this class. It is used to + define whatever action the Replica should + take if a write is attempted on it. For examples of how this is + used, see the next section. +

+

+ For this implementation of the class, we simply throw + the ReplicaWriteException that got us here in the first place. +

+
    abstract void doTransactionWork(Transaction txn);
+
+    void onReplicaWrite(ReplicaWriteException replicaWrite) {
+        throw replicaWrite;
+    } 
+

+ Finally, we implement onRetryFailure(), + which is what this class does if the transaction retry loop + goes through too many iterations. Here, we simply print the error + to the console. A more robust application should probably write the + error to the application logs. +

+
    void onRetryFailure(OperationFailureException lastException) {
+            out.println("Failed despite retries." +
+                                ((lastException == null) ?
+                                  "" :
+                                  " Encountered exception:" + 
+                                  lastException));
+        }
+    } 
+
+
+
+
+
+

Using RunTransaction

+
+
+
+

+ Having implemented the RunTransaction class, it is fairly easy to use. + Essentially, you only have to implement the + RunTransaction.doTransactionWork() + method so that it performs whatever database access you + want. +

+

+ For example, the following method performs a read on an + EntityStore used by the StockQuotes example HA + application. Notice that the class is instantiated, + doTransactionWork() is + implemented, and the RunTransaction.run() + method are all called in one place. This makes for fairly + easy maintenance of the code. +

+
    private void printStocks(final PrintStream out)
+        throws InterruptedException {
+
+        new RunTransaction(repEnv, out) {
+
+            @Override
+            void doTransactionWork(Transaction txn) {
+
+                // dao is a DataAccessor class used to access
+                // an entity store.
+                final EntityCursor<Quote> quotes =
+                    dao.quoteById.entities(txn, null);
+                try {
+                    out.println("\tSymbol\tPrice");
+                    out.println("\t======\t=====");
+
+                    int count = 0;
+                    for (Quote quote : quotes) {
+                        out.println("\t" +  quote.stockSymbol +
+                                    "\t" + quote.lastTrade);
+                        count++;
+                    }
+                    out.println("\n\t" + count + " stock"
+                                + ((count == 1) ? "" : "s") +
+                                " listed.\n");
+                } finally {
+                    quotes.close();
+                }
+            }
+            }.run(true /*readOnly*/);
+
+        /* Output local indication of processing. */
+        System.out.println("Processed print request");
+    } 
+

+ In the previous example, we do not bother to override the + RunTransaction.onReplicaWrite() + method because this transaction is performing read-only + access to the database. Regardless of whether the + transaction is run on a Master or a Replica, + ReplicaWriteException can not be raised here, so we can + safely use the default implementation. +

+

+ However, if we were running a transaction that performs a + database write, then we should probably do something with + onReplicaWrite() other than merely + re-throwing the exception. +

+

+ The following is an example usage of + RunTransaction that is also used in + the StockQuotes example. +

+
    void updateStock(final String line, final PrintStream printStream)
+        throws InterruptedException {
+
+        // Quote is a utility class used to parse a line of input
+        // obtained from the console.
+        final Quote quote = QuoteUtil.parseQuote(line);
+        if (quote == null) {
+            return;
+        }
+
+        new RunTransaction(repEnv, printStream) {
+
+            void doTransactionWork(Transaction txn) {
+                // dao is a Data Accessor class used to perform access
+                // to the entity store.
+                dao.quoteById.put(txn, quote);
+                /* Output local indication of processing. */
+                System.out.println("Processed update request: " + line);
+            }
+
+            // For this example, we simply log the error condition.
+            // For a more robust example, so other action might be
+            // taken; for example, log the situation and then route
+            // the write request to the Master.
+            void onReplicaWrite(ReplicaWriteException replicaWrite) {
+                /* Attempted a modification while in the replica state. */
+                printStream.println
+                    (repEnv.getNodeName() +
+                     " is not currently the master.  Perform the update" +
+                     " at the node that's currently the master.");
+            }
+            }.run(false /*not readOnly */);
+    } 
+
+
+ + + diff --git a/docs/ReplicationGuide/secondary.html b/docs/ReplicationGuide/secondary.html new file mode 100644 index 0000000..bea57d2 --- /dev/null +++ b/docs/ReplicationGuide/secondary.html @@ -0,0 +1,106 @@ + + + + + + Secondary Nodes + + + + + + + + + +
+
+
+
+

Secondary Nodes

+
+
+
+

+ If you are creating a replication group where there will be higher + latency network connections between some nodes and the rest of the + replication group, typically because the nodes are located in + distant geographical regions, then it may be useful to create + those distant nodes nodes as Secondary nodes. Secondary nodes are + nodes that only serve as read-only Replicas. They cannot become + Masters, participate in elections, or provide acknowledgements for + commit operations. Secondary nodes can be used to provide a + distant location with quick access to read-only data, although the + data may be somewhat out of date due to replication delays over + the high latency link. By using Secondary nodes for the nodes at a + distance, the Electable nodes will be able to perform elections + and provide acknowledgments without experiencing network delays + associated with higher latency connections to the Secondary nodes. +

+

+ Here is an example of how to create a Secondary node that can join + an existing group of Electable nodes: +

+
EnvironmentConfig envConfig = new EnvironmentConfig();
+envConfig.setAllowCreate(true);
+envConfig.setTransactional(true);
+
+// Identify the secondary node
+ReplicationConfig electableRepConfig =
+    new ReplicationConfig("PlanetaryRepGroup",
+                          "Mars",
+                          "mars.example.com:500");
+
+// Configure the node to be a secondary node
+repConfig.setNodeType(NodeType.SECONDARY);
+
+// Specify one of the electable nodes as a helper
+repConfig.setHelperHosts("jupiter.example.com:5002");
+
+ReplicatedEnvironment repEnv =
+   new ReplicatedEnvironment(envHome, repConfig, envConfig);
+

+ Note that, if you have created an environment with + NodeType.SECONDARY, it is possible to convert the node from a + Secondary node to an Electable node by restarting the environment + with NodeType.ELECTABLE. Once an environment has been used as an + Electable node, though, it is not possible to convert to be a + Secondary node. +

+
+ + + diff --git a/docs/ReplicationGuide/timesync.html b/docs/ReplicationGuide/timesync.html new file mode 100644 index 0000000..4c79f65 --- /dev/null +++ b/docs/ReplicationGuide/timesync.html @@ -0,0 +1,84 @@ + + + + + + Time Synchronization + + + + + + + + + +
+
+
+
+

Time Synchronization

+
+
+
+

+ For best results, you should synchronize the clocks used by all + machines in a replication group. If you are using a time-based + consistency policy, this is an absolute requirement + (see Time Consistency Policies for more information). + Time synchronization is easily achieved using a mechanism like NTPD. +

+

+ In addition, time synchronization is also a requirement for + internal JE HA bookkeeping. For example, JE checks for clock + skew between the Master and a Replica + when the Replica performs its startup handshake with the + Master. This handshake will abort and throw + EnvironmentFailureException if the clock skew between the + two machines is greater than the value set for the + MAX_CLOCK_DELTA property. This property can be set using the + ReplicationConfig.setMaxClockDelta() method, or in the JE + configuration file using the + je.rep.maxClockDelta property. +

+

+ Finally, well synchronized clocks make it easier to correlate + events in the logging output from different nodes in the group. +

+
+ + + diff --git a/docs/ReplicationGuide/two-node.html b/docs/ReplicationGuide/two-node.html new file mode 100644 index 0000000..7a8282f --- /dev/null +++ b/docs/ReplicationGuide/two-node.html @@ -0,0 +1,203 @@ + + + + + + Configuring Two-Node Groups + + + + + + + + + +
+
+
+
+

Configuring Two-Node Groups

+
+
+
+

+ A group needs at least a simple majority of active nodes in + order to elect a Master. This means that for a replication group of size + two, the failure of a single node means that the group as a + whole is no longer available. In some cases, it may be + desirable for the application to proceed anyway. If you are + using a two-node group, and you decide you want your application + to continue even if one of the nodes is unavailable, then you + can trade off some of your durability guarantees, as well as + potentially some of your performance, in exchange for a higher + availability guarantee. +

+

+ JE HA can explicitly relax the requirement for a simple majority of + nodes. This is only possible when the replication group size is + two. The application does this by designating one of the two + electable nodes as a Primary node. The other node in the group is + implicitly the Non-Primary node. +

+

+ At any given instant in time, exactly one of the two nodes can + be designated as the Primary. The application is responsible + for ensuring that this is the case. +

+

+ When the Non-Primary node is not available, the number of nodes + required for a simple majority is reduced to one. As a + consequence, the Primary is able to elect itself as the Master + and then commit transactions that require a simple majority to + commit. The Primary is said to be active + when it is operating in this state. The transition from a + designated Primary to an active Primary happens when the + Primary needs to contact the Non-Primary node, but fails to do so + for one of the following reasons: +

+
+
    +
  • +

    + An election is initiated by the Primary to determine a + new Master. This might happen because the Primary is + just starting up, or because the Primary has lost + contact with the Non-Primary. In either case, if the + election fails to establish a Master, the Primary is + activated and it becomes the Master. +

    +

    + Note that the Primary will attempt to locate a Master + until it has hit the retry limit as defined by the + ELECTIONS_PRIMARY_RETRIES configuration property. But + until the Primary has reached that limit, it will not + transition to the active state. +

    +
  • +
  • +

    + An Environment.beginTransaction() operation + is invoked on the Primary while it is in the Master + state, and it cannot establish contact with the + Non-Primary in the time period specified by the + INSUFFICIENT_REPLICAS_TIMEOUT configuration property. +

    +
  • +
  • +

    + A Transaction.commit() needing a commit acknowledgement + is invoked on the Primary while it is in the Master + state, and the Primary does not receive the commit + acknowledgement within the time period specified by the + REPLICA_ACK_TIMEOUT configuration property. +

    +
  • +
+
+

+ Both the INSUFFICIENT_REPLICAS_TIMEOUT and + REPLICA_ACK_TIMEOUT error cases are driven by the durability + policy that you are using for your transactions. See + Managing Durability + for more information. +

+

+ The three properties described above: + ELECTIONS_PRIMARY_RETRIES, INSUFFICIENT_REPLICAS_TIMEOUT + and REPLICA_ACK_TIMEOUT impact the time taken by the Primary + to become active in the absence of the Non-Primary. Choosing + smaller values for the timeouts and election retries will + generally result in smaller service disruptions by activating + the Primary more rapidly. The downside is that transient + network glitches may result in unnecessary transitions to the + active state where the Primary is operating with reduced + Durability. It's up to the application to make these tradeoffs + appropriately based on its operating environment. +

+

+ When the Non-Primary becomes available again, the Primary becomes + aware of it as part of the Master/Replica handshake (see + Replica Startup). + At that time, the number of nodes required for a simple majority + reverts to two. That is, the Primary is no longer in the active + state. +

+

+ Your application must be very careful to not designate two + nodes as Primaries. If both nodes are designated as Primaries, + and the two nodes cannot communicate with one another for some + reason, they could both consider themselves to be Masters and + start accepting write transactions. This would violate a + fundamental requirement of JE HA that at any given instant + in time, there is only one node that is permitted to write to + the replicated environment. +

+

+ The Non-Primary always needs two nodes for a simple majority, and + as a result can never become a Master in the absence of the + Primary. If the Primary node fails, you can make provisions to + swap the Primary and Non-Primary designations, so that the + surviving node is now the Primary. The swap must be done + carefully to ensure that both nodes are not concurrently + designated Primaries. In particular, the failed node must come + up as a Non-Primary after it has been repaired. +

+

+ You designate a node as Primary using the mutable config + property DESIGNATED_PRIMARY. You set this property using + ReplicationMutableConfig.setDesignatedPrimary(). This property + is ignored for groups of size greater than two. +

+

+ As stated above, this configuration can only be set for one node at a + time. This condition is checked during the Master/Replica + startup handshake, and if both are designated as Primary then + an EnvironmentFailureException is thrown. However, you + should not rely on this handshake process to guard against dual + Primaries. As stated above, if both nodes are designated + Primary at some point after the handshake occurs, and your + application experiences a network partition event such that the + two nodes can no longer communicate, then both nodes will + become Masters. This is error condition that will require you + to lose data on at least one of the nodes if writes have + occurred on both nodes while the network partition was in + progress. +

+
+ + + diff --git a/docs/ReplicationGuide/txn-management.html b/docs/ReplicationGuide/txn-management.html new file mode 100644 index 0000000..f66ea7d --- /dev/null +++ b/docs/ReplicationGuide/txn-management.html @@ -0,0 +1,799 @@ + + + + + + Chapter 3. Transaction Management + + + + + + + + + +
+
+
+
+

Chapter 3. Transaction Management

+
+
+
+ +

+ A JE HA application is essentially a transactional application + that distributes its data across multiple environments for you. The + assumption is that these environments are on separate physical + hosts, so the distribution of your data is performed over TCP/IP + connections. +

+

+ Because of this distribution activity, several new dimensions are + added to your transactional management. In particular, there is + more to consider in the areas of durability, consistency and + performance than you have to think about for single-environment + applications. +

+

+ Before continuing, some definitions are in order: +

+
+
    +
  1. +

    + Durability is defined by how likely + your data will continue to exist in the presence of + hardware breakage or a software crash. The first goal of + any durability scheme is to get your data stored onto + physical media. After that, to make your data even more + durable, you will usually start to consider your backup + schemes. +

    +

    + By its very nature, a JE HA application is offering you + more data durability than does a traditional transactional + application. This is because your HA application is + distributing your data across multiple environments (which + we assume are on multiple physical machines), which means + that data backups are built into the application. The more + backups, the more durable your application is. +

    +
  2. +
  3. +

    + Consistency is defined by how + current your data is. In a traditional + transactional application, consistency is guaranteed by + allowing you to group multiple read and write operations in + a single atomic unit, which is defined by the transactional + handle. This level of consistency continues to exist for + your HA application, but in addition you must concern + yourself with how consistent (or correct) the data is + across the various nodes in the replication group. +

    +

    + Because the replication group is a collection of differing + machines connected by a network, some amount of a delay in + data updates is to be naturally expected across the + Replicas. The amount of delay that you will see is + determined by the number and size of the data updates, the + performance of your network, the performance of the + hardware on which your nodes are running, and whether your + nodes are persistently available on the network (as opposed + to being down or offline or otherwise not on the network + for some period of time). Because they are not included + in acknowledgments, Secondary nodes may tend to show + greater delay than Electable nodes. +

    +

    + A highly consistent HA application, then, is an application + where the data across all nodes in the replication group is + identical or very nearly identical all the time. A not very + consistent HA application is one where data across the + replication group is frequently stale or out of date + relative to the data contained on the Master node. +

    +
  4. +
  5. +

    + Performance is simply how fast your HA + application is at performing read and write requests. By + its very nature, an HA application tends to perform much + better than a traditional transactional application at + read-only requests. This is because you have multiple + machines that are available to service read-only requests. + The only tricky thing here is to make sure you load balance + your read requests appropriately across all your nodes so + that you do not have some nodes that are swamped with + requests while others are mostly idle. +

    +

    + Write performance for an HA application is a mixed bag. + Depending on your goals, you can make the HA application + perform better than a traditional transactional + application that is committing writes to the disk + synchronously. However, in doing so + you will compromise your data's durability and consistency + guarantees. This is no different than configuring a + traditional transactional application to commit + transactions asynchronously to disk, and so lose the + guarantee that the write is stored on physical media before + the transaction completes. However, the good news is that + because of the distributed nature of the HA application, + you have a better durability guarantee than the + asynchronously committing single-environment transactional + application. That is, by "committing to the network" you + have a fairly good chance of a write making it to disk + somewhere on some node. +

    +

    + Mostly, though, HA applications commit a transaction and + then wait for an acknowledgement from some number of nodes + before the transaction is complete. An HA application + running with quorum acknowledgements and write no sync + durability can exhibit equal or better write performance + than a single node standalone application, but your write + performance will ultimately depend on your application's + configuration. +

    +
  6. +
+
+

+ As you design your HA application, remember that each of these + characteristics are interdependent. You cannot, for example, + configure your application to have extremely high durability + without sacrificing some amount of performance. A highly + consistent application may have to make sacrifices in durability. A + high performance HA application may require you to make trade-offs + in both durability and consistency. +

+
+
+
+
+

Managing Durability

+
+
+
+ +

+ A highly durable application is one where you attempt to make + sure you do not lose data, ever. This is frequently (but not + always) one of the most pressing design considerations for any + application that manages data. After all, data often equals + money because the data you are managing could involve billing + or inventory information. But even if your application is not + managing information that directly relates to money, a loss of + data may very well cost your enterprise money in terms of the + time and resources necessary to reacquire the information. +

+

+ HA applications attempt to increase their data + durability guarantees by distributing data writes across + multiple physical machines on the network. By spreading the + data in this way, you are placing it on stable storage on + multiple physical hard drives, CPUs and power supplies. + Obviously, the more physical resources available to contain + your data, the more durable it is. +

+

+ However, as you increase your data durability, you will + probably lower your consistency guarantees and probably your + write performance. Read performance may also take a hit, + depending on how many physical machines you include in the mix + and how high a durability guarantee you want. In order to + understand why, you have to understand how JE HA + applications handle transactional commits. +

+
+
+
+
+

Durability Controls

+
+
+
+

+ By default, JE HA makes transactional commit operations + on the Master wait to return from the operation until they receive + acknowledgements from some number of Replicas. Each + Replica, in turn, will only return an acknowledgement once + the write operation has met whatever durability requirement + exists for the Replica. (For example, you can require the + Replicas to successfully flush the write operation to disk + before returning an acknowledgement to the Master.) +

+
+

Note

+

+ Be aware that write operations received on the Replica + from the Master have lock priority. This means that if + the Replica is currently servicing a read request, it + might have to retry the read operation should a write + from the Master preempt the read lock. For this reason, + you can see read performance degradation if you have + Replicas that are heavily loaded with read requests at + a time when the Master is performing a lot of write + activity. The solution to this is to add + additional nodes to your replication group and/or better + load-balance your read requests across the Replicas. +

+
+

+ There are three things to control when you design your + durability guarantee: +

+
+
    +
  • +

    + Whether the Master synchronously writes the + transaction to disk. This is no different from the + durability consideration that you have for a + stand-alone transactional application. +

    +
  • +
  • +

    + Whether the Replica synchronously writes the + transaction to disk before returning an + acknowledgement to the Master, if any. +

    +
  • +
  • +

    + How many, if any, Replicas must acknowledge the + transaction commit before the commit operation on + the Master can complete. +

    +
  • +
+
+

+ You can configure your durability policy on a + transaction-by-transaction basis using + TransactionConfig.setDurability(), or on an + environment-wide basis using + EnvironmentMutableConfig.setDurability(). +

+
+
+
+
+
+

Commit File Synchronization

+
+
+
+

+ Synchronization policies are described in the + Berkeley DB, Java Edition Getting Started with Transaction Processing guide. However, for the + sake of completeness, we briefly cover this topic here + again. +

+

+ You define your commit synchronization policy by using + a Durability class object. For HA applications, the + Durability class constructor must define the + synchronization policy for both the Master and the Master's + replicas. The synchronization policy does not have to be + the same for both Master and Replica. +

+

+ You can use the following constants to define a + synchronization policy: +

+
+
    +
  • +

    + Durability.SyncPolicy.SYNC +

    +

    + Write and synchronously flush the log to disk upon + transaction commit. This offers the most durable + transaction configuration because the commit + operation will not return until all of the disk I/O + is complete. But, conversely, this offers the worse + possible write performance because disk I/O is an + expensive and time-consuming operation. +

    +
  • +
  • +

    + Durability.SyncPolicy.NO_SYNC +

    +

    + Do not synchronously flush the log on transaction + commit. All of the transaction's write activity is + held entirely in memory when the transaction + completes. The log will eventually make it to disk + (barring an application hardware crash of some kind). + However, the application's thread of control is + free to continue operations without waiting for + expensive disk I/O to complete. +

    +

    + This represents the least durable configuration + that you can provide for your transactions. But it + also offers much better write performance than the + other options. +

    +
  • +
  • +

    + Durability.SyncPolicy.WRITE_NO_SYNC +

    +

    + Log data is synchronously written to the OS's file + system buffers upon transaction commit, but the + data is not actually forced to disk. This protects + your write activities from an application crash, + but not from a hardware failure. +

    +

    + This policy represents an intermediate durability + guarantee. It is not has strong as SYNC, but is + also not as weak as NO_SYNC. Conversely, it + performs better than NO_SYNC (because your + application does not have to wait for actual disk + I/O), but it does not perform quite as well as SYNC + (because data still must be written to the file + system buffers). +

    +
  • +
+
+
+
+
+
+
+

Managing Acknowledgements

+
+
+
+

+ Whenever a Master commits a transaction, by default it + waits for acknowledgements from a majority of its Electable Replicas + before the commit operation on the Master completes. + By default, Electable Replicas respond with an acknowledgement once they have + successfully written the transaction to their local + disk. Note that Secondary Replicas do not ever provide + acknowledgements. +

+

+ Acknowledgements are expensive operations. They involve both + network traffic, as well as disk I/O at multiple physical + machines. So on the one hand, acknowledgements help to + increase your durability guarantees. On the other, they + hurt your application's performance, and may have a + negative impact on your application's consistency + guarantee. +

+

+ For this reason, JE allows you to manage + acknowledgements for your HA application. As is the case + with synchronization policies, you do this using the + Durability class. As a part of this class' constructor, + you can provide it with one of the following constants: +

+
+
    +
  • +

    + Durability.ReplicaAckPolicy.ALL +

    +

    + All of the Electable Replicas must acknowledge the + transactional commit. This represents the highest + possible durability guarantee for your HA application, + but it also represents the poorest performance. For + best results, do not use this policy unless your + replication group contains a very small number of + electable replicas, and those replicas are all on + extremely reliable networks and servers. +

    +
  • +
  • +

    + Durability.ReplicaAckPolicy.NONE +

    +

    + The Master will not wait for any acknowledgements + from its Replicas. In this case, your durability + guarantee is determined entirely by the + synchronization policy your Master is using for its + transactional commits. This policy also represents + the best possible choice for write + performance. +

    +
  • +
  • +

    + Durability.ReplicaAckPolicy.SIMPLE_MAJORITY +

    +

    + A simple majority of the Electable Replicas must return + acknowledgements before the commit operation + returns on the Master. This is the default policy. + It should work well for most applications unless + you need an extremely high durability + guarantee, have a very large number of Electable Replicas, or + you otherwise have performance concerns that cause + you to want to avoid acknowledgements altogether. +

    +
  • +
+
+

+ You can configure your synchronization policy on a + transaction-by-transaction basis using + TransactionConfig.setDurability(), or on an + environment-wide basis using + EnvironmentMutableConfig.setDurability(). + For example: +

+
   EnvironmentConfig envConfig = new EnvironmentConfig();
+   envConfig.setAllowCreate(true);
+   envConfig.setTransactional(true);
+
+   // Require no synchronization for transactional commit on the 
+   // Master, but full synchronization on the Replicas. Also,
+   // wait for acknowledgements from a simple majority of Replicas.
+   Durability durability =
+          new Durability(Durability.SyncPolicy.WRITE_NO_SYNC,
+                         Durability.SyncPolicy.NO_SYNC,
+                         Durability.ReplicaAckPolicy.SIMPLE_MAJORITY);
+
+   envConfig.setDurability(durability);
+
+   // Identify the node
+   ReplicationConfig repConfig = 
+        new ReplicationConfig("PlanetaryRepGroup",
+                              "Jupiter",
+                              "jupiter.example.com:5002");
+
+   // Use the node at mercury.example.com:5001 as a helper to find
+   // the rest of the group.
+   repConfig.setHelperHosts("mercury.example.com:5001");
+
+   ReplicatedEnvironment repEnv =
+      new ReplicatedEnvironment(home, repConfig, envConfig); 
+

+ Note that at the time of a transaction commit, if the + Master is not in contact with enough Electable Replicas to meet the + transaction's durability policy, the transaction commit + operation will throw an InsufficientReplicasException. + The proper action to take upon encountering this exception + is to abort the transaction, wait a small period of time in + the hopes that more Electable Replicas will become available, then + retry the exception. See + Example Run Transaction Class + for example code that implements this retry loop. +

+

+ You can also see an InsufficientReplicasException when + you begin a transaction if the Master fails to be in + contact with enough Electable Replicas to meet the acknowledgement + policy. To manage this, you can configure how long the + transaction begin operation will wait for enough Electable + Replicas before throwing this exception. You use the + INSUFFICIENT_REPLICAS_TIMEOUT configuration option, which + you can set using the ReplicationConfig.setConfigParam() + method. +

+
+
+
+
+

Managing Acknowledgement Timeouts

+
+
+
+

+ In addition to the acknowledgement policies, you have + to also consider your replication acknowledgement + timeout value. This value specifies the maximum amount + of time that the Master will wait for acknowledgements + from its Electable Replicas. +

+

+ If the + Master commits a transaction and the timeout value is + exceeded while waiting for enough acknowledgements, the + Transaction.commit() method will throw an + InsufficientAcksException exception. In this event, + the transaction has been committed on the Master, so at + least locally the transaction's durability policy has + been met. However, the transaction might not have been + committed on enough Electable Replicas to guarantee your HA + application's overall durability policy. +

+

+ There can be a lot of reasons why the Master did not + get enough acknowledgements before the timeout value, + such as a slow network, a network failure before or + after a transaction was transmitted to a replica, or a + failure of a replica. These failures have different + consequences for whether a transaction will become + durable or will be subject to rollback. As a result, an + application may respond in various ways, and for + example choose to: +

+
+
    +
  • +

    + Do nothing, assuming that the transaction will + eventually propagate to enough replicas to + become durable. +

    +
  • +
  • +

    + Retry the operation in a new transaction, which + may succeed or fail depending on whether the + underlying problems have been resolved. +

    +
  • +
  • +

    + Retry using a larger timeout interval and + return to the original timeout interval at a + later time. +

    +
  • +
  • +

    + Fall back temporarily to a read-only mode. +

    +
  • +
  • +

    + Increase the durability of the transaction on + the Master by ensuring that the changes are + flushed to the operating system's buffers or to + the disk. +

    +
  • +
  • +

    + Give up and report an error at a higher level, + perhaps to allow an administrator to check the + underlying cause of the failure. +

    +
  • +
+
+

+ The default value for this timeout is 5 seconds, which + should work for most cases where an acknowledgement + policy is in use. However, if you have a very large + number of Electable Replicas, or if you have a very unreliable + network, then you might see a lot of + InsufficientAcksException exceptions. In this case, + you should either increase this timeout value, relax + your acknowledgement policy, or find out why your + hardware and/or network is performing so poorly. +

+
+

Note

+

+ You can also see InsufficientAcksException + or InsufficientReplicasException + exceptions if one or more replicas have exceeded + their disk usage thresholds. See + Suspending Writes Due to Disk Thresholds + for more information. +

+
+

+ You can configure your acknowledgement policy using the + ReplicationConfig.setReplicaAckTimeout() method. +

+
   EnvironmentConfig envConfig = new EnvironmentConfig();
+   envConfig.setAllowCreate(true);
+   envConfig.setTransactional(true);
+
+   // Require no synchronization for transactional commit on the 
+   // Master, but full synchronization on the Replicas. Also,
+   // wait for acknowledgements from a simple majority of Replicas.
+   Durability durability =
+          new Durability(Durability.SyncPolicy.WRITE_NO_SYNC,
+                         Durability.SyncPolicy.NO_SYNC,
+                         Durability.ReplicaAckPolicy.SIMPLE_MAJORITY);
+
+   envConfig.setDurability(durability);
+
+   // Identify the node
+   ReplicationConfig repConfig = 
+        new ReplicationConfig("PlanetaryRepGroup",
+                              "Jupiter",
+                              "jupiter.example.com:5002");
+ 
+   // Use the node at mercury.example.com:5001 as a helper to find the rest
+   // of the group.
+   repConfig.setHelperHosts("mercury.example.com:5001");
+
+   // Set a acknowledgement timeout that is slightly longer
+   // than the default 5 seconds.
+   repConfig.setReplicaAckTimeout(7, TimeUnit.SECONDS);
+
+   ReplicatedEnvironment repEnv =
+      new ReplicatedEnvironment(home, repConfig, envConfig); 
+
+
+
+
+ + + diff --git a/docs/ReplicationGuide/txnrollback.html b/docs/ReplicationGuide/txnrollback.html new file mode 100644 index 0000000..f87e179 --- /dev/null +++ b/docs/ReplicationGuide/txnrollback.html @@ -0,0 +1,119 @@ + + + + + + Managing Transaction Rollbacks + + + + + + + + + +
+
+
+
+

Managing Transaction Rollbacks

+
+
+
+

+ In the event that a new Master is elected, it is possible for a + Replica to find that some of its logs are ahead of the logs + held by the Master. While this is unlikely to occur, your code + must still be ready to deal with the situation. When it + happens, you must roll back the transactions represented by the + logs that are ahead of the Master. +

+

+ You do this by simply closing all your ReplicatedEnvironment + handles, and then reopening. During the handshaking process + that occurs when the Replica joins the replication group, the + discrepancy in log files is resolved for you. +

+

+ Note that the problem of logs on replicas being ahead of the + log on the master is unlikely to occur because the election + mechanism favors nodes with the most recent logs. When + selecting a master, a simple majority of nodes are required to + vote on the choice of master, and they will vote for the node + with the most recent log files. When the problem does occur, + though, it results in the updates reflected in the Replica's + log being discarded when the log is rolled back. +

+

+ Logs on a Replica can be ahead of the logs on the Master if + network or node failures result in transactions becoming + durable on fewer than a majority of the nodes in the + replication group. This reduced durability is more likely in + cases where one or more Replicas show large replication lags + relative to the Master. Administrators should monitor + replication lags and evaluate whether they are caused by issues + with network or host performance. Applications can reduce the + chance of transaction rollbacks by avoiding the use of weak + durability requirements like + ReplicaAckPolicy.NONE or a + ReplicationMutableConfig.NODE_PRIORITY of + zero. +

+

+ JE HA lets your application know that a transaction must be + rolled back by throwing RollbackException. This exception can + by thrown by any operation that is performing routine database + access. +

+
    ReplicatedEnvironment repEnv = new ReplicatedEnvironment(...);
+    boolean doWork = true;
+
+    while doWork {
+        try {
+            // performSomeDBWork is the method that
+            // performs your database access.
+            doWork = performSomeDBWork();
+        } catch (RollbackException rb) {
+            if (repEnv != null) {
+                repEnv.close();
+                repEnv = new ReplicatedEnvironment(...);
+        }
+    } 
+
+ + + diff --git a/docs/ReplicationGuide/utilities.html b/docs/ReplicationGuide/utilities.html new file mode 100644 index 0000000..86f1d66 --- /dev/null +++ b/docs/ReplicationGuide/utilities.html @@ -0,0 +1,472 @@ + + + + + + Chapter 4. Utilities + + + + + + + + + +
+
+
+
+

Chapter 4. Utilities

+
+
+
+ +

+ This chapter discusses the APIs that you use to administer and + manage your replication group. +

+
+
+
+
+

Administering the Replication Group

+
+
+
+ +

+ There are a series of administrative activities that an + application might want to take relative to a replication group. + These activities can be performed by electable or secondary nodes in the + replication group, or by applications that do not have access to + a replicated environment (in other words, utilities designed to + help administer and monitor the group). All of these functions + can be accessed using the ReplicationGroupAdmin class. +

+

+ You can use the ReplicationGroupAdmin class to: +

+
+
    +
  1. +

    + List replication group members. +

    +
  2. +
  3. +

    + Locate the current Master. +

    +
  4. +
  5. +

    + Remove electable nodes from the replication group. +

    +
  6. +
+
+

+ You instantiate an instance of the ReplicationGroupAdmin + class by providing it with the name of the replication group + that you want to administer, as well as a Set of + InetSocketAddress objects. The InetSocketAddress objects + are used as a list of helper hosts that the application can use + to perform administrative functions. For example: +

+
...
+
+    Set<InetSocketAddress> helpers =
+        new HashSet<InetSocketAddress>();
+    InetSocketAddress helper1 =
+        new InetSocketAddress("node1.example.com", 1550);
+    InetSocketAddress helper2 =
+        new InetSocketAddress("node2.example.com", 1550);
+
+    helpers.add(helper1);
+    helpers.add(helper2);
+
+    ReplicationGroupAdmin rga =
+        new ReplicationGroupAdmin("test_rep_group", helpers);   
+
+
+
+
+

Listing Group Members

+
+
+
+

+ To list all the members of a replication group, use the + ReplicationGroupAdmin.getGroup() method. This returns an + instance of ReplicationGroup. You then can then: +

+
+
    +
  1. +

    + use the ReplicationGroup.getNodes() method to locate + all the nodes in the replication group. +

    +
  2. +
  3. +

    + use the ReplicationGroup.getElectableNodes() method to locate all + the electable nodes in the replication group. +

    +
  4. +
  5. +

    + use the ReplicationGroup.getSecondaryNodes() + method to locate all the secondary nodes in the + replication group. +

    +
  6. +
  7. +

    + use ReplicationGroup.getMonitorNodes() to locate all the + monitor nodes that currently belong to the replication + group. +

    +
  8. +
+
+
+

Note

+

+ In order to obtain a ReplicationGroup object, + the process must be able to discover the current + Master. This means that the helper nodes you provide + when you instantiate the ReplicationGroupAdmin class + must be reachable and able to identify the current + Master. If they cannot, then these methods throw an + UnknownMasterException. +

+
+

+ All of these methods return a set of ReplicationNode objects, which + you can then use to query for node information, such as its + name, the InetSocketAddress where the node is located, + and the node's type. +

+

+ For example: +

+
...
+
+    Set<InetSocketAddress> helpers =
+        new HashSet<InetSocketAddress>();
+    InetSocketAddress helper1 =
+        new InetSocketAddress("node1.example.com", 1550);
+    InetSocketAddress helper2 =
+        new InetSocketAddress("node2.example.com", 1550);
+
+    helpers.add(helper1);
+    helpers.add(helper2);
+
+    ReplicationGroupAdmin rga =
+        new ReplicationGroupAdmin("test_rep_group", helpers); 
+
+    try {
+        ReplicationGroup rg = rga.getGroup();
+        for (ReplicationNode rn : rg.getElectableNodes()) {
+            // Do something with the replication node.
+        }
+    } catch (UnknownMasterException ume) {
+        // Can't find a master
+    }   
+
+
+
+
+
+

Locating the Current Master

+
+
+
+

+ You can use the ReplicationGroupAdmin class to locate the + current Master in the replication group. This information + is available using the + ReplicationGroupAdmin.getMasterNodeName() and + ReplicationGroupAdmin.getMasterSocket() methods. +

+

+ ReplicationGroupAdmin.getMasterNodeName() returns a string + that holds the node name associated with the Master. +

+

+ ReplicationGroupAdmin.getMasterSocket() returns an + InetSocketAddress class object that represents the host + and port where the Master can currently be found. +

+

+ Both methods will throw an UnknownMasterException if the + helper nodes are not able to identify the current Master. +

+

+ For example: +

+
import java.net.InetSocketAddress;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.sleepycat.je.rep.UnknownMasterException;
+import com.sleepycat.je.rep.util.ReplicationGroupAdmin;
+
+...
+
+    Set<InetSocketAddress> helpers =
+        new HashSet<InetSocketAddress>();
+    InetSocketAddress helper1 =
+        new InetSocketAddress("node1.example.com", 1550);
+    InetSocketAddress helper2 =
+        new InetSocketAddress("node2.example.com", 1550);
+
+    helpers.add(helper1);
+    helpers.add(helper2);
+
+    ReplicationGroupAdmin rga =
+        new ReplicationGroupAdmin("test_rep_group", helpers); 
+
+    try {
+        InetSocketAddress master = rga.getMasterSocket();
+        System.out.println("Master is on host " + 
+                    master.getHostName() + " at port " + 
+                    master.getPort()); 
+        }
+    } catch (UnknownMasterException ume) {
+        // Can't find a master
+    }   
+
+
+
+
+
+

Adding and Removing Nodes from the Group

+
+
+
+

+ In order to add nodes to a replication group, you simply + start up a node and identify at least one helper node that + can identify the current Master to the new node. After the + new node has been populated with a current enough copy of + the data contained on the Master, the new node is + automatically a member of the replication group. +

+

+ An electable node's status as a member of the group is persistent. + That is, it is a member of the group regardless of whether + it is running, and whether other nodes in the group can + reach it over the network. This means that for the purposes + of elections and message acknowledgements, the node counts + toward the total number of nodes that must respond and/or + participate in an event. +

+

+ If, for example, you are using a durability guarantee that + requires all electable nodes in the replication group to acknowledge + a transaction commit on the Master, and if a node is down + or otherwise unavailable for some reason, then the commit + cannot complete on the Master because it will not receive + acknowledgements from all the electable nodes in the replication + group. +

+

+ Similarly, elections for Masters require a bare majority of + electable nodes to participate in the election. If so many nodes are + shutdown or unavailable due to a network partition event + that a bare majority of electable nodes cannot be found to hold the + election, then your replication group can perform no write + activities. This situation persists until at least enough + nodes come back online to represent a bare majority of the + electable nodes belonging to the replication group. +

+

+ For this reason, if you have an electable node that you intend to + shutdown for a long time, then you should remove that node + from the replication group. You do this using the + ReplicationGroupAdmin.removeMember() method. Note the + following rules when using this method: +

+
+
    +
  • +

    + For best results, shutdown the node before removing + it. +

    +
  • +
  • +

    + You use the node's name (not the host/port pair) to identify the node + you want to remove from the group. If the node name + that you specify is unknown to the replication + group, a MemberNotFoundException is thrown. If + it names a secondary node, an + IllegalArgumentException is thrown. +

    +
  • +
  • +

    + Once removed, the electable node can no longer connect to the + Master, nor can it participate in elections. If + you want to reconnect the node to the Master (that + is, you want to add it back to the replication group), you + will have to do so using a different node name than + the node was using when it was removed from the + group. +

    +
  • +
  • +

    + An active Master cannot be removed from the group. To + remove the active Master, either shut it down or wait + until it transitions to the Replica state. + If you attempt to remove an active Master, a + MasterStateException is thrown. +

    +
  • +
+
+

+ For example: +

+
...
+
+    Set<InetSocketAddress> helpers =
+        new HashSet<InetSocketAddress>();
+    InetSocketAddress helper1 =
+        new InetSocketAddress("node1.example.com", 1550);
+    InetSocketAddress helper2 =
+        new InetSocketAddress("node2.example.com", 1550);
+
+    helpers.add(helper1);
+    helpers.add(helper2);
+
+    ReplicationGroupAdmin rga =
+        new ReplicationGroupAdmin("test_rep_group", helpers); 
+
+    try {
+        rga.removeMember("NODE3");
+    } catch (MemberNotFoundException mnfe) {
+        // Specified a node name that is not known to the
+        // replication group.
+    } catch (MasterStateException mse) {
+        // Tried to remove an active Master
+    }   
+
+
+
+ + + diff --git a/docs/TransactionGettingStarted/BerkeleyDB-JE-Txn.pdf b/docs/TransactionGettingStarted/BerkeleyDB-JE-Txn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5927070759282c0f9c32025ca3f8eeea1efaf002 GIT binary patch literal 919596 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�K$V>gf^tcx$B5e!1e{Bd#lrZEN8c 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
  • jEC+j1(z2W_;kFCnN9+c=1t% z1ZU6~rmiFRVdBNpYg(uvAWbQ;U?kRrGG*^zt(RD!Z&SKsIkMd`9@#m4vb$RIAS);2 zo&1SDu*b#A&+S=a>H9S%blakdDh315!?BEo!ecOi8`i%H#2wO>@1JaDO zQ_``-hm$g!vqhsj-K*{%HZ;(th_*~@KGyBRGCMPqA{2o%RLI~RMK0!V)3aaZxIVS7_b>w%J6n|XarC3NYaBO0h{C; zT}6CBXe@TQ`9UauO4NJCl81`N!YF^ZTx&JyfC+VrF5`fM8x`7(%%Q0Ct~KkbO{#|* z7v_1qTxeIMg8iqtWY*F16XI=}xRl9wcQ#x$cx`I#ieFi|kXV?>F5YlOuOtHrI&{F{ z%|pzcp!gKCTrzw#1@fTwL&cU7M~cKMx(I1@DLUr`LSU8G5LAWSl+H`7mw#3G<*Sy* zktUvLw#;4JwmI^XN)~^{Z`mQb5q{IeD6zZO|0IIrhwZguv`Fa?2)^h3HsrF%$JFZi34^D5VCE?<* z?E0k+r4g!aRjL$!hX7PWhfQ(thw9r5j^NB^HPMSxzi~BaEc)5coMure*$=|`-rX~ikF5dQCuaq~{o@o1hi-y@6{ zRROr&>vM-z-N|Jz;qhc(qhr7gzt-ECai|`zf+#|Hj53#2&Q2#BsJ0b%1YGSObqpERw0o2l zs&|0XoW=-yi}J(4f2^`-qPt9H`LI#b8!ODPEjr*!(c72`L&(qz~qDyPJI8=fk^X>LO93f1CVOmiBpG^9`<8 z;m}yHnGoK|^p%+?s8`a(v90X2G^$sMqUAm72= zvM8T<=sZ(8^A8Z2XP9dkIYD;pTglc)tWo65t(+LOmZ%Wqi?`2TpfxV~RkHI2I%Y?g zMtt0O0_Il9WtGskXeZ79E9=z#WQS5fr_#r0t)nS8?$nC%Zd<1Zatf&tw9A4X`tq_V z?#sd$BPD%hvt$R&3m;YCnPfVsQqaaIw8c}nk>rxn>4llljO=fi zUT=1b#ss{AW=!5;i<5C2$5kb80ZBLQR0Sngo?)d9GtmLDpr_mwWPUzV!aSAJ9d*4B z8QRLDqRqXEn=?up0gE#|IIk9*j0XPFW1Lg`>rr;bQ^)%`@qK?}A#OPamIho4S%6LR zu7(zS_Ov0lys=unnb?PQvR+r!e6B`aN(z*Gd1;8!85rsyIJw~es$aLmkWI};JkIr$ z;xQ{nLSF73Bz%OPkfsA#+e+&6Hk(w|vS>DfiHpKbwaC}@c2rMXYS?K++os}=;^OE! zSTw4O^X4zQO_i%s@n&(iFSD#^o@;43$r78Gi`W~Cvh(vxM1Q{Y<6lBAVV4%57|!n0 zVvE(xW2N4FupSrJdXVlz6eq7y@UX1r8rQ+Xm)WDNefR9tRNx2HBxApJUAs38&kn)o zT-jVo@Vry$S-OaIakZO|;xODkZd%i$KV{zWYtACllhyTTu5pOzxA4D)4NAuEdFQaEfsZ)<|x$?CFNSd}x#Se)}$G6BM z4~ZIVN_l5}H|q{{JBX!PAo(y?INe>ESf0qrJ#a8>NW3uzCn=$deq@TKwD-B2V?%uq zBPG+hUkEH5i1`fv{rNmh<-8|(g%1J_dg-`aJ`VKe1uGdS8Qj&$3*C=Egb5(R4uSW7 zX3j&F9gi#^b3BA)!S3t)fJ zZ&cb(8k}Utq`w>E{S+YYm$9(1*!f{}W5_SZ#F?uV1&NKeh3q)leDo3UTW;-K>Zn%* zhqWk|sZ1dZ>~y%y+_EH>>fSHZtq*gYs$Sx%lac<4)m8x;h0%BuzLbHdW>_Vq#0D(| zSF4WNX6NZFF`7`T%~WEUk)S8>QW8y_B_ekuSp4&)e?f@t@@f}Q13&pmTSWW zz!#Lln{8Lcy_z?0+rz<{`U3`T=Yw%3hu#`ntHms76Vm&QGxbgSxN=btVg11Po6^J& zAMl?*7f-S!$CtjXoN)$f&{Ar8Y_90%4L?6#w?*{&hHit=SfNzJG51ijwVHrCUdls8 zE|3FoiYMz>ia;2XR>9XET|aNKV0dP$?x3Mwi*<6k+czhIYJ9hWVz3?WsGl3n1<2Cz zBQwAb%Ir9`PjYA{8wK~SJahg=J^x7s?_qkz*AW3=A=a>+0x z{6e*(*y{~=W!D-bQ!l_`Dgrd9zQF{?mO%LTIT>~%w@=aHVZvsH2RwW1@=94R;^%(B z+#PuxitA^@kbrb{I$#0}Y+WNjtvyo0s*pj=3d3(#zo4LmfGJ;z$(ZAPM0#f)$-kB^{{sop4-rzC)6yELBvdV-kw7U#F%etGGJK zR?Se=n}v2Ve8y7D!^6x9rTRylr${O6}*AKNOt>{{YWTaW^Ci{79B-$;w4!75leEr@I^VXlq_l z4q3G{Wn+SCy=7&W*P` zN~MTryI%m?ELh-f9@|kER)FIC{o`T|pnZ{ku8PgW94)%$rqaY=j(Mhz%F+^^F>Vcr zJ;zBb^TAxjvC8JDw#A(`BoZ>7?{tzj&}rq(eWnUvpV2lUI7fOqQlVe(C*7Vhw2gA#uSQ29~4{DWNP= zpG(eXgtQqrF=6xSKivc0qBhp~uN#pDwvlK>J#W0e@(EYvPZ23)*PO4-A&s0irM2Qq zU5f`O;^#3Z^xt(#o$P75nh^PtOA~B%on^iB$jsmZoO8JgqksdMf&h-u1ShSTdLW7-u!u~=8XVsHasxXYp}Q3Nw8*(rCXzO_omM znJXU3&kYX!_BnPW^G~mQ{DuB(`TN7jVRZ<42uVo2kHR@}cZ50Lsk2!?6WMquD=7k* z{EBC|Mj^#xbif7LVrx=%^c$n6ii68Km|_cV932p5)u}UaSncID_G^*GWWaLzc4BkQ zl19Z$Q0tb3P5(7((p-0eW9{~46j#tklK|EJu-eMEi$j&=@-tc}+Nu=@eXJBA9y4)i z4CAyjzS_0io|J6Nf5`jgQo!^{-;LE}8N8nV@OugZR>v|~&`r*yd{DCyJD!g0pI+fG zC_*{*HxZXCml{VJNB@&GPX1RW%UOFbX8kR@A;d6O+W?n04k}(r2SCfA^0uypluChR zp@4;b)g?)$V5QHgm!Cj#k=?!6nl1n(#k41D%&U`8%eYJH&%w73J z%iGP5zlvhDx7CVC&&WJfb-qep@27s|W5djnm`7BPan=-17J(G(%7HtI4U_z zzVdypk-MJ0p8lDP`h*t@tn?jN%0OqAVC^R+o9ENZ(eVjuhd!iuSf?zn!lT7zE^NP1Vlh0dE=R8R6 zXzE9mO5Q&Cq%WxhX_WM#DAhQmU+}B4(l+o8!y~$)H`AS#BH$&E=I#!+(ONTLt6~IJzq^Nck_G}eUeA3pBhD;sSadBb zJ87eS(PX=^7L;t>Ms!2Xo3G)9U1m*ZO5+U3JL4z_p3lo#?1qr}Wu&OFq(WQ?A~R5^ z$zKuFq(n6={g74!HVos~{3xT5U9#(2us0+Ci$n5qVM3${ zoyOq;7})P_D0mySBn0C??0h$|&$PFNr}3y3C9-`;SNao1<-(A}pe?zuG~p>Twq_0+ zOJ7`3bBWV8XHat8qy6d*1$fpoo09U9_}sEVyBgYRHN%)*RG+Ae8oQRLu6p$dUyS%~ z3lEq5t5Z1tsh&T=1i@=l`$&AMzuQ~}Gf~mG9f3sQt4}Y&mf7s4plC*Sk6v($qiZtC^}%zd1NKIl4ld3FfM$Fcosl)->2pO6;ZS`R%@LZaKAIv*7h(SJvJfNHU*wIM zWyr}6eo=KTFimvDZ-s~b1q$D6z#~Zj@!>L}?mQQzPeHdU2@rD@FCU%1$(or`%LnFU z-z?a1`2vs0W=cdgGo(dbQ0MzPEMmT&u0&it>SGZj0VGI(bv&xQACa3?L348Mudrs-h3+Er922+o z-hWzsCnIteF-<+DBOlvy)HYvw*zgevNh;G)P~D#`F8?UHQ;tOLP-yxo8GbHTdZ8!M zP8L>FRyrn+l)o6@Y#ZGQR4Pg|B>`3+6A*!xgnqnLB+-*i^i-<)=QaIC-i8l)RLjYf zRV`9zcEhJyAtBA#DQ^q)UHm;dm$^>KnV(a4D}2uR#AET^?W%$y_@s3r?frD>u0V8J zbjsiu9+=l_j!ZY=3)x6ePEWS+4C~@PelH{ClU<-$HPQ12Fx2fd1xEs~kF22&=+^ZI zm|+K*_==hN#5by~9VRW3l`xuK=ZK|+8S;Mea1l`y%>?B$gvUxc8@0f+=JH)QkZ+Ay zMU8^@<1=8#aNZ0e(Zhvi2QzABa@9UPhwU`-l7?Y2#naII$ji65hu?(*std`lg!?vR z<7^jj*~gCmjUw)U)4z+hT7OsWUQ!u{@hpC3Qd$A&cN1jeNC0P@YdS5KeCrc^Yi^~(#ZJ_s$?x0VcRmexxJtGEL24f@m2bzj2$R3g0%=fRcPm^M<)=xa^Ohuqx<+P<_-APE=9Y zSJU!`H4>#~m5}9rK|6~R_|yV#h!ycSo=)|y!TLR`f$ns+RU#Y%KIyUf z&iTw5W{JFh%;TYRSSc!91G#qT$@ROISI?b^xE#GK=Hb6u4=Lh|_x3!-sfR0W)fW-6gLDArry{a#R(XUnSm#fH;li#RdOGEyUG@^;cM zm8JPO-+~Hl?S^I1)aki7u~MxQQ|jf@Qbzsietx0y`p4)Zg$`NVp6!+C;NSirEW5W9 zUi@QAYxIkam$^JI51CM<*xjE>Z67JfD=A8^+T6YQ^v>Pj4zk~F4<(QP3j1o@Cg8u7 zJ;yS-PabJU(7+pw4w-1Fgmm4f%k&Fu`jlY3h>&+#$&=#s)En3${`|gK2jb|(lQZJ2 z4Zjz=Cc*lrN)VIGA%|O6U!8$w*Gylt=j75DU-Z!k&}iC`l}u|7vU%VF`}nQf+ty0! zlKi9S^DPX~Lnds(OjIszaR8G?XR{Nrw!gUAAn)qjG{eMN!3$=trL9Y~6RVr%pQ){x zxUGwUcT6{_&N+TT>ClQM_5VolHDo9gk$+K!td%NRc6D8bc$go^c+dD<7l+R!J$A^^ z53;X{|LRLof3NLIB17XVUC6i)gZ)}ciWk-G+uOfue;soY4M_lL-#vT`;n8MAf{E{h zr?zW2+s}orSsE0j$e9;f${QK6!yjf)BUq}u|G3NkC0Cl(b``Bie5kY+x5jci17gF4 z5W5+WjF$50ylBTAh<3ABi9%rJ(eQCl<15G&S@YWXFRfA%lrqdwgO`(O&L?8c#*Xj5 zwx4x#EGevt(@o}!w|OYX5}8+6UQtnA7#b5A5*qU$y|}u%*c(pnVDys1E=I}bxdLa@ zl|KW9_&S)lz&a)NI+2F|pxqJ%BmvgG9wkSHOIi6#RLs}bd3pMQ>pfD9v=I%fbXKdI zR)QNX(z$ej_3#<%kYPtIUn?r|cB23|v&!e}uV9S{0s zPU7&Bjqhx~p)4A6@`4#4uquzGUdyqx^`2oCDzn`n4{cihn8Pil{0rSV*GJ8 zGot~@@8@;7Z#${;N!`&AQ>wdp^<(ua?3g^=X=H>Ew8TO4gWN2&mDFulCnE=EGcSEI z!<4?!FY?j39uaxj%#P6Xm+2~xHDxZQ8M$uH6yac|-T%*|^r9rpx2HC!!GOdBqHr>i zsXb6(Z_e32fMZN>Dru`mS1U2k8Pl2)-|cd->=A7?iuR&{qG}c;3j_9be*W+HH*`Y@ zGtyZ2bIlv7$DlZier7DA7M9g#9m>Y_kTC%~Nsu0vb~`AF$vW@m0J`bAW;V9i<004S zz1Q1%8c`9M>#Hbvz@q0+EOc1b+EAn2SoXy$|BqUu?97*ieLCzpIkI4piH;E~sF;Ac zC87F9$sj5xT#s8OMUT#`xp>S=UjBMu{`V$E{nYqLHvDrE0JyM2bZy0_674gF$Puqx zWs8S)y#{w=Vw;Nckr3~7FqM?jQxNErEd47p=41A^+(mAOZg~$)m5rjQW;=9oWHp(- zQtsZw&7xi6PC^Aoa8Vg8eT%b$2v4(Zf#tpDZ#IogvckqV;M`wSgYpG`7>aIF5wcrmFdxruSBBE-Ri4{14>`T1QL6cPe(znfp;bQ*t2 zj3o+i@+*J9m=~YEc~D+|8B&GC?qN>Gbyn6stEs3-#=SuFIE7aIWdAy5teX9%Iy%=^ z-eEB%DCh&Nyh3=7mbR5!`>8b%x*nzfQq4j^A9U-Ju@?_TXWP(Fit0F&P6OH zJ(vZaSr7sb2?~MJ6y#=S=N2e$ZrbzMujs%Bjy!g@^<_o)KZGmg2Yk&Dl_&5FA33F|F-f&W;yPj7}$;E596C;xx-LOxYGmVya z-3zEPF@JJ8czGSUy05E87Wo3yaopK>Tt2-Z(Nvj=a54ARyOTpCvlM4#WBc4a(%tSG z`~a-0B5>tYIpBPC{|4)KJy8?D2H+pMKUQZ`auEnm?YvtpIJd~?9br0vL_Yj*>c(cg zt7@`_qS2{R#d&6RjH&>CsR#Az1Van3RVRKkA^F80tX6%If|~Rs!0m1I!A2u5Kk-Nn zbe}@3{D!@mvXdmhJ3qqQ$xPFhpFG}y1b9^JITy!j)FSh6y>y2v z{46V?AiV$EvYSjAiotm;a>Ry7^<}z`*qX3Z)YrQyb8lSQR}bdToa16W{T=Yv>H8qt z32?s8=-^VEf{4S5Jg)m2v+=J}e1GLw*s}X=Ilcpbmzg}b2_1s)OrhIP%ZfF#MicD!s7$QrJeat!9zX}4a8d@Bu$laAo zmFwnM-WiHW-Dxd~khJM_aV`N(``F|>3*NO`ocGXW)l1vDSEbmeFI>X*;#|+?9=&FJ z-<5c$d%pk*qx?$va*{TiCK?mlp`zO=sqgk35oy;d@AIz72|hPxKY7~VV%hOfohG8u zK@&LLZ}5ZlR|9_LDBl=UhzKrf&>JjrrdCUtF$A)#d=O%h+}Z#;K*YZiY+|p+PH&kS z?RU8gmA$Wf@w>39b!3>?Fa&SzKj?2m^@K3GY0}XwgrSijw#}o1OpA8~)!RanN(ItjpUmYl)DQ$+%Fd*8tQI2(_j_St8P zE=I_ePi9pAYEED!wU9d~xLZ%kE@+?#zQ$Zr)nhkBvwFZNYfq zK-2M$NDt?i$h#G>ua-9BqI=1H27Wk~ZqPwPnUMZiJT=* z80YL_TOnuzNggBRD!&2eZe7*Bs2oFU8U|kmd!ds(zOYNrx<#Ku9C-KJ*Vvp1MhlJz z-+{*~d8IEo=Fsvy>m{?P^&waIYMVYgs8Q423~{~mf|AxoET6iUdi8hA^;bCwz*Dhd zw$FyIJz6T=8m#d`24X&gWL#eooEDmZVvACStv7Wypn0D5YHHK-z9{7L$G-GA3A8?m z>?)Dz)^9LY`@-uZT7)`un{$aCbb$ou(N+@M+nw9@dZ^9=#w{m23D564;VLR7vk_{sHE1jh7WTnXOjVq#g5bK zWd{cxOOc*llZUzBWrU;Pg{#(2Y%(jJ-_(cbLWIA3ukiKv+j5OYOFGA*ne-CnBF|>r z3?)Wpc3B!sH?!PRy+z5-7R0KqUW#)lNYj75KR|6Q`)3_je%D|&J`!L_Mo!e5PItrm zvf3&eHXk3B-etif)xe}-?=Hu9ItXiAsF^cathpCcBxWn_lic2%Y=VSSy(zbUbrgRj zv7#Jz-Pnw=S-8GEF~e&WS{C@Mpt6m}n3X8BXBNu zEDg}%xvy4P4xxlL52?h$+#buST21!XcIi41G%unt!Y#P`k?pjiM(;&)moh}vvBp@} zq+Nr?-h9(%=sa4=;~M;ZF)tQBxNDjn%MjW#`sDpu`fF_wEqA5b;e&-#xpHX!(qh2d z=K5XajFj4K!}NKncIdhr+S>^;cwh2PVa33PaFcJSx-Bo0!XI=Auh*1E75Z4mrAB<6 zh)uJp9|DdqZ=n%v))+pJt)J)a89Ev1JYUoBDCvh$cDumm;k7Lu!K6}WnyaRU8}S?p zbew(_E#RTyJ^Zzm;uE=j-d9iolZn2oNdFkT45AuF>&xNsZ76Tpwe(TE-<4`vh2ubG zh^diujFXe%%n)Z(o1CbObc7adz;d9AH>?-TqTfLRd@>HM^4-l>R+L&z?8D5*o|KF- zrH42_^a!wcS28UVjTNZ*xtxL>U5&M}6dShZe7}z`+FW(`Sh9Efzym>i=CjpCMNpk% z37hf~dM3EY*#>sm$>=uyICm&)?~%Gq!DZU96B!+l@quP4A(AtdiMrlHg;OAM2n^=X zQ7B{UGdqD)JjXcI%RBo^{0LaV`g|LnD5w|j`JR~hOSLulWVK}G=ryRM#ZTW~d#qZD zZ^dy%P;`66S33M#-@1Z`pBlc{_761y7zrTI)@)g=#zh9Z8K{VpQ1mvVCAUf4xbiGn zFa83*-pieD(zocb@g~>=e4hyZ`k(AlPBI@ z^A^hX6UAy6q|-6}Ki^52{|13a4j(%;$mZOQ9tH)h!E(1S1z+Y^!nz&2}%3NYMs>lz85BsU~ZJmC0#g_sIn)h7W0 z!WRAsV-@V15(#k5>DdmDJ52fg@YN~q*JGl6J1&{+{Lw7zUi;~e=@}6YOL0A0SNcMA zCYI4#K|G~vhvj6fr;-4#qkmo`0YC*gZ6Ak<`ss2BqPv=1r;OnRMdo+qW93ZCeY@qo zUW#-M;g5Y|0}3(SHg0w8;t#TWSKLJ)Ey5i_(vasn@H`dPe{~2Ik-=tZt4QX^I zqQ*pJL@8*}|Cy;TwvUed)>%vM$psQ1fBg49yJ(5q``;(P^vK_)_4ic$Tc7{XC(X3L zdQpQW7(5Fb*lV{k(=)o!ut z_+saY+vCR>*wbBxyB6#{pl>jaK=J#as}JojyUD5$N}O)^3j~m#F(pW%86CG{Yp}+&HZV#$OOT)n_XUswt@J^ zOW%e{4#ow?>kcJgX=j%jWjVF1-DxDkVZO__c&gU~x$*()2cZe+kz9)gEUh&SY!FDF zJ`l+QvvE565LV<3mjK$Ng#%~XWrSIz%;Z1d7rz+?FDu+pVweAj#FY!Y*2HCW{@SU3 z=2K+<18Z{h7LAs2I}(+ScQ19DI@TMR_GwP^SqaKFoc>z&Zx{%#i`gx?C8fn%eih;$ zrx)+n2Yx>>ZavV|k(jgnzJQ2jYbVOu2%)gK)K*q|%o-fdZKJgqSHuE6WeMCb8>xwH z_-OF{KYks!CCw4dk>^j{F)*brzmA{|L}$D|7BT@D4C55;5OEqEps1>}vEedQzKfp! zc>WwU-l4A|Evi$e*{ubFfPo;e7FdWcYJ_aGMu|_Trz1Wt-sWzws~^>WocDF>Ixcm= z^*{3Z!kn&GF1Gc-zMtcAgPgl7ZAV`dw$s^(CGCCJx_6>2H2r7HmBPFk7VxB$Vz6l2 zDer5&=kIfn7C(4_&&~U{qIr8W{~NTB7rACP7#Wdq&3EQhf3@BIyD!=ar1enTRSOl` zQop#h5760;}NK3td-zS4xU`v{aY6O>A#7V)=-E?L$S81Q!uXyok zrAzVU)O{kFx*g*(Ch)oHa^2dDP6F#02BukU`Y-`ZOZgY2 zPizBwtEO0y{=!1F-P?r0WA1YMdG!SPX1ALbEUV+I-h!3wDFGI~A$Su)dp#C$ft3>` z&>rpAI}Xgw5@-Y;2v27>6?h35SZ;Pbediquj-KoJO0++Ezs0oXjU}S{cgTFA32j7$ zJr4Ea(06T1a)Tq5q3dZAeHLK_)R(CjK(a~?P>Vlv&DLQuFUD4&1z%cpuhSD3f)H7< z&s@kG|L6)6NaY6~+;*1Nu}KmxPvQ1==(tgxhfe(8mv8((U;h6I=kni9?*EUVfg@v( z3ZLj-L9~^*kZ`hx4J((uY%4Z#6un-bjzzOEpKegin3y$xkI2ejU~y~0$_Wd5o~SQF z5S>6BZ9PqWh*XC@Nb91A-M^x%>Lo&jtPx>@sC{URb0R?ZG!TmcHq+WlvHhMnKQGq3 z`7_rK^ZO|VaKdcTS=NF{Ksws5x`IiSyM#6MUhQi}3%2?35iWk_IO4yC@zIHYo7dmd z^>2OtsZUIE&I1Cfp8Z9H;?xNj7Q#XXJUU^i_`E0Z2~q6KBQz{_r12wo4LZ}OFU;ru z6l|vZsUWIGf$IhP^PPFESfT^^X1QXHBjFaF2OdQ0OSmyL?48&(j}nVZwqx=w@O+9z zIIWf>Cp^AeP*L19-fNg0Q+_iW>QdN80*E?))aTHuBVO~5Lp~*M4ZPyGAvLh!0c{oyh;V-me@ zwVLL|V&lS=)ArP|vXME%Tx;2WB||*^2eE5*1~WAwbMT?FgaJqbG&k)eC^3Qa)#GU| z*O@uGq~gb?SUyZoq*2Zq^H$69`Nx*$l$LcKdiV0_(Orz)A(sY8d#qzy*``yCWtx9| zXnS?yWyNKN)0c_qU9msxi^vk+=FP^Iq37_SMh_{Kmu{!-}I z@9qI_l|B`~{TK9ePH#KfHJEAQhS_eET9**FHmVJoon@1SbaWU|0Xvs|D&YqSg80pp zg6*`dj5!mj#W5`vL*g61uOH~@#CzNsRb6E@YRZM_2YWoMp!HI$RRf%z7voBMwIO#? z>SH1dm1^pCFn&^|m=FJWJuoj1Aps;@Bhjh&0%x-|?0x|#olA%F%H4iP}RHor#Fwe8E4N+31K;5gBd~`|nsk7?v&#X;pWg>g* zDf7U(dkMFyD#fr+_$u8+^*oibQdQvVg}k@dE<8yuz+T;A%)od02hJ@HNjZ=Jylsfc z)5SJe^I5W-&E84Ld$Ei5P}6R-wky44>XnO6hMI6(4`(`U96a26Ho>7WDUzDDMYPeQ zA9!aZUgM5rzh<*}=pP^TG*`+d*>4x!73E;L*|0ZUslcK7^bet|*UnG9{LiMoACyQrY-oJKludc&qK1Okw`%rjY%G z(>l3#$MA1MJ>**jUr~1ea}!p=keDw;&y+v($YzEG1g7H%IEOYI;n=kmrGH>bbev}* zl>QO}ZMRzIE~KGad4xnv*hUWxY4V5m!smsqt`4oQhJ&;kn)h6FKup$HXNF&8GLi$j zd~Q+Vt$tHZhaoeM`Jy8^8nJ>ytg~pX!CM6nw1ax`b0a`1A9HOlzwRY|e47>@@UM18 z0#y24p{;aNEG{h5(=IY`Gst^Yjq1+M zVIp$t&brCHhk@&JBmlC$ZMZ^phr_$;#32~`VHRP`IDR%cezH+*nP&v}*2~#fdO0RV zPwurL1N{#oeBSIHEUgsurWUdYXlk6h4GG&{chWf1D(U~<})qTdacOG%IK>?Rm=O@^jl-7C(x zu1cqL8EdSXF|mL<>a?h0@}>?&pTcM(I?Nv#%rcAJz7~>|*JJr;I^2d&$6!v6mq~$! z#$d-qGL$UjD*N+L`e-d0?u+w96m_B(?m+~9 zZsZ6rUXe7eLboCOZYOnW?OqvyY;esP;>7~Tr%wiDW#K{e+&E^MqIdmz)~iJakTK3M zna!N@C6W7ghOLHwUH@U5-19r=DaG$rPZtVMKqVhG}k1G@A{GHk+c}D&zxp|;QOw5R4eRPqDSJe2; zToQAd%-0D`>wRpeBwv-Vf{1l3MHrEfFT;2_daOrPRw&E0>2d9J-4W{Ywhu71ilAFxLw|to>K?1U;9udVU#km zY-cIXk-@1PD8HUEkq))k9e6uB?zWxexM0*Fc}k0nn9}8=hX?e6G{MjP$O$^cS7@-D z%Ey@uZtheE7f!gO++k60mTy`~aeyc+$F?-VyML>2JmsVQ&( zz7$oF`5`C~O=85|uPeCws9{U*`-=mRJW~Pj;9l)DH$!r}GvU#xQ8iJ~=hk5+2Gc=Q z9Ov_Ab_6|jZe?u`!_Hw-NluZH(uH``TZ+=$oBdy=gF9G%-F*c7B2>v9_vR^?K@b%g z_1?nS?n8O@$S$kx>KTVEXV-dCLX4Ik^R&auW<0 zv_-TBpOBq?`Y&D0w6rQjPf(Oa@F$e#^jPl4c|E2`P-BNs-jQRA%znS+$XikZGzI#q zN~-##sMtiub13k20lGxv{t!Xfi%CViM6T~RGN!QaQ%H(6j)zkV)8RT3HJHWZv(1LB zJnN>UbD3PqkKiFbJ&wPYcs8Q5&YSuAIOJi`C9&H#zoBY59zcXUonhZL zci*dZSN!uJ^pywUJ?r~T6k>L4@`;^mKOFXxU+8JXq_;E0_DqfUshLFfYNC|*`JE}9 z`O289l*^c-tMtfj$*iQ%7vD>`whZ@q5V4fP5N#d$GFLlBfzO436aL(iLHTa5)oy{H zgzw1OTeRP8NAqIrZP-Ir!Xmv!JsRQA><~Ij_4aJP6??O^Kvw&R_6Y|JHZsXY1h09H3UGh=@z%>t=65s=q-+Q0@~+4KFs zTz_VRKKDnZbltn3hoFIKt~Lz|%NhI)Vgh1I|NXs8-|pE$+<*J69Z)xozQbfx(gOWJ>FM7BS=3E`#whQm7H4T6oUE6pAJ< zFKr^ve+B<(k^~@=6^4rUnGOY22*77*Jw2I>Z7dz^iyG)`psXvUVb`l9x1IZRSn09o zidU%43x%FOFM0e?v2Vd(UT)ES$g&vNe4|8GjgT~8aSGd@vN9jK@oT3sp}FFv*JV_B z5s`}uSrOjo-{&!T_Mpy2uv=sS&Jr#x2AM4H!^4IP;y;aCrA5h;NPw^no1zjQ?ZkD=;{4fs#zRD^99Dd_d|PUuuHhC~DLgwrrFJJUcV=v& zPWOtQ*Jbi*d&^k_2L<^j6F~XUB=6K}USUc6XVyJC#LVvTozuUnrragO!OE1T|L5)g z-OAmx3^fF_TLCI39-a)u(t}27aHhBN9P8JAZJ(_L6(e2Bg4^rsRYi)s*Y{~XUjxbC zQBm}|zA|o?mGQdLH{4RbePeUx5YgbIqi=QK(-%|0{%-D6&T9#%hj4K%Z(lF~mO{6t zrA{5Kb5u)BU8(hzVloS#{2UCy{TqhiqZ>!9CrY;LO9)h>ibHO^Vi z*cI4%3V2)d6#n2PYWX{OiA-QA4!gHCqLY|f-zpPwOjkR&Go;>?(C3*MNC_1ZO3H(|MP zE3#G6;}vSuLL4JXBQg;m8QpEiW51a>cot7>bdrZ|&8b9~dHdhNOEp_B%-2;yeW7;G zaL{Kd@SyfJx}L5<`FiVlzl2yiCHZ$bdm5kTL_G~aryvDNQ7)@hH^Y7--~9zZv%r(h!Kb|`&s@lbKWQNhGbYh0=bg+La=0f zEHkmqx8cIrX$Fcymob0Pg`)nMb_Jt~NIaJsQU_)wRQ+h1Nywba~!*Mk|k12B@7MBk6opZ-drt?Ay#TOyx3+ zD=bx@RvycN^gPS55lCFkyeL{bdna}mbm;qKQa{k@W(? zs4oO>Lh$W{x||jvcLQhUMP~T)6+CMV+3JUnH82Gsk5IIxWQE0@PN3Q&EpSSIZJ?x2 z^4+jLLx>t#L1K$vgY#j+c%o>WPl*SrPlUM#EBl@ER8o<7gL8oY9lZ>V4pE~VX@6P&IQEKUaR}C!{>q3Kd zY4D{bN-G7QVy?Et$BR^|nu`<9x_9`5r%=`4=tBL-+u>CCMq5!=_|1)g%GWRQB~*u9 zfZANqVq1$KRJEzXq(@?sGuFX`z5}Vynw4(b<%4Cx+h@c@7mRbenY0hFa+|{6qZBQ$ zLL5jojj6AXo-``bb5K>ut%zlh%DLOhKZZuGPVN`(%B~ca#M-Oq7pEk*)MhN0)yBV* zc)`aWY*nBB_$}PfiapnSw5JCmGP=bf+GakHSdXr<41G>N=m2=y}S_{$Gj9WUXFFLHRE;22v zq*9EVa>E;8p(iiiWo12aRSU@z*Rv6~^3r~RsQ6}fG3cwa6DyMwrc_bf6*JWI329zQ z&n!wSD^B(9t0ngma=D7W)QkDmn5LCmt;l{S8TCCRjdF1&_r>}0v9WP22xL@iyi-j@ zg-oZmwst>P_L1AGPN^kk3xEP=dxFK_P>8AwW{mG7{`r+9wD=2Xeo%9)c z{leQ$Ey&8N6ZQM|;LL%%)S*Z%Bqi5naVB{%^P{J?_}rd{7XR@^<}-J8=+*3?t7G&Q z5%)s4qqQZnBc3TSzsv;Qy9)sD0gku#DmHbc8*sMPp(nq3TcvwEz!%~jkPhPprZs?oAau_)1?n#gBzg08M6C}@A& z2}I7As8!dTy`MJx#a~xjkGef&<6bxXEIWuJC?Vl$=Y+nsV=;?Ge*Sw?hfir%5r#=r z=U^N5pkgDEfJfBetDzvgF2m zy{B-EmSs$K4sAoG8|~xtLX78esY?z~fex zKu8QjE{d0joFDpU?Oj_Ez?=l&V_R34RZMF>{VqNjF{K7!1hMMV?$a~ zmKn3N+g5_Yc$sJyY@l+g`~O>$-L_xIi-=Uz$0%x1e3FW!sDKQg>m_JT

    lVg!Yq+)C|F?lik5t8q4Z*P-k7k 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

    U15Ro5?!;{iJyo*Z}p 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

    |70i0DZQBLtsC)f5@(qOUl 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

    w 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 + + + + + Aborting a Transaction + + + + + + + + +

    +
    +
    +
    +
    +

    Aborting a Transaction

    +
    +
    +
    +

    + When you abort a transaction, all database + + or store + + modifications performed + under the protection of the transaction are discarded, and all + locks currently held by the transaction are released. In this event, + your data is simply left in the + state that it was in before the transaction began performing data + modifications. +

    +

    + Once you have aborted a transaction, the transaction + handle that you used for the transaction is no longer valid. To + perform database activities under the control of a new + transaction, you must obtain a fresh transactional handle. +

    +

    + To abort a transaction, call + + + Transaction.abort(). + + +

    +
    + + + diff --git a/docs/TransactionGettingStarted/apireq.html b/docs/TransactionGettingStarted/apireq.html new file mode 100644 index 0000000..8414095 --- /dev/null +++ b/docs/TransactionGettingStarted/apireq.html @@ -0,0 +1,176 @@ + + + + + + Application Requirements + + + + + + + + + +
    +
    +
    +
    +

    Application Requirements

    +
    +
    +
    +

    + In order to use transactions, your application has certain + requirements beyond what is required of non-transactional protected + applications. They are: +

    +
    +
      +
    • +

      + Transaction subsystem. +

      +

      + In order to use transactions, you must explicitly + enable the transactional subsystem for your + application, and this must be done at the time that + your environment is first created. +

      +
    • +
    • +

      + + + Transaction + + handles. +

      +

      + In order to obtain the atomicity guarantee offered by + the transactional subsystem (that is, combine multiple + operations in a single unit of work), your application must use + transaction handles. These handles are obtained from your + + + + Environment + objects. They should normally be short-lived, and their usage is + reasonably simple. To complete a transaction and save + the work it performed, you + call its commit() method. To + complete a transaction and discard its work, you call its + abort() method. +

      +

      + In addition, it is possible to use auto commit if you want + to transactional protect a single write operation. Auto + commit allows a transaction to be used without + obtaining an explicit transaction handle. See + Auto Commit + for information on how to use auto commit. +

      +
    • +
    • +

      + Entity Store +

      +

      + If you are using the DPL, then you must + configure your entity stores for transactional + support before opening them (that is, before + obtaining a primary index from them for the first + time). +

      +
    • +
    • +

      + Database open requirements. +

      +

      + + + Your + + application must transaction protect the database + + opens, + and any secondary index associations, + + if subsequent operations on the databases are to be transaction + protected. The database open and secondary index + association are commonly transaction protected using + auto commit. +

      +
    • +
    • +

      + Deadlock detection. +

      +

      + Typically transactional applications use multiple + threads of control when accessing the database. + Any time multiple threads are used on a single resource, + the potential for lock contention arises. In turn, lock + contention can lead to deadlocks. See + Locks, Blocks, and Deadlocks + for more information. +

      +

      + Therefore, transactional applications must frequently + include code for detecting and responding to deadlocks. + Note that this requirement is not + specific to transactions + – you can certainly write concurrent + non-transactional JE applications. Further, not + every transactional application uses concurrency and + so not every transactional application must + manage deadlocks. Still, deadlock management is so + frequently a characteristic of transactional + applications that we discuss it in this + book. See Concurrency + for more information. +

      +
    • +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/autocommit.html b/docs/TransactionGettingStarted/autocommit.html new file mode 100644 index 0000000..bf6f71f --- /dev/null +++ b/docs/TransactionGettingStarted/autocommit.html @@ -0,0 +1,166 @@ + + + + + + Auto Commit + + + + + + + + + +
    +
    +
    +
    +

    Auto Commit

    +
    +
    +
    +

    + While transactions are frequently used to provide atomicity to + multiple database + + or store + + operations, it is sometimes necessary to perform + a single database + + or store + + operation under the control of a transaction. + Rather than force you to obtain a transaction, perform the single + write operation, and then either commit or abort the transaction, + you can automatically group this sequence of events using + auto commit. +

    +

    + To use auto commit: +

    +
    +
      +
    1. +

      + Open your environment and your databases + + or store + + so that they support + transactions. See Enabling Transactions + for details. +

      +
    2. +
    3. +

      + Do not provide a transactional handle to the method that is + performing the database + + or store + + write operation. +

      +
    4. +
    +
    +

    + Note that auto commit is not available for cursors. You must always + open your cursor using a transaction if you want the cursor's + operations to be transactional protected. See + Transactional Cursors for details on using + transactional cursors. +

    +
    +

    Note

    +

    + Never have more than one active transaction in your thread + at a time. This is especially a problem if you mix an + explicit transaction with another operation that uses auto + commit. Doing so can result in undetectable deadlocks. +

    +
    +

    + For example, the following uses auto commit to perform the database write operation: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database. Create it if it does not already exist.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null,
    +                                    "sampleDatabase",
    +                                    dbConfig);
    +
    +    String keyString = "thekey";
    +    String dataString = "thedata";
    +    DatabaseEntry key = 
    +        new DatabaseEntry(keyString.getBytes("UTF-8"));
    +    DatabaseEntry data = 
    +        new DatabaseEntry(dataString.getBytes("UTF-8"));
    +
    +    // Perform the write. Because the database was opened to 
    +    // support transactions, this write is performed using auto commit.
    +    myDatabase.put(null, key, data);
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +} 
    +
    + + + diff --git a/docs/TransactionGettingStarted/backup.html b/docs/TransactionGettingStarted/backup.html new file mode 100644 index 0000000..5e44c57 --- /dev/null +++ b/docs/TransactionGettingStarted/backup.html @@ -0,0 +1,317 @@ + + + + + + Performing Backups + + + + + + + + + +
    +
    +
    +
    +

    Performing Backups

    +
    +
    +
    + +

    + This section describes how to backup your JE database(s) such that catastrophic recovery is possible. +

    +

    + To backup your database, you can either take a hot backup + or an offline backup. A hot backup is performed while + database write operations are in progress. +

    +

    + Do not confuse offline and hot backups with the concept of a + full and incremental backup. Both an offline and a hot backup + are full backups – you back up the entire database. The + only difference between them is how much of the contents of the + in-memory cache are contained in them. On the other hand, an + incremental backup is a backup of just those log files modified + or created since the time of the last backup. Most backup + software is capable of performing both full and incremental + backups for you. +

    +
    +
    +
    +
    +

    Performing a Hot Backup

    +
    +
    +
    +

    + To perform a hot backup of your JE databases, copy all log files + (*.jdb files) from your environment directory to + your archival location or backup media. The files must be copied + in alphabetical order (numerical in effect). You do not have to + stop any database operations in order to do this. +

    +
    +

    Note

    +

    + If you are using subdirectories to store your log files, then you must backup + the subdirectories, making sure to keep log files in the subdirectory in which + JE placed them. For information on using subdirectories to store your log + files, see the Getting Started with Berkeley DB, Java Edition guide. +

    +
    +

    + To make this process a bit easier, you may want to make use of the + DbBackup helper class. See + Using the DbBackup Helper Class + for details. +

    +
    +
    +
    +
    +
    +

    Performing an Offline Backup

    +
    +
    +
    +

    + An offline backup guarantees that you have captured the database in its entirety, including all contents + of your in-memory cache, at the moment that the + backup was taken. To do this, you must make sure that no write operations are in progress and all + database modifications have been written to your log files + on disk. To obtain an offline backup: +

    +
    +
      +
    1. +

      + Stop writing your databases. +

      +
    2. +
    3. +

      + Make sure all your in-memory changes have been flushed to disk. How you do this depends on the + type of transactions that you are using: +

      +
      +
        +
      • +

        + If you are using transactions that writes all dirty data to disk on commit (this is the default + behavior), you simply need to make sure all on-going transactions are committed or + aborted. +

        +
      • +
      • +

        + If you are using transactions that do not synchronously write on + commit, you must run a checkpoint. Remember that closing your + environment causes a checkpoint to be run, so if your application is + shutting down completely before taking the backup, you have met this + requirement. +

        +

        + For information on changing the transactional sync behavior, see + Non-Durable Transactions. + For information on running a checkpoint, see + Checkpoints. +

        +
      • +
      +
      +
    4. +
    5. +

      + If you are using durable transactions, then optionally + run a checkpoint. Doing this can shorten the time + required to restore your database from this back up. +

      +
    6. +
    7. +

      + Copy all log files (*.jdb) from your environment + directory to your archival location or backup media. To make this process a + bit easier, you may want to make use of the DbBackup + helper class. See the next section for details. +

      +
      +

      Note

      +

      + If you are using subdirectories to store your log files, then you must backup + the subdirectories, making sure to keep log files in the subdirectory in which + JE placed them. For information on using subdirectories to store your log + files, see the Getting Started with Berkeley DB, Java Edition guide. +

      +
      +
    8. +
    +
    +

    + You can now resume normal database operations. +

    +
    +
    +
    +
    +
    +

    Using the DbBackup Helper Class

    +
    +
    +
    +

    + In order to simplify backup operations, JE + provides the DbBackup helper + class. This class stops and restarts JE background activity + in an open environment. It also lets the application create a + backup which can support restoring the environment to + a specific point in time. +

    +

    + Because you do not have to stop JE write activity + in order to take a backup, it is usually necessary to + examine your log files twice before you decide that + your backup is complete. This is because JE may + create a new log file while you are running your + backup. A second pass over your log files allows you to + ensure that no new files have been created and so you + can declare your backup complete. +

    +

    + For example: +

    +
     time    files in                    activity
    +         environment
    +
    +  t0     000000001.jdb     Backup starts copying file 1
    +         000000003.jdb
    +         000000004.jdb
    +
    +  t1     000000001.jdb     JE log cleaner migrates portion of file 3 to
    +         000000004.jdb     newly created file 5 and deletes file 3. 
    +         000000005.jdb     Backup finishes file 1, starts copying file 4.
    +                           Backup MUST include file 5 for a consistent 
    +                           backup!
    +
    +  t2     000000001.jdb     Backup finishes copying file 4, starts and 
    +         000000004.jdb     finishes file 5, has caught up. Backup ends.
    +         000000005.jdb
    +
    +

    + DbBackup works around this + problem by defining the set of files that must be + copied for each backup operation, and freezes all + changes to those files. The application can copy that + defined set of files and finish operation without + checking for the ongoing creation of new files. Also, + there will be no need to check for a newer version of + the last file on the next backup. +

    +

    + In the example above, if DbBackup was used at t0, + the application would only have to copy files 1, 3 and + 4 to back up. On a subsequent backup, the application + could start its copying at file 5. There would be no + need to check for a newer version of file 4. +

    +

    + The following code fragment illustrates this class' usage. + See the DbBackup javadoc for additional + examples and more information on incremental backups. +

    +
    package je.gettingStarted;
    +
    +...
    +import com.sleepycat.je.util.DbBackup;
    +...
    +
    +    // Find the file number of the last file in the previous backup
    +    // persistently, by either checking the backup archive, or saving
    +    // state in a persistent file.
    +    long lastFileCopiedInPrevBackup =  ...
    +
    +    Environment env = new Environment(...);
    +    DbBackup backupHelper = new DbBackup(env, lastFileCopiedInPrevBackup);
    +
    +    // Start backup, find out what needs to be copied.
    +    // If multiple environment subdirectories are in use,
    +    // the getLogFilesInBackupSet returns the log file
    +    // name prefixed with the dataNNN/ directory in which
    +    // it resides.
    +    backupHelper.startBackup();
    +    try {
    +        String[] filesForBackup = backupHelper.getLogFilesInBackupSet();
    +
    +        // Copy the files to archival storage.
    +        myApplicationCopyMethod(filesForBackup)
    +        // Update our knowlege of the last file saved in the backup set,
    +        // so we can copy less on the next backup
    +        lastFileCopiedInPrevBackup = backupHelper.getLastFileInBackupSet();
    +        myApplicationSaveLastFile(lastFileCopiedInBackupSet);
    +    }
    +    finally {
    +        // Remember to exit backup mode, or all log files won't be cleaned
    +        // and disk usage will bloat.
    +       backupHelper.endBackup();
    +   } 
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/blocking_deadlocks.html b/docs/TransactionGettingStarted/blocking_deadlocks.html new file mode 100644 index 0000000..3a59493 --- /dev/null +++ b/docs/TransactionGettingStarted/blocking_deadlocks.html @@ -0,0 +1,610 @@ + + + + + + Locks, Blocks, and Deadlocks + + + + + + + + + +
    +
    +
    +
    +

    Locks, Blocks, and Deadlocks

    +
    +
    +
    +
    +
    +
    + + Locks + +
    +
    + + Blocks + +
    +
    + + Deadlocks + +
    +
    +
    +

    + It is important to understand how locking works in a + concurrent application before continuing with a description of + the concurrency mechanisms JE makes available to you. + Blocking and deadlocking have important performance implications + for your application. Consequently, this section provides a + fundamental description of these concepts, and how they affect + JE operations. +

    +
    +
    +
    +
    +

    Locks

    +
    +
    +
    +

    + When one thread of control wants to obtain access to an + object, it requests a lock for that + object. This lock is what allows JE to provide your + application with its transactional isolation guarantees by + ensuring that: +

    +
    +
      +
    • +

      + no other thread of control can read that object (in + the case of an exclusive lock), and +

      +
    • +
    • +

      + no other thread of control can modify that object + (in the case of an exclusive or non-exclusive lock). +

      +
    • +
    +
    +
    +
    +
    +
    +

    Lock Resources

    +
    +
    +
    +

    + When locking occurs, there are conceptually three resources + in use: +

    +
    +
      +
    1. +

      + The locker. +

      +

      + This is the thing that holds the lock. In a + transactional application, the locker is a + transaction handle. + + + For non-transactional operations, the locker is the current thread. + +

      +
    2. +
    3. +

      + The lock. +

      +

      + This is the actual data structure that locks + the object. In JE, a locked + object structure in the lock manager + is representative of the object that + is locked. +

      +
    4. +
    5. +

      + The locked object. +

      +

      + The thing that your application + actually wants to lock. + In a JE + application, the locked object is usually a + + + database record. + +

      +
    6. +
    +
    +

    + JE has not set a limit for the maximum number of + these resources you can use. Instead, you are only + limited by the amount of memory available to your + application. +

    +

    + The following figure shows a transaction handle, + Txn A, that is holding a lock on + database + + record + 002. In this graphic, Txn + A is the locker, and the locked object is + + record + 002. Only a single lock is in use + in this operation. +

    +
    + +
    +
    +
    +
    +
    +
    +

    Types of Locks

    +
    +
    +
    +

    + JE applications support both exclusive and + non-exclusive locks. Exclusive + locks are granted when a + locker wants to write to an object. For this reason, + exclusive locks are also sometimes called + write locks. +

    +

    + An exclusive lock prevents any other locker from + obtaining any sort of a lock on the object. This + provides isolation by ensuring that no other locker can + observe or modify an exclusively locked object until the locker is done + writing to that object. +

    +

    + Non-exclusive locks are granted + for read-only access. For this reason, non-exclusive + locks are also sometimes called read + locks. Since multiple lockers can + simultaneously hold read locks on the same + object, read locks are also + sometimes called shared locks. +

    +

    + A non-exclusive lock prevents any other locker from + modifying the locked object while the locker is still + reading the object. This is how transactional cursors are able to + achieve repeatable reads; by default, the + cursor's transaction holds + a read lock on any object that the cursor has examined until + such a time as the transaction is committed + or aborted. + +

    +

    + In the following figure, Txn A and + Txn B are both holding read locks on + + record + 002, while Txn C + is holding a write lock on + + record + 003: +

    +
    + +
    +
    +
    +
    +
    +
    +

    Lock Lifetime

    +
    +
    +
    +

    + A locker holds its locks until such a time as it does + not need the lock any more. What this means is: +

    +
    +
      +
    1. +

      + A transaction holds any locks that it obtains + until the transaction is committed or aborted. +

      +
    2. +
    3. +

      + All non-transaction operations hold locks + until such a time as the operation is completed. + For cursor operations, the lock is held until the cursor is moved to a new position or + closed. +

      +
    4. +
    +
    +
    +
    +
    +
    +
    +
    +

    Blocks

    +
    +
    +
    +

    + Simply put, a thread of control is blocked when it attempts + to obtain a lock, but that attempt is denied because some + other thread of control holds a conflicting lock. + Once blocked, the thread of control is temporarily unable + to make any forward progress until the requested lock is + obtained or the operation requesting the lock is + abandoned. +

    +

    + Be aware that when we talk about blocking, strictly + speaking the thread is not what is attempting to obtain the + lock. Rather, some object within the thread (such as a + cursor) is attempting to obtain the + lock. However, once a locker attempts to + obtain a lock, the entire thread of control must pause until the lock + request is in some way resolved. +

    +

    + For example, if Txn A holds a write lock (an exclusive + lock) on + + record + 002, then if Txn B tries to obtain a read or write lock on + that + + record, + the thread of control in which Txn + B is running + is blocked: +

    +
    + +
    +

    + However, if Txn A only holds a read + lock (a shared lock) on + + record + 002, then only those handles that attempt to obtain a + write lock on that + + record + will block. +

    +
    + +
    +
    +
    +
    +
    +

    Blocking and Application Performance

    +
    +
    +
    +

    + Multi-threaded + + applications typically perform better than simple + single-threaded applications because the + application can perform one part of its workload + (updating + a database record, + + for example) while it is waiting for some other + lengthy operation to complete (performing disk or + network I/O, for example). This performance + improvement is particularly noticeable if you use + hardware that offers multiple CPUs, because the threads + + can run simultaneously. +

    +

    + That said, concurrent applications can see reduced + workload throughput if their threads of control are + seeing a large amount of lock contention. That is, + if threads are blocking on lock requests, then that + represents a performance penalty for your + application. +

    +

    + Consider once again the previous diagram of a blocked write lock request. + In that diagram, Txn C cannot + obtain its requested write lock because + Txn A and Txn + B are both already holding read locks on + the requested + + record. + In this case, the thread in which + Txn C is running will pause until + such a time as Txn C either + obtains its write lock, or the operation + that is requesting the lock is abandoned. + The fact that Txn + C's thread has temporarily halted all + forward progress represents a performance penalty + for your application. +

    +

    + Moreover, any read locks that are requested while + Txn C is waiting for its write + lock will also block until such a time as + Txn C has obtained and + subsequently released its write lock. +

    +
    +
    +
    +
    +
    +

    Avoiding Blocks

    +
    +
    +
    +

    + Reducing lock contention is an important part of + performance tuning your concurrent JE + application. Applications that have multiple + threads of control obtaining exclusive (write) + locks are prone to contention issues. Moreover, as + you increase the numbers of lockers and as you + increase the time that a lock is held, you increase + the chances of your application seeing lock contention. +

    +

    + As you are designing your application, try to do + the following in order to reduce lock contention: +

    +
    +
      +
    • +

      + Reduce the length of time your application + holds locks. +

      +

      + Shorter lived transactions will result in + shorter lock lifetimes, which will in turn + help to reduce lock contention. +

      +

      + In addition, by default transactional cursors hold read + locks until such a time as the transaction is completed. + For this reason, try to minimize the time you keep + transactional cursors opened, or reduce your isolation + levels – see below. +

      +
    • +
    • +

      + If possible, access heavily accessed (read + or write) items toward the end of the + transaction. This reduces the amount of + time that a heavily used + + + record + + is locked by the transaction. +

      +
    • +
    • +

      + Reduce your application's isolation guarantees. +

      +

      + By reducing your isolation guarantees, you + reduce the situations in which a lock can + block another lock. Try using uncommitted reads + for your read operations in order to + prevent a read lock being blocked by a + write lock. +

      +

      + In addition, for cursors you can use degree + 2 (read committed) isolation, which causes + the cursor to release its read locks as + soon as it is done reading the record (as + opposed to holding its read locks until the + transaction ends). +

      +

      + Be aware that reducing your + isolation guarantees can have + adverse consequences for your + application. Before deciding + to reduce your isolation, take + care to examine your + application's isolation + requirements. + For information on isolation + levels, see + Isolation. +

      +
    • +
    • +

      + Consider your data access patterns. +

      +

      + Depending on the nature of your application, + this may be something that you can not + do anything about. However, if it is + possible to create your threads such that + they operate only on non-overlapping + portions of your database, then you can + reduce lock contention because your + threads will rarely (if ever) block on one another's + locks. +

      +
    • +
    +
    +
    +
    +
    +
    +
    +
    +

    Deadlocks

    +
    +
    +
    +

    + A deadlock occurs when two or more threads of control are + blocked, each waiting on a resource held by the other + thread. When this happens, there is no + possibility of the threads ever making forward progress + unless some outside agent takes action to break the + deadlock. +

    +

    + For example, if + Txn A is + blocked by Txn B at the same time + Txn B is blocked by Txn + A then the threads of control containing + Txn A and Txn B are + deadlocked; neither thread can make + any forward progress because neither thread will ever release the lock + that is blocking the other thread. +

    +
    + +
    +

    + When two threads of control deadlock, the only + solution is to have a mechanism external to the two threads + capable of recognizing the deadlock and notifying at least + one thread that it is in a deadlock situation. + Once notified, a thread of + control must abandon the attempted operation in order to + resolve the deadlock. + + + + + JE is capable of notifying your application when it detects a deadlock. (For + JE, this is handled in the same way as any lock + conflict that a JE application might encounter.) See + Managing Deadlocks and other Lock Conflicts + for more information. + +

    +

    + Note that when one locker in a thread of control is blocked + waiting on a lock held by another locker in that same + thread of the control, the thread is said to be + self-deadlocked. +

    +

    + Note that in JE, a self-deadlock can occur only if + two or more transactions (lockers) are used in the same + thread. A self-deadlock cannot occur for + non-transactional usage, because the thread is the + locker. However, even if you have only one locker per + thread, there is still the possibility of a deadlock + occurring with another thread of control (it just will + not be a self-deadlock), so you still must write code + that defends against deadlocks. +

    +
    +
    +
    +
    +

    Deadlock Avoidance

    +
    +
    +
    +

    + The things that you do to avoid lock contention also + help to reduce deadlocks (see Avoiding Blocks). + + + + + Beyond that, you should also make sure all threads access data in the same order as all other + threads. So long as threads lock records in the same basic order, there is no possibility of a + deadlock (threads can still block, however). + +

    +

    + Be aware that if you are using secondary + databases (indexes), then locking order is + different for reading and writing. For this + reason, if you are writing a concurrent + application and you are using secondary + databases, you should expect deadlocks. +

    +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/chkpoint.html b/docs/TransactionGettingStarted/chkpoint.html new file mode 100644 index 0000000..f0477e4 --- /dev/null +++ b/docs/TransactionGettingStarted/chkpoint.html @@ -0,0 +1,88 @@ + + + + + + Checkpoints + + + + + + + + + +
    +
    +
    +
    +

    Checkpoints

    +
    +
    +
    +

    + Running normal recovery can become expensive if over time all that is ever + written to disk is BTree leaf nodes. So in order to limit the time required for normal recovery, JE runs + checkpoints. Checkpoints write to your log files all the internal BTree nodes and structures modified as a part of + write operations. This means that your log files contain a complete BTree up to + the moment in time when the checkpoint was run. The result is that normal recovery only needs to recreate the + portion of the BTree that has been modified since the time of the last checkpoint. +

    +

    + Checkpoints typically write more information to disk than do transaction commits, and so they are more + expensive from a disk I/O perspective. You will therefore need to consider how frequently to run checkpoints + as a part of your performance tuning activities. When you do this, balance the cost of the checkpoints + against the time it will take your application to restart due to the cost of running normal recovery. +

    +

    + Checkpoints are normally performed by the checkpointer background thread, which is always running. Like + all background threads, it is managed using the je.properties file. Currently, the + only checkpointer property that you may want to manage is + je.checkpointer.bytesInterval. This property identifies how much JE's log files + can grow before a checkpoint is run. Its value is specified in bytes. Decreasing this value causes the + checkpointer thread to run checkpoints more frequently. This will improve the time that it takes to run + recovery, but it also increases the system resources (notably, I/O) required by JE. +

    +

    + Note that checkpoints are also always performed when the environment is closed normally. Therefore, + normal recovery only has work to do if the application crashes or otherwise ends abnormally without + calling Environment.close(). +

    +
    + + + diff --git a/docs/TransactionGettingStarted/deadlock.jpg b/docs/TransactionGettingStarted/deadlock.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0995a84d82583bfccce034cc69e3b661fe0cb264 GIT binary patch literal 12599 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 literal 0 HcmV?d00001 diff --git a/docs/TransactionGettingStarted/enabletxn.html b/docs/TransactionGettingStarted/enabletxn.html new file mode 100644 index 0000000..f7f5f15 --- /dev/null +++ b/docs/TransactionGettingStarted/enabletxn.html @@ -0,0 +1,260 @@ + + + + + + Chapter 2. Enabling Transactions + + + + + + + + + +
    +
    +
    +
    +

    Chapter 2. Enabling Transactions

    +
    +
    +
    + +

    + In order to use transactions with your application, you must turn them + on. To do this you must: +

    +
    +
      +
    • +

      + Turn on transactions for your environment. + + + You do this by using the + EnvironmentConfig.setTransactional() + method, or by using the + je.env.isTransactional + je.properties parameter. + + + + + +

      +
    • +
    • +

      + If you are using the DPL, transaction-enable your stores. + You do this by using the + StoreConfig.setTransactional() method. +

      +
    • +
    • +

      + + Transaction-enable your databases. + + + If you are using the base API, transaction-enable your databases. + + You do this by + + using the + DatabaseConfig.setTransactional() + method, and then opening the database from within a transaction. + + + + + + + Note that the common practice is for auto commit to be used to + transaction-protect the database open. To use auto-commit, you + must still enable transactions as described here, but you do + not have to explicitly use a transaction when you open your + database. An example of this is given in the next section. + +

      +
    • +
    +
    +
    +
    +
    +
    +

    Opening a Transactional Environment and + + Store or Database + +

    +
    +
    +
    +

    + To enable transactions for your environment, you must initialize the + transactional subsystem. For example, do this with the DPL: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.StoreConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Environment myEnv = null;
    +EntityStore myStore = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    StoreConfig storeConfig = new StoreConfig();
    +
    +    myEnvConfig.setTransactional(true);
    +    storeConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +    myStore = new EntityStore(myEnv, "EntityStore", storeConfig);
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +}
    +

    + And when using the base API: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +}
    +

    + You then create and open your database(s) as you would for a non-transactional system. + + + + The only difference is that you must set + DatabaseConfig.setTransactional() + to true. Note that your database open must be + transactional-protected. However, if you do not give the + openDatabase() method a transaction handle, + then the open is automatically protected using auto commit. + Typically auto commit is used for this purpose. + For example: + + +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database. Create it if it does not already exist.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null,
    +                                    "sampleDatabase",
    +                                    dbConfig);
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +}
    +
    +
    +
    +

    Note

    +

    + Never close a database or + store that has active transactions. Make sure + all transactions are resolved (either committed or aborted) + before closing the database. +

    +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/gettingStarted.css b/docs/TransactionGettingStarted/gettingStarted.css new file mode 100644 index 0000000..6a2b24b --- /dev/null +++ b/docs/TransactionGettingStarted/gettingStarted.css @@ -0,0 +1,50 @@ +body { width: 45em; + margin-left: 3em; + font-family: Arial, Helvetica, sans-serif; + font-size: 11pt; + } + +h2.title { margin-left: -1em; + font-family: Verdana, serif; + font-size: 16pt; + } + +h3.title { font-family: Verdana, serif; + font-size: 14pt; + } + +pre.programlisting { + font-family: monospace; + background-color: #eae8e9; +} + +div.navheader { font-size: 10pt; + width: 60em; + margin-left: -2em; + } + +div.navheader table tr td { font-size: 10pt; } + +div.navfooter { font-size: 10pt; + width: 60em; + margin-left: -2em; + } +div.navfooter table tr td { font-size: 10pt; } + +span.emphasis { font-style: italic;} + +div.appendix div.informaltable { font-size: 9pt; } +div.appendix div.informaltable td { vertical-align: top; } +div.appendix div.informaltable p { margin-top: .25em; } +div.appendix div.informaltable p { margin-bottom: .25em; } + +div.variablelist dl dt {margin-top: 1em; } + +div.libver p { + font-size: 8pt; + width: 30%; + margin-left: 2px; + margin-right: 2px; + padding-top: 3px; + padding-bottom: 3px; + } diff --git a/docs/TransactionGettingStarted/index.html b/docs/TransactionGettingStarted/index.html new file mode 100644 index 0000000..9b737af --- /dev/null +++ b/docs/TransactionGettingStarted/index.html @@ -0,0 +1,523 @@ + + + + + + Getting Started with Berkeley DB, Java Edition Transaction Processing + + + + + + + +
    +
    +
    +
    +

    Getting Started with Berkeley DB, Java Edition Transaction Processing

    +
    +
    +
    + +

    + Legal Notice +

    +

    + Copyright © 2002 - 2017 Oracle and/or its affiliates. All rights + reserved. +

    +

    + This software and related documentation are provided under a + license agreement containing restrictions on use and disclosure + and are protected by intellectual property laws. Except as + expressly permitted in your license agreement or allowed by + law, you may not use, copy, reproduce, translate, broadcast, + modify, license, transmit, distribute, exhibit, perform, + publish, or display any part, in any form, or by any means. + Reverse engineering, disassembly, or decompilation of this + software, unless required by law for interoperability, is + prohibited. +

    +

    + The information contained herein is subject to change without + notice and is not warranted to be error-free. If you find any + errors, please report them to us in writing. +

    +

    + Berkeley DB, + + Berkeley DB Java Edition + and + Sleepycat are trademarks or registered trademarks of + Oracle. All rights to these marks are reserved. + No third-party use is permitted without the + express prior written consent of Oracle. +

    +

    + Other names may be trademarks of their respective owners. +

    +

    + If this is software or related documentation that is delivered + to the U.S. Government or anyone licensing it on behalf of the + U.S. Government, the following notice is applicable: +

    +

    + U.S. GOVERNMENT END USERS: Oracle programs, including any + operating system, integrated software, any programs installed + on the hardware, and/or documentation, delivered to U.S. + Government end users are "commercial computer software" + pursuant to the applicable Federal Acquisition Regulation and + agency-specific supplemental regulations. As such, use, + duplication, disclosure, modification, and adaptation of the + programs, including any operating system, integrated software, + any programs installed on the hardware, and/or documentation, + shall be subject to license terms and license restrictions + applicable to the programs. No other rights are granted to the + U.S. Government. +

    +

    + This software or hardware is developed for general use in a + variety of information management applications. It is not + developed or intended for use in any inherently dangerous + applications, including applications that may create a risk of + personal injury. If you use this software or hardware in + dangerous applications, then you shall be responsible to take + all appropriate fail-safe, backup, redundancy, and other + measures to ensure its safe use. Oracle Corporation and its + affiliates disclaim any liability for any damages caused by use + of this software or hardware in dangerous applications. +

    +

    + Oracle and Java are registered trademarks of Oracle and/or its + affiliates. Other names may be trademarks of their respective + owners. +

    +

    + Intel and Intel Xeon are trademarks or registered trademarks of + Intel Corporation. All SPARC trademarks are used under license + and are trademarks or registered trademarks of SPARC + International, Inc. AMD, Opteron, the AMD logo, and the AMD + Opteron logo are trademarks or registered trademarks of + Advanced Micro Devices. UNIX is a registered trademark of The + Open Group. +

    +

    + This software or hardware and documentation may provide access + to or information on content, products, and services from third + parties. Oracle Corporation and its affiliates are not + responsible for and expressly disclaim all warranties of any + kind with respect to third-party content, products, and + services. Oracle Corporation and its affiliates will not be + responsible for any loss, costs, or damages incurred due to + your access to or use of third-party content, products, or + services. +

    +
    +
    +
    +

    31-Oct-2017

    +
    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Preface + +
    +
    +
    +
    + + Conventions Used in this Book + +
    +
    + + For More Information + +
    +
    +
    +
    + + Contact Us + +
    +
    +
    +
    +
    +
    + + 1. Introduction + +
    +
    +
    +
    + + Transaction Benefits + +
    +
    + + A Note on System Failure + +
    +
    + + Application Requirements + +
    +
    + + Multi-threaded + + Applications + +
    +
    + + Recoverability + +
    +
    + + Performance Tuning + +
    +
    +
    +
    + + 2. Enabling Transactions + +
    +
    +
    +
    + + Opening a Transactional Environment and + + Store or Database + + + +
    +
    +
    +
    + + 3. Transaction Basics + +
    +
    +
    +
    + + Committing a Transaction + +
    +
    + + Non-Durable Transactions + +
    +
    + + Aborting a Transaction + +
    +
    + + Auto Commit + +
    +
    + + Transactional Cursors + +
    +
    +
    +
    + + Using Transactional DPL Cursors + +
    +
    +
    +
    + + Secondary Indices with Transaction Applications + +
    +
    + + Configuring the Transaction Subsystem + +
    +
    +
    +
    + + 4. Concurrency + +
    +
    +
    +
    + + Which JE Handles are Free-Threaded + +
    +
    + + Locks, Blocks, and Deadlocks + +
    +
    +
    +
    + + Locks + +
    +
    + + Blocks + +
    +
    + + Deadlocks + +
    +
    +
    +
    + + JE Lock Management + +
    +
    +
    +
    + + Managing JE Lock Timeouts + +
    +
    + + Managing Deadlocks and other Lock Conflicts + +
    +
    +
    +
    + + Isolation + +
    +
    +
    +
    + + Supported Degrees of Isolation + +
    +
    + + Reading Uncommitted Data + +
    +
    + + Committed Reads + +
    +
    + + Configuring Serializable Isolation + +
    +
    +
    +
    + + Transactional Cursors and Concurrent Applications + +
    +
    +
    +
    + + Using Cursors with Uncommitted Data + +
    +
    +
    +
    + + Read/Modify/Write + +
    +
    +
    +
    + + 5. Backing up and Restoring Berkeley DB, Java Edition Applications + +
    +
    +
    +
    + + Normal Recovery + +
    +
    + + Checkpoints + +
    +
    + + Performing Backups + +
    +
    +
    +
    + + Performing a Hot Backup + +
    +
    + + Performing an Offline Backup + +
    +
    + + Using the DbBackup Helper Class + +
    +
    +
    +
    + + Performing Catastrophic Recovery + +
    +
    + + Hot Failover + +
    +
    +
    +
    + + 6. Summary and Examples + +
    +
    +
    +
    + + Anatomy of a Transactional Application + +
    +
    + + Base API Transaction Example + +
    +
    +
    +
    + + TxnGuide.java + +
    +
    + + PayloadData.java + +
    +
    + + DBWriter.java + +
    +
    +
    +
    + + DPL Transaction Example + +
    +
    +
    +
    + + TxnGuide.java + +
    +
    + + PayloadDataEntity.java + +
    +
    + + StoreWriter.java + +
    +
    +
    +
    +
    +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/introduction.html b/docs/TransactionGettingStarted/introduction.html new file mode 100644 index 0000000..da79703 --- /dev/null +++ b/docs/TransactionGettingStarted/introduction.html @@ -0,0 +1,215 @@ + + + + + + Chapter 1. Introduction + + + + + + + + + +
    +
    +
    +
    +

    Chapter 1. Introduction

    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Transaction Benefits + +
    +
    + + A Note on System Failure + +
    +
    + + Application Requirements + +
    +
    + + Multi-threaded + + Applications + +
    +
    + + Recoverability + +
    +
    + + Performance Tuning + +
    +
    +
    +

    + This book provides a thorough introduction and discussion on transactions as + used with Berkeley DB, Java Edition (JE). + + + Both the base API as well as the Direct Persistence Layer API is used in this + manual. + + + It begins by offering a general overview to + transactions, the guarantees they provide, and the general application + infrastructure required to obtain full transactional protection for your + data. +

    +

    + This book also provides detailed examples on how to write a + transactional application. Both single threaded and multi-threaded are discussed. A detailed description of various + backup and recovery strategies is included in this manual, as is a + discussion on performance considerations for your transactional application. +

    +

    + You should understand the concepts from the + + + + Getting Started with Berkeley DB, Java Edition + + guide before reading this book. +

    +
    +
    +
    +
    +

    Transaction Benefits

    +
    +
    +
    +

    + Transactions offer your application's data protection from + application or system failures. That is, JE transactions offer + your application full ACID support: +

    +
    +
      +
    • +

      + Atomicity +

      +

      + Multiple database operations are treated as a single unit of + work. Once committed, all write operations performed under + the protection of the transaction are saved to your databases. + Further, in the event that you abort a transaction, all write + operations performed during the transaction are discarded. + In this event, your database is left in the state it was in + before the transaction began, regardless of the number or + type of write operations you may have performed during the + course of the transaction. +

      +

      + Note that JE transactions can span one or more + database handles. +

      +
    • +
    • +

      + Consistency +

      +

      + Your databases will never see a partially completed + transaction. This is true even if your application fails while there are + in-progress transactions. If the application or system fails, + then either all of the database changes appear when the + application next runs, or none of them appear. +

      +

      + In other words, whatever consistency requirements your application has will never be violated by JE. + If, for example, your application requires every record to include an employee ID, and your + code faithfully adds that ID to its database records, then JE will never + violate that consistency requirement. The ID will remain in the database records until such a time as your + application chooses to delete it. +

      +
    • +
    • +

      + Isolation +

      +

      + While a transaction is in progress, your databases will appear + to the transaction as if there are no other operations + occurring outside of the transaction. That is, operations + wrapped inside a transaction will always have a clean and + consistent view of your databases. They never have to see + updates currently in progress under the protection of another transaction. + Note, however, that isolation guarantees can be + + increased and + + relaxed from the default setting. See + Isolation + for more information. +

      +
    • +
    • +

      + Durability +

      +

      + Once committed to your databases, your modifications will + persist even in the event of an application or system failure. + Note that like isolation, your durability guarantee can be + relaxed. See Non-Durable Transactions + for more information. +

      +
    • +
    +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/isolation.html b/docs/TransactionGettingStarted/isolation.html new file mode 100644 index 0000000..131d3e0 --- /dev/null +++ b/docs/TransactionGettingStarted/isolation.html @@ -0,0 +1,759 @@ + + + + + + Isolation + + + + + + + + + +
    +
    +
    +
    +

    Isolation

    +
    +
    +
    + +

    + Isolation guarantees are an important aspect of transactional + protection. Transactions + ensure the data your transaction is working with will not be changed by some other transaction. + Moreover, the modifications made by a transaction will never be viewable outside of that transaction until + the changes have been committed. +

    +

    + That said, there are different degrees of isolation, and you can choose to relax your isolation + guarantees to one degree or another depending on your application's requirements. The primary reason why + you might want to do this is because of performance; the more isolation you ask your transactions to + provide, the more locking that your application must do. With more locking comes a greater chance of + blocking, which in turn causes your threads to pause while waiting for a lock. Therefore, by relaxing + your isolation guarantees, you can potentially improve your application's throughput. + Whether you actually see any improvement depends, of course, on + the nature of your application's data and transactions. +

    +
    +
    +
    +
    +

    Supported Degrees of Isolation

    +
    +
    +
    +

    + JE supports the following levels of isolation: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DegreeANSI TermDefinition
    1READ UNCOMMITTED + Uncommitted reads means that one transaction will never + overwrite another transaction's dirty data. Dirty data is + data that a transaction has modified but not yet committed + to the underlying data store. However, uncommitted reads allows a + transaction to see data dirtied by another + transaction. In addition, a transaction may read data + dirtied by another transaction, but which subsequently + is aborted by that other transaction. In this latter + case, the reading transaction may be reading data that + never really existed in the database. +
    2READ COMMITTED +

    + Committed read isolation means that degree 1 is observed, except that dirty data is never read. +

    +

    + In addition, this isolation level guarantees that data will never change so long as + it is addressed by the cursor, but the data may change before the reading cursor is closed. + In the case of a transaction, data at the current + cursor position will not change, but once the cursor + moves, the previous referenced data can change. This + means that readers release read locks before the cursor + is closed, and therefore, before the transaction + completes. Note that this level of isolation causes the + cursor to operate in exactly the same way as it does in + the absence of a transaction. +

    +
    (undefined)REPEATABLE READ +

    + Committed read is observed, plus the data read by a transaction, T, will never be dirtied by another + transaction before T completes. This means that both read and write locks are not + released until the transaction completes. +

    +

    + This is JE's default isolation level. +

    +
    3SERIALIZABLE + +

    + + + + Committed read is observed, plus + + + no transactions will see phantoms. Phantoms are records + returned as a result of a search, but which were not seen by + the same transaction when the identical + search criteria was previously used. +

    + +
    +
    +

    + + By default, JE transactions and transactional cursors offer + + + repeatable read isolation. + + + You can optionally reduce your isolation level by configuring JE to use + uncommitted read isolation. See + Reading Uncommitted Data + for more information. + + You can also configure JE to use committed read isolation. See + Committed Reads + for more information. + + Finally, you can configure your transactions and transactional cursors to use + serializable isolation. See Configuring Serializable Isolation + for more information. + +

    +
    +
    +
    +
    +
    +

    Reading Uncommitted Data

    +
    +
    +
    +

    + Berkeley DB allows you to configure your application to read data that has been modified but not yet + committed by another transaction; that is, dirty data. When you do this, you + may see a performance benefit by allowing your + application to not have to block waiting for write locks. On the other hand, the data that your + application is reading may change before the transaction has completed. +

    +

    + When used with transactions, uncommitted reads means that one transaction can see data + modified but not yet committed by another transaction. When + used with transactional cursors, uncommitted reads means + that any database reader can see data modified by the + cursor before the cursor's transaction has committed. +

    +

    + Because of this, uncommitted reads allow a transaction to read data + that may subsequently be aborted by another transaction. In + this case, the reading transaction will have read data that + never really existed in the database. +

    +

    + To configure your application to read uncommitted data, specify that you want to use + uncommitted reads when you create a transaction or open the cursor. + To do this, you use the setReadUncommitted() + method on the relevant configuration object + (TransactionConfig or CursorConfig). +

    +

    + For example: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.TransactionConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null, "sampleDatabase", dbConfig);
    +
    +    TransactionConfig txnConfig = new TransactionConfig();
    +    txnConfig.setReadUncommitted(true);          // Use uncommitted reads 
    +                                                 // for this transaction.
    +    Transaction txn = myEnv.beginTransaction(null, txnConfig);
    +
    +    // From here, you perform your database reads and writes as normal,
    +    // committing and aborting the transactions as is necessary, and
    +    // testing for deadlock exceptions as normal (omitted for brevity). 
    +        
    +    ...
    +

    + If you are using the DPL: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.TransactionConfig;
    +
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.StoreConfig;
    +
    +import java.io.File;
    +
    +...
    +
    + myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the store.
    +    StoreConfig myStoreConfig = new StoreConfig();
    +    myStoreConfig.setAllowCreate(true);
    +    myStoreConfig.setTransactional(true);
    +
    +    myStore = new EntityStore(myEnv, "store_name", myStoreConfig);
    +
    +    TransactionConfig txnConfig = new TransactionConfig();
    +    txnConfig.setReadUncommitted(true);          // Use uncommitted reads 
    +                                                 // for this transaction.
    +    Transaction txn = myEnv.beginTransaction(null, txnConfig);
    +
    +    // From here, you perform your store reads and writes as normal,
    +    // committing and aborting the transactions as is necessary, and
    +    // testing for deadlock exceptions as normal (omitted for brevity). 
    +        
    +    ...
    +

    + You can also configure uncommitted read isolation on a read-by-read basis + by specifying LockMode.READ_UNCOMMITTED: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.Transaction;
    +
    +...
    +
    +Database myDb = null;
    +Environment myEnv = null;
    +Transaction txn = null;
    +
    +try {
    +
    +    // Environment and database open omitted
    +
    +    ...
    +
    +    txn = myEnv.beginTransaction(null, null);
    +
    +    DatabaseEntry theKey =
    +        new DatabaseEntry((new String("theKey")).getBytes("UTF-8"));
    +    DatabaseEntry theData = new DatabaseEntry();
    +
    +    myDb.get(txn, theKey, theData, LockMode.READ_UNCOMMITTED);
    +} catch (Exception e) {
    +    // Exception handling goes here
    +} 
    +

    + Using the DPL: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.Transaction;
    +
    +import com.sleepycat.persist.PrimaryIndex;
    +
    +...
    +
    +Environment myEnv = null;
    +Transaction txn = null;
    +
    +try {
    +
    +    // Environment and store open omitted
    +
    +    ...
    +
    +    txn = myEnv.beginTransaction(null, null);
    +
    +    AnEntityClass aec = aPrimaryIndex.get(txn, "pKeya", 
    +                            LockMode.READ_UNCOMMITTED);
    +} catch (Exception e) {
    +    // Exception handling goes here
    +} 
    +
    +
    +
    +
    +
    +

    Committed Reads

    +
    +
    +
    +

    + You can configure your transaction so that the data being + read by a transactional cursor is consistent so long as it + is being addressed by the cursor. However, once the cursor is done reading the + + record or object, + + + + the cursor releases its lock on that + + record or object. + + + + This means that the data the cursor has read and released + may change before the cursor's transaction has completed. +

    +

    + For example, + suppose you have two transactions, Ta and Tb. Suppose further that + Ta has a cursor that reads record R, but does not modify it. Normally, + Tb would then be unable to write record R because + Ta would be holding a read lock on it. But when you configure your transaction for + committed reads, Tb can modify record + R before Ta completes, so long as the reading cursor is no longer + addressing the + + record or object. + + + +

    +

    + When you configure your application for this level of isolation, you may see better performance + throughput because there are fewer read locks being held by your transactions. + Read committed isolation is most useful when you have a cursor that is reading and/or writing records in + a single direction, and that does not ever have to go back to re-read those same records. In this case, + you can allow JE to release read locks as it goes, rather than hold them for the life of the + transaction. +

    +

    + To configure your application to use committed reads, do one of the following: +

    +
    +
      +
    • +

      + Create your transaction such that it allows committed reads. You do this by + + + specifying true to + TransactionConfig.setReadCommitted(). + +

      +
    • +
    • +

      + + + Specify true to + CursorConfig.setReadCommitted(). + +

      +
    • +
    +
    +

    + For example, the following creates a transaction that allows committed reads: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.TransactionConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null, "sampleDatabase", dbConfig);
    +
    +    // Open the transaction and enable committed reads. All cursors open
    +    // with this transaction handle will use read committed isolation.
    +    TransactionConfig txnConfig = new TransactionConfig();
    +    txnConfig.setReadCommitted(true);          // Use committed reads 
    +                                               // for this transaction.
    +    Transaction txn = myEnv.beginTransaction(null, txnConfig);
    +
    +    // From here, you perform your database reads and writes as normal,
    +    // committing and aborting the transactions as is necessary, and
    +    // testing for deadlock exceptions as normal (omitted for brevity). 
    +        
    +    ...
    +

    + Using the DPL: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.TransactionConfig;
    +
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.StoreConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +EntityStore myStore = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +
    +    // Instantiate the store.
    +    StoreConfig myStoreConfig = new StoreConfig();
    +    myStoreConfig.setAllowCreate(true);
    +    myStoreConfig.setTransactional(true);
    +
    +    // Open the transaction and enable committed reads. All cursors open
    +    // with this transaction handle will use read committed isolation.
    +    TransactionConfig txnConfig = new TransactionConfig();
    +    txnConfig.setReadCommitted(true);          // Use committed reads 
    +                                               // for this transaction.
    +    Transaction txn = myEnv.beginTransaction(null, txnConfig);
    +
    +    // From here, you perform your store reads and writes as normal,
    +    // committing and aborting the transactions as is necessary, and
    +    // testing for deadlock exceptions as normal (omitted for brevity). 
    +        
    +    ...
    +

    + You can also configure read committed isolation on a read-by-read basis + by specifying LockMode.READ_COMMITTED: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.Transaction;
    +
    +...
    +
    +Database myDb = null;
    +Environment myEnv = null;
    +Transaction txn = null;
    +
    +try {
    +
    +    // Environment and database open omitted
    +
    +    ...
    +
    +    txn = myEnv.beginTransaction(null, null);
    +
    +    DatabaseEntry theKey =
    +        new DatabaseEntry((new String("theKey")).getBytes("UTF-8"));
    +    DatabaseEntry theData = new DatabaseEntry();
    +
    +    myDb.get(txn, theKey, theData, LockMode.READ_COMMITTED);
    +} catch (Exception e) {
    +    // Exception handling goes here
    +} 
    +

    + Using the DPL: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.Transaction;
    +
    +import com.sleepycat.persist.PrimaryIndex;
    +
    +...
    +
    +Environment myEnv = null;
    +Transaction txn = null;
    +
    +try {
    +
    +    // Environment and store open omitted
    +
    +    ...
    +
    +    txn = myEnv.beginTransaction(null, null);
    +
    +    // Primary index creation omitted
    +    ...
    +
    +    AnEntityClass aec = aPrimaryIndex.get(txn, "pKeya", 
    +                            LockMode.READ_COMMITTED);
    +} catch (Exception e) {
    +    // Exception handling goes here
    +} 
    +
    +
    +
    +
    +
    +

    Configuring Serializable Isolation

    +
    +
    +
    +

    + You can configure JE to use serializable isolation. + Serializable isolation prevents transactions from seeing + phantoms. Phantoms occur when a transaction obtains + inconsistent results when performing a given query. +

    +

    + Suppose a transaction performs a search, S, and as a result of + that search NOTFOUND is returned. If you are using only repeatable read + isolation (the default isolation level), it is possible for the same + transaction to perform S at a later point in time and + return SUCCESS instead of NOTFOUND. This can occur if another thread of + control modified the database in such a way as to cause S to + successfully locate data, where before no data was found. + When this situation occurs, the results + returned by S are said to be a phantom. +

    +

    + To prevent phantoms, you can use serializable isolation. Note that this + causes JE to perform additional locking in order to prevent keys + from being inserted until the transaction ends. However, this additional + locking can also result in reduced concurrency for your application, + which means that your database access can be slowed. +

    +

    + You configure serializable isolation for all transactions in your + environment by using + EnvironmentConfig.setTxnSerializableIsolation(): +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.LockMode;
    +
    +...
    +
    +Database myDb = null;
    +Environment myEnv = null;
    +Transaction txn = null;
    +
    +try {
    +
    +    // Open an environment
    +    EnvironmentConfig envConfig = new EnvironmentConfig();
    +    envConfig.setAllowCreate(true);
    +    envConfig.setTransactional(true);
    +
    +    // Use serializable isolation
    +    envConfig.setTxnSerializableIsolation(true);     
    +
    +    myEnv = new Environment(myHomeDirectory, envConfig);
    +
    +    // Database open omitted
    +
    +    ...
    +
    +    txn = myEnv.beginTransaction(null, null);
    +
    +    DatabaseEntry theKey = 
    +        new DatabaseEntry((new String("theKey")).getBytes("UTF-8"));
    +    DatabaseEntry theData = new DatabaseEntry();
    +
    +    myDb.get(txn, theKey, theData, LockMode.DEFAULT); 
    +} catch (Exception e) {
    +    // Exception handling goes here
    +}
    +
    +

    + If you do not configure serializable isolation for all transactions, you + can configure serializable isolation for a specific transaction using + TransactionConfig.setSerializableIsolation(): +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.TransactionConfig;
    +
    +import com.sleepycat.persist.PrimaryIndex;
    +
    +...
    +
    +Database myDb = null;
    +Environment myEnv = null;
    +Transaction txn = null;
    +
    +try {
    +
    +    // Environment and store open omitted
    +
    +    ...
    +
    +    TransactionConfig tc = new TransactionConfig();
    +    tc.setSerializableIsolation(true); // Use serializable isolation
    +    txn = myEnv.beginTransaction(null, tc);
    +
    +    // Primary index creation omitted
    +    ...
    +
    +    AnEntityClass aec = aPrimaryIndex.get(txn, "pKeya", 
    +                            LockMode.DEFAULT);
    +} catch (Exception e) {
    +    // Exception handling goes here
    +}
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/jebackuprestore.html b/docs/TransactionGettingStarted/jebackuprestore.html new file mode 100644 index 0000000..ac7220b --- /dev/null +++ b/docs/TransactionGettingStarted/jebackuprestore.html @@ -0,0 +1,171 @@ + + + + + + Chapter 5. Backing up and Restoring Berkeley DB, Java Edition Applications + + + + + + + + + +
    +
    +
    +
    +

    Chapter 5. Backing up and Restoring Berkeley DB, Java Edition Applications

    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Normal Recovery + +
    +
    + + Checkpoints + +
    +
    + + Performing Backups + +
    +
    +
    +
    + + Performing a Hot Backup + +
    +
    + + Performing an Offline Backup + +
    +
    + + Using the DbBackup Helper Class + +
    +
    +
    +
    + + Performing Catastrophic Recovery + +
    +
    + + Hot Failover + +
    +
    +
    +

    + Fundamentally, you backup your databases by copying JE log + files off to a safe storage location. To restore your database from + a backup, you copy those files to an appropriate directory on disk + and restart your JE application. +

    +

    + Note that if you are using subdirectories to store your JE log + files, then your backup and restore process must maintain the + relationship between each log file and the subdirectory in which + JE intially placed it. That is, if JE placed log file + number 17 in the subdirectory named data003, + then when you perform a recovery log file number 17 must be placed + inside subdirectory data003. +

    +

    + Beyond these simple activities, there are some differing backup strategies that you may want to consider. These + topics are described in this chapter. +

    +

    + Before continuing, before you review the information on log files and background threads in the + Getting Started with Berkeley DB, Java Edition guide. Those topics contain important + information that is basic to the following discussion on backups and restores. +

    +
    +
    +
    +
    +

    Normal Recovery

    +
    +
    +
    +

    + Remember that internally JE databases are organized in a BTree, and that in order to operate JE + requires the complete BTree be available to it. +

    +

    + When database records are created, modified, or deleted, the modifications are represented in the BTree's + leaf nodes. Beyond leaf node changes, database record modifications can also cause changes to other BTree + nodes and structures. +

    +

    + Now, if your writes are transaction-protected, then every time a transaction is committed the leaf nodes + (and only the leaf nodes) modified by that transaction are written to the JE log + files on disk. Also, remember that the durability of the write (whether a flush or fsync is + performed) depends on the type of commit that is requested. See Non-Durable Transactions for more information. +

    +

    + Normal recovery, then, is the process of recreating the entire BTree from the information available in the + leaf nodes. You do not have to do anything special to cause normal recovery to be run; this occurs every + time a JE environment is opened. +

    +

    + You can know if normal recovery must be run by catching EnvironmentFailureException. + This exception indicates that a failure has occurred that impacts the + Environment as a whole. Upon seeing this exception, you should run + Environment.isValid(). If it returns true, + then you can continue operating without any further action. However, if it + returns false, then you must close and reopen all + Environment handles so that normal recovery can be run. +

    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/jecatastrophicrecovery.html b/docs/TransactionGettingStarted/jecatastrophicrecovery.html new file mode 100644 index 0000000..5339c86 --- /dev/null +++ b/docs/TransactionGettingStarted/jecatastrophicrecovery.html @@ -0,0 +1,114 @@ + + + + + + Performing Catastrophic Recovery + + + + + + + + + +
    +
    +
    +
    +

    Performing Catastrophic Recovery

    +
    +
    +
    +

    + Catastrophic recovery is necessary whenever your environment and/or database have been lost or corrupted + due to a media failure (disk failure, for example). Catastrophic recovery is also required if normal + recovery fails for any reason. +

    +

    + In order to perform catastrophic recovery, you must have a full backup of your databases. You will use + this backup to restore your database. See the previous section for + information on running back ups. +

    +

    + To perform catastrophic recovery: +

    +
    +
      +
    1. +

      + Shut down your application. +

      +
    2. +
    3. +

      + Delete the contents of your environment home directory (the one that experienced a catastrophic + failure), if there is anything there. +

      +
    4. +
    5. +

      + Copy your most recent full backup into your environment home directory. + If you are using subdirectories to store your log files, be sure to place + the recovered log files back into the subdirectory from which they were + originally backed up. +

      +
    6. +
    7. +

      + If you are using a backup utility that runs incremental backups of your environment directory, + copy any log files generated since the time of your last full backup. + Be sure to restore all log files in the order that they were written. The order is important because + it is possible the same log file appears in multiple archives, and you want to run recovery + using the most recent version of each log file. +

      +
    8. +
    9. +

      + Open the environment as normal. JE's normal recovery will run, which will bring your database + to a consistent state relative to the changed data found in your log files. +

      +
    10. +
    +
    +

    + You are now done restoring your database. +

    +
    + + + diff --git a/docs/TransactionGettingStarted/jehotfailover.html b/docs/TransactionGettingStarted/jehotfailover.html new file mode 100644 index 0000000..d28efce --- /dev/null +++ b/docs/TransactionGettingStarted/jehotfailover.html @@ -0,0 +1,131 @@ + + + + + + Hot Failover + + + + + + + + + +
    +
    +
    +
    +

    Hot Failover

    +
    +
    +
    +

    + As a final backup/recovery strategy, you can create a hot failover. Note that using hot failovers requires + your application to be able to specify its environment home directory at application startup time. Most + application developers allow the environment home directory to be identified using a command line option or a + configuration or properties file. If your application has its + environment home hard-coded into it, you cannot use hot failovers. +

    +

    + You create a hot failover by periodically + backing up your database to an alternative location on disk. Usually this + alternative location is on a separate physical drive from where you normally keep your database, but if + multiple drives are not available then you should at least put the hot failover on a separate disk + partition. +

    +

    + You failover by causing your application to reopen its environment using the failover + location. +

    +

    + Note that a hot failover should not be used as a substitute for backing up and archiving + your data to a safe location physically remote from your computing environment. Even if + your data is spread across multiple physical disks, a truly serious catastrophe (fires, + malevolent software viruses, faulty disk controllers, and so forth) can still cause you + to lose your data. +

    +

    + To create and maintain a hot failover: +

    +
    +
      +
    1. +

      + Copy all log files (*.jdb) from your environment + directory to the location where you want to keep your failover. Either an + offline or a hot backup can be used for this purpose, but typically a hot + failoveris initially created by taking an offline backup of your database. + This ensures that you have captured the contents of your in-memory cache. +

      +
      +

      Note

      +

      + If you are using subdirectories to store your log files, then you must backup + the subdirectories, making sure to keep log files in the subdirectory in which + JE placed them. For information on using subdirectories to store your log + files, see the Getting Started with Berkeley DB, Java Edition guide. +

      +
      +
    2. +
    3. +

      + Periodically copy to your failover directory any log files that were changed or created since the + time of your last copy. Most backup software is capable of performing this kind of an incremental + backup for you. +

      +

      + Note that the frequency of your incremental copies determines the amount of data + that is at risk due to catastrophic failures. For example, if you perform the + incremental copy once an hour then at most your hot failover is an hour behind + your production database, and so you are risking at most an hours worth of + database changes. +

      +
    4. +
    5. +

      + Remove any *.jdb files from the hot failover directory that have been removed or + renamed to .del files in the primary directory. This is not necessary for + consistency, but will help to reduce disk space consumed by the hot failover. +

      +
    6. +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/jelock.html b/docs/TransactionGettingStarted/jelock.html new file mode 100644 index 0000000..2847b28 --- /dev/null +++ b/docs/TransactionGettingStarted/jelock.html @@ -0,0 +1,260 @@ + + + + + + JE Lock Management + + + + + + + + + +
    +
    +
    +
    +

    JE Lock Management

    +
    +
    +
    + +

    + To manage locks in JE, you must do two things: +

    +
    +
      +
    1. +

      + Manage lock timeouts. +

      +
    2. +
    3. +

      + Detect and respond to lock conflicts. Conceptually, + these are deadlocks. But from a coding point of view + there is no difference between what you do if a lock + times out, and what you do if you encounter a deadlock. + In fact, in JE, you cannot tell the difference + based on the exceptions that are thrown. +

      +
    4. +
    +
    +
    +
    +
    +
    +

    Managing JE Lock Timeouts

    +
    +
    +
    +

    + Like transaction timeouts (see Configuring the Transaction Subsystem), + JE allows you to identify the longest period of time that it is allowed to hold a lock. + This value plays an important part in performing deadlock detection, because the only way JE can + identify a deadlock is if a lock is held past its timeout value. +

    +

    + However, unlike transaction timeouts, lock timeouts are on a true timer. Transaction + timeouts are only identified when JE is has a reason to examine its lock table; that is, + when it is attempting to acquire a lock. If no such activity is + occurring in your application, a transaction can exist for a long time past its expiration timeout. + Conversely, lock timeouts are managed by a timer maintained by the JVM. Once this timer has expired, + your application will be notified of the event (see the next section on deadlock detection for more + information). +

    +

    + You can set the lock timeout on a transaction by transaction basis, or for the entire environment. To + set it on a transaction basis, use Transaction.setLockTimeout(). + To set it for your entire environment, use EnvironmentConfig.setLockTimeout() + or use the je.lock.timeout parameter in the je.properties file. +

    +

    + The value that you specify for the lock timeout is in microseconds. 500000 is used by + default. +

    +

    + Note that changing this value can have an affect on your application's performance. If you set it too + low, locks may expire and be considered deadlocked even though the thread is in fact making + forward progress. This will cause your application to abort and retry transactions unnecessarily, which + can ultimately harm application throughput. + If you set it too high, threads may deadlock for too long before your application receives notification + and is able to take corrective action. Again, this can harm application throughput. +

    +

    + Note that for applications in which you will have extremely long-lived locks, you + may want to set this value to 0. Doing so disables lock timeouts + entirely. Be aware that disabling lock timeouts can be dangerous because then your + application will never be notified of deadlocks. So, alternatively, you might want + to set this value to a very large timeout (such as ten minutes) if your application + is using extremely long-lived locks. +

    +
    +
    +
    +
    +
    +

    Managing Deadlocks and other Lock Conflicts

    +
    +
    +
    +

    + A deadlock is the result of a lock conflict that cannot be + resolved by the underlying JE code before the lock + times out. Generically, we consider this situation a + lock conflict because there is no way + to tell if the lock timed out because of a true deadlock, + or if it timed out because a long-running operation simply + held the lock for too long a period of time. +

    +

    + When a lock conflict occurs in JE, the thread of control holding + that lock is notified of the event using a + LockConflictException exception. Note + that this exception is actual a common base class for several + exception classes that might be able to give you more of a + hint as to what the actual problem is. However, the + response that you make for any of these exceptions is + probably going to be the same, so the best thing to do is + simply catch and manage LockConflictException. +

    +

    + When a LockConflictException is + thrown, the thread must: +

    +
    +
      +
    1. +

      + Cease all read and write operations. +

      +
    2. +
    3. +

      + Close all open cursors. +

      +
    4. +
    5. +

      + Abort the transaction. +

      +
    6. +
    7. +

      + Optionally retry the operation. If your application + retries operations that are aborted due to a lock + conflict, the new attempt must be made using a new transaction. +

      +
    8. +
    +
    +
    +

    Note

    +

    + If a thread has encountered a lock conflict, it may not make any + additional database calls using the transaction handle that has + experienced the lock conflict. +

    +
    +

    + For example: +

    +
    // retry_count is a counter used to identify how many times
    +// we've retried this operation. To avoid the potential for 
    +// endless looping, we won't retry more than MAX_DEADLOCK_RETRIES 
    +// times.
    +
    +// txn is a transaction handle.
    +// key and data are DatabaseEntry handles. Their usage is not shown here.
    +while (retry_count < MAX_DEADLOCK_RETRIES) {
    +    try {
    +        txn = myEnv.beginTransaction(null, null);
    +        myDatabase.put(txn, key, data);
    +        txn.commit();
    +        return 0;
    +    } catch (LockConflictException le) {
    +        try {
    +            // Abort the transaction and increment the
    +            // retry counter
    +            if (txn != null) {
    +                txn.abort();
    +            }
    +            retry_count++;
    +            if (retry_count >= MAX_DEADLOCK_RETRIES) {
    +                System.err.println("Exceeded retry limit. Giving up.");
    +                return -1;
    +            }
    +        } catch (DatabaseException ae) {
    +            System.err.println("txn abort failed: " + ae.toString());
    +            return -1;    
    +        }
    +    } catch (DatabaseException e) {
    +        // If we catch a generic DatabaseException instead of
    +        // a LockConflictException, we simply abort and give
    +        // up -- we don't retry the operation.
    +        try {
    +            // Abort the transaction.
    +            if (txn != null) {
    +                txn.abort();
    +            }
    +        } catch (DatabaseException ae) {
    +            System.err.println("txn abort failed: " + ae.toString());
    +        }
    +        return -1;    
    +    }
    +} 
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/maxtxns.html b/docs/TransactionGettingStarted/maxtxns.html new file mode 100644 index 0000000..78a191a --- /dev/null +++ b/docs/TransactionGettingStarted/maxtxns.html @@ -0,0 +1,145 @@ + + + + + + Configuring the Transaction Subsystem + + + + + + + + + +
    +
    +
    +
    +

    Configuring the Transaction Subsystem

    +
    +
    +
    + + + + + +

    + + + + When you configure your transaction subsystem, you need to consider your transaction timeout + value. + + This value represents the longest period of time a + transaction can be active. Note, however, that + transaction timeouts are checked only when JE + examines its lock tables for blocked locks + (see Locks, Blocks, and Deadlocks + for more information). Therefore, a transaction's timeout can + have expired, but the application will not be notified until JE + has a reason to examine its lock tables. +

    +

    + Be aware that some transactions may be + inappropriately timed out before the transaction has a + chance to complete. You should therefore use this + mechanism only if you know your application + might have unacceptably long transactions and + you want to make sure your application will + not stall during their execution. + (This might happen if, for example, your + transaction blocks or requests too much + data.) +

    +

    + Note that by default transaction timeouts are set to 0 seconds, which means that they never time + out. +

    +

    + To set the maximum timeout value for your transactions, + use the + + + EnvironmentConfig.setTxnTimeout() + method. This method configures the entire + environment; not just the handle used to set the + configuration. Further, this value may + be set at any time during the application's + lifetime. +

    + +

    + This value can also be set using the je.txn.timeout property in your JE + properties file. +

    +
    + +
    +

    + For example: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    // Configure a maximum transaction timeout of 1 second.
    +    myEnvConfig.setTxnTimeout(1000000);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // From here, you open your databases (or store), proceed with your 
    +    // database or store operations, and respond to deadlocks as is 
    +    // normal (omitted for brevity).
    +
    +    ...
    +
    + + + diff --git a/docs/TransactionGettingStarted/moreinfo.html b/docs/TransactionGettingStarted/moreinfo.html new file mode 100644 index 0000000..ba3d47a --- /dev/null +++ b/docs/TransactionGettingStarted/moreinfo.html @@ -0,0 +1,166 @@ + + + + + + For More Information + + + + + + + + + +
    +
    +
    +
    +

    For More Information

    +
    +
    +
    +
    +
    +
    + + Contact Us + +
    +
    +
    +

    + Beyond this manual, you may also find the following sources of + information useful when building a transactional JE + application: +

    + + +

    + To download the latest + + Berkeley DB Java Edition + + documentation along with white papers and other collateral, + visit http://www.oracle.com/technetwork/indexes/documentation/index.html. +

    +

    + For the latest version of the Oracle + + Berkeley DB Java Edition + + downloads, visit + http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html. +

    +
    +
    +
    +
    +
    +

    Contact Us

    +
    +
    +
    +

    + You can post your comments and questions at the Oracle + Technology (OTN) forum for + + + + Oracle Berkeley DB Java Edition at: https://forums.oracle.com/forums/forum.jspa?forumID=273. + +

    +

    + For sales or support information, email to: + berkeleydb-info_us@oracle.com + You can subscribe to a low-volume email announcement list for + the Berkeley DB product family by sending email to: + bdb-join@oss.oracle.com +

    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/multithread-intro.html b/docs/TransactionGettingStarted/multithread-intro.html new file mode 100644 index 0000000..816341f --- /dev/null +++ b/docs/TransactionGettingStarted/multithread-intro.html @@ -0,0 +1,96 @@ + + + + + + Multi-threaded Applications + + + + + + + + + +
    +
    +
    +
    +

    Multi-threaded + + Applications

    +
    +
    +
    +

    + JE is designed to support multi-threaded applications, but their usage means + you must pay careful attention to issues of concurrency. + Transactions help your application's concurrency by providing various levels of + isolation for your threads of control. In addition, JE + provides mechanisms that allow you to detect and respond to + deadlocks. +

    +

    + Isolation means that database modifications made by + one transaction will not normally be seen by readers from another + transaction until the first commits its changes. Different threads + use different transaction handles, so + this mechanism is normally used to provide isolation between + database operations performed by different threads. +

    +

    + Note that JE supports different isolation levels. For example, + you can configure your application to see uncommitted reads, which means + that one transaction can see data that has been modified but not yet + committed by another transaction. Doing this might mean your + transaction reads data "dirtied" by another transaction, + but which subsequently might change before that + other transaction commits its changes. + On the other hand, lowering your isolation + requirements means that your application can experience + improved throughput due to reduced lock contention. +

    +

    + For more information on concurrency, on managing isolation + levels, and on deadlock detection, see Concurrency. +

    +
    + + + diff --git a/docs/TransactionGettingStarted/nodurabletxn.html b/docs/TransactionGettingStarted/nodurabletxn.html new file mode 100644 index 0000000..36eff4c --- /dev/null +++ b/docs/TransactionGettingStarted/nodurabletxn.html @@ -0,0 +1,270 @@ + + + + + + Non-Durable Transactions + + + + + + + + + +
    +
    +
    +
    +

    Non-Durable Transactions

    +
    +
    +
    +

    + As previously noted, by default transaction commits are + durable because they cause the modifications performed + under the transaction to be synchronously recorded in + your on-disk log files. However, it is possible to use + non-durable transactions. +

    +

    + You may want non-durable transactions for performance + reasons. For example, you might be using transactions + simply for the isolation guarantee. + + + + In this case, you might want to relax the synchronized write to disk that JE normally performs + as part of a transaction commit. Doing so means that your data will still make it to disk; however, + your application will not necessarily have to wait for the disk I/O to complete before it can + perform another database operation. This can greatly improve throughput for some workloads. + +

    +

    + To relax the durability guarantee for your transactions, + you use the Durability class to + define the durability policy that you want to use. The + Durability class constructor takes + three arguments, only one of which is interesting for a + standalone transactional application: +

    +
    +
      +
    • +

      + The synchronization policy for the local machine. +

      +
    • +
    • +

      + The synchronization policy for Replicas. Used only for + JE HA applications. +

      +
    • +
    • +

      + The acknowledgement policy. Again, this is required + only for JE HA applications. +

      +
    • +
    +
    +

    + We describe JE High Availability Applications in the + Berkeley DB, Java Edition Getting Started with High Availability Applications guide. +

    +

    + The synchronization policy that you give the + Durability class constructor can be + one of the following: +

    +
    +
      +
    • +

      + Durability.SyncPolicy.SYNC +

      +

      + Write and synchronously flush the log to disk upon + transaction commit. This offers the most durable + transaction configuration because the commit + operation will not return until all of the disk I/O + is complete. But, conversely, this offers the worse + possible write performance because disk I/O is an + expensive and time-consuming operation. +

      +

      + This is the default synchronization policy. A + transaction that uses this policy is considered to + be durable. +

      +
    • +
    • +

      + Durability.SyncPolicy.NO_SYNC +

      +

      + This causes JE to not synchronously force any data + to disk upon transaction commit. That is, the + modifications are held entirely inside the JVM and + the modifications are not forced to the file system + for long-term storage. Note, however, that the + data will eventually make it to the filesystem + (assuming no application or OS crashes) as a part + of JE's management of its logging buffers and/or + cache. +

      +

      + This form of a commit provides a weak durability + guarantee because data loss can occur due to an + application, JVM, or OS crash. In fact, this + represents the least durable configuration that you + can provide for your transactions. But it also + offers much better write performance than the other + options. +

      +
    • +
    • +

      + Durability.SyncPolicy.WRITE_NO_SYNC +

      +

      + This causes data to be synchronously written to the + OS's file system buffers upon transaction commit. + The data will eventually be written to disk, but + this occurs when the operating system chooses to + schedule the activity; the transaction commit can + complete successfully before this disk I/O is + performed by the OS. +

      +
    • +
    • +

      + This form of commit protects you against + application and JVM crashes, but not against OS + crashes. This method offers less room for the + possibility of data loss than does NO_SYNC. +

      +
    • +
    +
    +

    + You can specify your durability policy on an + environment-wide basis by creating a + Durability class and then giving it + to EnvironmentConfig.setDurability(). + You can also override the environment default durability + policy on a transaction-by-transaction basis by providing a + Durability class to the + TransactionConfig object you use to + configure your transaction using the + TransactionConfig.setDurability() + method. +

    +

    + For example: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Durability;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +import com.sleepycat.je.TransactionConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    Durability defaultDurability = 
    +        new Durability(Durability.SyncPolicy.NO_SYNC, 
    +                       null,    // unused by non-HA applications. 
    +                       null);   // unused by non-HA applications.  
    +
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +    myEnvConfig.setDurability(defaultDurability);
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database. Create it if it does not already exist.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null,
    +                                    "sampleDatabase",
    +                                    dbConfig);
    +
    +    String keyString = "thekey";
    +    String dataString = "thedata";
    +    DatabaseEntry key = 
    +        new DatabaseEntry(keyString.getBytes("UTF-8"));
    +    DatabaseEntry data = 
    +        new DatabaseEntry(dataString.getBytes("UTF-8"));
    +
    +    Durability newDurability = 
    +        new Durability(Durability.SyncPolicy.WRITE_NO_SYNC, 
    +                       null,    // unused by non-HA applications. 
    +                       null);   // unused by non-HA applications.
    +
    +    TransactionConfig tc = new TransactionConfig();
    +    tc.setDurability(newDurability);
    +    Transaction txn = myEnv.beginTransaction(null, tc);
    +        
    +    try {
    +        myDatabase.put(txn, key, data);
    +        txn.commit();
    +    } catch (Exception e) {
    +        if (txn != null) {
    +            txn.abort();
    +            txn = null;
    +        }
    +    }
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +} 
    +
    + + + diff --git a/docs/TransactionGettingStarted/perftune-intro.html b/docs/TransactionGettingStarted/perftune-intro.html new file mode 100644 index 0000000..d9b6f44 --- /dev/null +++ b/docs/TransactionGettingStarted/perftune-intro.html @@ -0,0 +1,79 @@ + + + + + + Performance Tuning + + + + + + + + + +
    +
    +
    +
    +

    Performance Tuning

    +
    +
    +
    +

    + From a performance perspective, the use of transactions is not free. + Depending on how you configure them, transaction commits + usually require your application to perform disk I/O that a non-transactional + application does not perform. Also, for multi-threaded + applications, the use of transactions can + result in increased lock contention due to extra locking + requirements driven by transactional isolation guarantees. +

    +

    + There is therefore a performance tuning component to transactional applications + that is not applicable for non-transactional applications (although + some tuning considerations do exist whether or not your application uses + transactions). Where appropriate, these tuning considerations are + introduced in the following chapters. + + + +

    +
    + + + diff --git a/docs/TransactionGettingStarted/preface.html b/docs/TransactionGettingStarted/preface.html new file mode 100644 index 0000000..4f00821 --- /dev/null +++ b/docs/TransactionGettingStarted/preface.html @@ -0,0 +1,168 @@ + + + + + + Preface + + + + + + + + + +
    +
    +
    +
    +

    Preface

    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Conventions Used in this Book + +
    +
    + + For More Information + +
    +
    +
    +
    + + Contact Us + +
    +
    +
    +
    +
    +

    + This document describes how to use transactions with your Berkeley DB, Java Edition + applications. It is intended to describe how to + transaction protect your application's data. The APIs used to perform this task + are described here, as are the environment infrastructure and administrative tasks + required by a transactional application. This book also + describes multi-threaded JE applications and the requirements they + have for deadlock detection. +

    +

    + This book describes Berkeley DB, Java Edition version 12c Release 2 +

    +

    + This book is aimed at the software engineer responsible for writing a + transactional JE application. +

    +

    + This book assumes that you have already read and understood the + concepts contained in the + + + Getting Started with Berkeley DB, Java Edition guide. +

    +
    +
    +
    +
    +

    Conventions Used in this Book

    +
    +
    +
    +

    + The following typographical conventions are used within in this manual: +

    +

    + Class names are represented in monospaced font, as are method + names. For example: + + "The Environment.openDatabase() method + returns a Database class object." + + + + +

    +

    + Variable or non-literal text is presented in italics. For example: "Go to your + JE_HOME directory." +

    +

    + Program examples are displayed in a monospaced font on a shaded background. + For example: +

    +
    import com.sleepycat.je.Environment;
    +
    +...
    +
    +// Open the environment. Allow it to be created if it does not already 
    +// exist.
    +Environment myDbEnv;
    +

    + In some situations, programming examples are updated from one chapter to the next. When + this occurs, the new code is presented in monospaced bold font. For example: +

    +
    import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import java.io.File;
    +
    +...
    +
    +// Open the environment. Allow it to be created if it does not already 
    +// exist.
    +Environment myDbEnv;
    +EnvironmentConfig envConfig = new EnvironmentConfig();
    +envConfig.setAllowCreate(true);
    +myDbEnv = new Environment(new File("/export/dbEnv"), envConfig); 
    +
    +

    Note

    +

    + Finally, notes of special interest are represented using a note block such + as this. +

    +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/readblock.jpg b/docs/TransactionGettingStarted/readblock.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16a511feb2a1d42e66eb303054f9616b60060390 GIT binary patch literal 10504 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 JQ4#lx{{>E>0o4Ei literal 0 HcmV?d00001 diff --git a/docs/TransactionGettingStarted/readmodifywrite.html b/docs/TransactionGettingStarted/readmodifywrite.html new file mode 100644 index 0000000..fb92ff7 --- /dev/null +++ b/docs/TransactionGettingStarted/readmodifywrite.html @@ -0,0 +1,159 @@ + + + + + + Read/Modify/Write + + + + + + + + + +
    +
    +
    +
    +

    Read/Modify/Write

    +
    +
    +
    +

    + If you are retrieving + + + a record from the database or a class from the store + for the purpose of modifying or deleting it, you should declare + a read-modify-write cycle at the time that you read the + record. + + Doing so causes JE to obtain write locks (instead of a read + locks) at the time of the read. This helps to prevent deadlocks by + preventing another transaction from acquiring a read lock on the same + record while the read-modify-write cycle is in progress. +

    +

    + Note that declaring a read-modify-write cycle may actually increase the amount of blocking that your + application sees, because readers immediately obtain write locks and write locks cannot be shared. For this + reason, you should use read-modify-write cycles only if you are seeing a large amount of deadlocking + occurring in your application. +

    +

    + In order to declare a read/modify/write cycle when you perform a + read operation, + + + + + + + specify + + com.sleepycat.je.LockMode.RMW + to the database, cursor, + PrimaryIndex, or + SecondaryIndex get method. + +

    +

    + For example: +

    +
    // Begin the deadlock retry loop as is normal.
    +while (retry_count < MAX_DEADLOCK_RETRIES) {
    +    try {
    +        txn = myEnv.beginTransaction(null, null);
    +
    +        ...
    +        // key and data are DatabaseEntry objects.
    +        // Their usage is omitted for brevity.
    +        ...
    +
    +        // Read the data. Declare the read/modify/write cycle here
    +        myDatabase.get(txn, key, data, LockMode.RMW);
    +
    +
    +        // Put the data. Note that you do not have to provide any 
    +        // additional flags here due to the read/modify/write 
    +        // cycle. Simply put the data and perform your deadlock 
    +        // detection as normal.
    +        myDatabase.put(txn, key, data);
    +        txn.commit();
    +        return 0;
    +    } catch (DeadlockException de) {
    +        // Deadlock detection and exception handling omitted
    +        // for brevity
    +        ... 
    +

    + Or, with the DPL: +

    +
    // Begin the deadlock retry loop as is normal
    +        while (retry_count < MAX_DEADLOCK_RETRIES) {
    +    try {
    +        txn = myEnv.beginTransaction(null, null);
    +
    +        ...
    +        // 'store' is an EntityStore and 'Inventory' is an entity class
    +        // Their usage and implementation is omitted for brevity.
    +        ...
    +
    +        // Read the data, using the PrimaryIndex for the entity object
    +        PrimaryIndex<String,Inventory> pi = 
    +                store.getPrimaryIndex(String.class, Inventory.class);
    +        Inventory iv = pi.get(txn, "somekey", LockMode.RMW);
    +
    +        // Do something to the retreived object
    +
    +
    +        // Put the object. Note that you do not have to provide any 
    +        // additional flags here due to the read/modify/write 
    +        // cycle. Simply put the data and perform your deadlock 
    +        // detection as normal.
    +
    +        pi.put(txn, iv);
    +        txn.commit();
    +        return 0;
    +
    +    } catch (DeadlockException de) {
    +        // Deadlock detection and exception handling omitted
    +        // for brevity
    +        ... 
    +
    + + + diff --git a/docs/TransactionGettingStarted/recovery-intro.html b/docs/TransactionGettingStarted/recovery-intro.html new file mode 100644 index 0000000..f75dc60 --- /dev/null +++ b/docs/TransactionGettingStarted/recovery-intro.html @@ -0,0 +1,98 @@ + + + + + + Recoverability + + + + + + + + + +
    +
    +
    +
    +

    Recoverability

    +
    +
    +
    +

    + An important part of JE's transactional guarantees is durability. + Durability means that once a + transaction has been committed, the database modifications performed + under its protection will not be lost due to system failure. +

    +

    + + + JE supports a normal recovery that runs against a subset of + your log files. This is a routine procedure used whenever your + environment is first opened upon application startup, and it is intended to + ensure that your database is in a consistent state. JE also + supports archival backup and recovery in the case of + catastrophic failure, such as the loss of a physical disk + drive. +

    +

    + This book describes several different backup procedures + you can use to protect your on-disk data. These procedures + range from simple offline backup strategies to hot failovers. Hot failovers + provide not only a backup mechanism, but + also a way to recover from a fatal hardware failure. +

    +

    + This book also describes the recovery procedures you should use + for each of the backup strategies that you might employ. +

    +

    + For a detailed description of backup and restore procedures, see + + + the Getting Started with Berkeley DB, Java Edition guide. + + +

    +
    + + + diff --git a/docs/TransactionGettingStarted/rwlocks1.jpg b/docs/TransactionGettingStarted/rwlocks1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fc88fd31022397e8b5cc6292c4f28000051d7ec GIT binary patch literal 7428 zcma)A2UrtX*ABgfW{_e)dQqByNH0M;D1u5Ake~@20ZCArH0eb^kS0w)r8lJ`(jf$p zUIIes5D*AK`p@pSyWj49?SJQ)nRDKmdG0fF&Ux=Wb2fhV9l)TgsiO%XA_f2+oo|4% z4FIFMr>)~N01#Rqi3L}1A;(IOdt?D7z}3T`~yT36cn^TT2=-I)=L)|FJAiN z!vEJe`vPF31bijBLqfy|AZ8>YVI(?h1C#)WhycVS=Z8N)PD(~XK}k&X8~)(W--MWi zl#BsDL`pH)k{u;pav+q_-Wkbt_2o{$ z0XUt)CmKtJFY7N|wsH3}LFiN%qZ|^NJ=7%KN?F$j-+*(Qw;~I(QdLzUy;gmxL%@+d zSpm9ikw@S4PY3B@f|`BecahwQb?ops6hV}=9$T8(EJHpr|N69>P+60(=hr!chhW}Q z{!hqf?j^)^1`II@!W7eaoMw_X1w}at6LHV7$x7J@X#GUYw5PyWf$E2p71`{s8kn*o zpn=?Rx9YoReA%YdRtHkZr++S~u(>QzVt7)A?wWEYc$CC0uo3lIxpI+~u2-jN!8D z8+KbCfmcT)?)mh-jI%AgrN=!7bVQ2_smX9fv;d(7)r9>R(Z)zk!eQ162xRd%oK;ZYx+QJ?OWccDsEp& zOZ-#zGWYe68|oFFb3Hd-XB1Bdc6x~r$oe|&2tzLFCWWlR7Kb5A(y&JbD z2$^V7e*&KH)3J^-4R2+PRQ|y)Fql`S{DZ^_6S59EGJk&Ox%2NO@L$g4p|5^e@pet? zNk_h%&Y99gV%Y0_V+b-NLz5%qp(nIEl}iRq#b*GKK#Ph`Hh5LKQBqX?1oguce*P0UMZl)lZF zfAMG7tfM-+B1td3sAPi)RfY(wQeoov)Gs>H;iNDw7rd@iT+m2@hkXtmy41YUj9Aaw?jT$X2h$^gHG~kC(vdnPNA^%*P!uF&OWUBja^Z3^X`$9CA2vR1l&YsL<=b zOHqE(2JNUBZiF{>afRS%@mL1j@55q;b(x^sPycNDFU>X#Q$4h``-gj`qEptcVThxVVUtZ9_r*h zlj=B}U#D)l|MaWq#X5b_0;{?#FO}=3We?8)JQl|r0pE{@4qJkb!(DePD1vqk*2(F2 z_?yvPm+AXdida>;lFk4MT>t3-phB&<#I^l$vbgSfaiiwAz^ET%9cG2Xz^TTEi95_1 z8J`YqpR(BfQ)`sZr>&ewy-_}ynhIRzW5sgHLbrT z`0*Z#l1cuWD^z}-TQ#%T9_xdwvVV#Ngd{E1$}P3LeH9$b((x8;h>$^S-<7eBpBKQ} zk9JGpU8@PN>{#41m?TKAz360uwy-}$@$iV|QdT~N!61YeF9I!4hsL5m*vCRR_8lNQ zAzb*z2=W`>VM7y1M39@YjTYQ$)rWaa)ir@$^b=HMQP$H>+5Y)0{$cSwKDi<@ukv-k zC@!2PT#6yVPVK~OV!(6%B9`4f`O1=qVYUIAk|P6|McLR3y0Y%*fUaC5Em^gopi3t{ zYuHw?Wl^R^>q=iQj8&2~HAnU*F^f$cxs2?NH;hpxX0yaF*3gDS+I>2(H_{5Fj8qBl z!faz>jfUjF;fbk&vMYIv&X6T?(QgL!tXG~AI-QxTQ@K|D|7GkeQ371O%aUCpM z9Yvoi=A8jjso_0X3;rG3$?ytsu>J`9M4lH0^SKOB?;t*2J?Qeb$gckZoNXkrV&Jzp z2C5{(D@-IItu@pA%nrlOH}rT!+Qxg-H8>Hv&ouF=^_s@A3xm~qa6MrUsZcc39Kl47_@RN-$)mn3J!&$&qTaiUo6|~-ATLw2(IqGA&m0?zeMbcso^br8RMcUl z35)Mba5crGWxc4prb#}N;cptl*k4L9 zYQ6>rvlOH@-R}GFzy`AxtQA`%wpBmG%T=!m36F2Lb$|W#lUfxb3pw^Er#)N7hOSXP zZ2&itwCZi_0eb1IT?MsKffk>N6Ja8+@xLg|HY-fxk$EZLZ#MU7DsN>5&j%Vgl&aWb zj-Kc=IIp=(w46-`6tUNj`?-5!*kp1rWTBAR9MGfN$2VG#Kw&>+t4GzP&Hz$r_ zSp=+{jlerkk?zeg_)i5xRgU72%gM^N(ApBAA`?zpzfVEW! z)67I^7asLw-eEL-^D)r$Wr(i~WwVX8!2sLItUZNQ^Sb(EQ#!mL_h6s!^pbtEDaUkO zDNig3rr|ogbE0^DZ%fk*n#wyn{b?*5dt*pz%$r~r^4X<|g>Nhah z-P%}Dpb2Akt{QFN!;>6+ z^bEET6lfFpz#E{>XWA32rVlkBb=kNz65ePv>+E{qx~yE}&*76j%vrQ|#EAXDL|Rn} zwUFvj?*1YX<{d2|=G<@^*iY2zHYQ|Cw_ELh%Kp}92w9qL2YUP!M8Bsozhg5Gp(BAl%umBq5iX6RcWVwjgU#RkNt$;)N0HIqQITH9Cv@m~;7 z>$8?zfq?v{=es`1fkW1+NLl4J(x7F}*wbPN+2)R7m-{`yZ!-y5+sazJ z9{hgoM->gDIBlc;D~MO1wH3Ltac?<`$5x;i?ii`J?co_6LOIdZakW z(;X{UIvlv>ZPE61)I2UXva=L^yC^6~Iw+I*etLeyh{Y=;e$&LmD=#`K7kT-I?G3kU z+z4*?NSv*0g^a}K_1Qe(R+pk6kqfbQaZN=*lRw$B7R$UgvSLOX&A}p~D_gdBN`aMg@UK>tSA08K%QTE{r>=k;1xjX;rUrfKh7J#AqS|wmPh(j; zW;%wk`Tl%bX~VUGLOWZuy<&rx67I|K$49wn8s7WVQnuheWHc&)T$yy)SXu9#b{mzlNbeH6g+4m(6d|sy| zR+_Ob#$Q<*jp=G*W{)u8AY852wn#TST#-MtOjk39h3DM}4x57_qEMz(omMewXeTk; z%JdnaBB;vWBu37CU)rgcq*_GZNKTI+F0!3?6YTA+A4!NiZ%@bzk_I!m+dZxee_Cf= znFwSg+}746YaD~jBjIoaVsNTD&gh3l+)YP8bF~+bo7J<5=hHQb-v~y0>Es55m32?c zK1cVBRg+y$N#%W&7ghGuVImD2ALvh~I$UVh#a_`$!uksEVvX3KUUmAg`QwUo!&@^~ zaxe?K>DqyDx%+I8uanhq(fZTg+hc>|6iU?`L2V6r6g{u*ZdNcD zNywMg==u(54%VuZVOEwTnnnc)o{+1k%?;FKJwcM*$?d8X_GihZke5@?yh{W6$}OFg z0Wx)6H@f~dE&b*S?xZKV*Lg*e^7@Nil1`986dGoh6?LgRUbPDy^Pl-#)W|durrIkZ5FAZjAVaRzs~vsPni+k=~}*uTq{;c z$;%&($+*^6?^O*Il^eUN!xLc|!KQkfmxUxMC0*OH$_?QcgYHG)J4M#bTjsvY*Ra*R*KWH+^+WB1NLWt$*qI5ElwOICk}bsw;xLgrYF>&!j3wR)PND3 zg>=da#3s8t<0UhPLc&1uGr(SAf|UO@WNQ4fO4t`$o(`xZt+|``0EgvtW>r|G36H;C z9c=_LF8T(OBje7>^a3=yvA!EyeOTwCHXhXH@HtIOQZa*SB`Z zFwWord}XB1t`_#%F&}+iy2Wy;3R~zLm#@hDtm5ELlnNEeDxCRXDYnDrr?#Zsk{b&u zFnW!E0^eojr{YLC5&OE818gH@_ZSasxL^Q`X>U}PTY3O{d)jCo*gR8rB8 zLxTHEP{sNFDL$qw{jFbu48&Xi^BRf@s6win?8Yf7f;kl0##ukHg++g#iByI!3&l`{=TEoqu!d(-KA1j{i~ z@4_g%p8M**_t6~wi_PrVQ7@RXH)~zOEnf7F9v>qk=x4Zmt!#ZAwRMh<#gc;xbLjW? zoa#S6qlW!N>049}1>2iox!ZPr)D(ltqPxQ|49|1By*`evHN2BaSJT?f=lPTE!<(_ z>*>2sGM=f{dQyi0D{z0a=e*B_AKca1&g3je#&jU^hti(>h;g{MjQC5J@T+4p)P`L( z{|qYN&W=u$0wv3&EL--ptEW^+p3aR%T#fvU4j_X{Ss zZTB8Lur;|NF|zbo#8`b=pDXO$q!_8Z0uJX%F1u4xZn|bHckAOG^$}Y;Od?)BtA*Zg zjxS#BT2hOQGkS7$&~VouC8nT8U1{bBC9Gc76;jI!=XWS~e#RGnjaZgY6}8!cI*pl$ zpuR-luCx+n0P6t1NNVsR7!n-BW-HKv)XOO*!n=%kucRJlc=d0WyK zu!rIkuN!>cb; z^7FJ?KgJzNW(wO;$|zGqjE8y4Kbe)bq+nW zG9upx-JPTrIi?Dj1vv8DWwo3t*?DF-IxJ@$?G|Clw@PcV_xvX2_Feio3J_bTw6FBg z#2vi{-(_%*E8O22ako8|tlE_tcF3F8G{1H~3?Qm_q^|v*NMT>03JLSq&FOIL4I7`c zCu;Gt7lBP(M-gn)H+-$w%*F#vXZHpA3molE?!AEyho}Fn#98MWes@IhmJlA<30LKF z&*}&&@OR(*7fHT8=^6V$K#=?s80 z`KisxwcB6Zj2St-K+&bRyY9O0=^q^MZ|{`$$*A3=pi(xgy*BwH57g+M4Uh=$0o&qWLmwrRJ z?-2ZkhNh;exG)RD#nsyLc>B%AJ~;P7;jfw!LCN-AR(ODgk)*h4q(at0wqL&5JLHw_ znXzQc(A>|qHT4Q0smfnaLA51y2KX`|KCe=w`M&gzRm6WXApC->I?d;$6qo@KjLdg~ zJ!=>%L=QXl6A=OQ>g+%s z1##<(egSDQ#prXxs2ugy5@L&)u|0~Pi(0>LXdDI+sT7D^~@!!Vs&m@KJv$@kN9sXLUfxgY(lyPT(ihyNy* kci825ikg6543holXMn-eEqZ)u&B?Iu{;^UO=h?*n0W}#Kp8x;= literal 0 HcmV?d00001 diff --git a/docs/TransactionGettingStarted/simplelock.jpg b/docs/TransactionGettingStarted/simplelock.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dca4ad820d049e31ac7c6a7abd682093f72b2c3 GIT binary patch literal 4453 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 + + + + + A Note on System Failure + + + + + + + + + +
    +
    +
    +
    +

    A Note on System Failure

    +
    +
    +
    +

    + From time to time this manual mentions that transactions + protect your data against 'system or application failure.' This + is true up to a certain extent. However, not all failures are + created equal and no data protection mechanism can protect you + against every conceivable way a computing system can find to + die. +

    +

    + Generally, when this book talks about protection against + failures, it means that transactions offer protection against + the likeliest culprits for system and application crashes. So + long as your data modifications have been committed to disk, + those modifications should persist even if your application or + OS subsequently fails. And, even if the application or OS + fails in the middle of a transaction commit (or abort), the + data on disk should be either in a consistent state, or there + should be enough data available to bring your databases into a + consistent state (via a recovery procedure, for example). You + may, however, lose whatever data you were committing at the + time of the failure, but your databases will be otherwise + unaffected. +

    +
    +

    Note

    +

    + Be aware that many disks have a disk write cache and on + some systems it is enabled by default. This means that + a transaction can have committed, and to your + application the data may appear to reside on disk, but + the data may in fact reside only in the write cache at + that time. This means that if the disk write cache is + enabled and there is no battery backup for it, data can + be lost after an OS crash even when maximum durability + mode is in use. For maximum durability, disable the + disk write cache or use a disk write cache with a + battery backup. +

    +
    +

    + Of course, if your disk fails, then the transactional benefits described in this book + are only as good as the backups you have taken. + + + +

    +

    + Finally, by following the programming examples shown in this book, you can write your code so as to protect + your data in the event that your code crashes. However, no programming API can protect you against logic + failures in your own code; transactions cannot protect you from simply writing the wrong thing to your + databases. +

    +
    + + + diff --git a/docs/TransactionGettingStarted/txn_ccursor.html b/docs/TransactionGettingStarted/txn_ccursor.html new file mode 100644 index 0000000..4e7959a --- /dev/null +++ b/docs/TransactionGettingStarted/txn_ccursor.html @@ -0,0 +1,226 @@ + + + + + + Transactional Cursors and Concurrent Applications + + + + + + + + + +
    +
    +
    +
    +

    Transactional Cursors and Concurrent Applications

    +
    +
    +
    + +

    + When you use transactional cursors with a concurrent application, remember that + in the event of a deadlock you must make sure that you close your cursor before you abort and retry your + transaction. This is true of both + base API and DPL cursors. +

    +

    + Also, remember that when you are using the default isolation level, + every time your cursor reads a record it locks + that record until the encompassing transaction is resolved. This + means that walking your database with a transactional cursor + increases the chance of lock contention. +

    +

    + For this reason, if you must routinely walk your database with a + transactional cursor, consider using a reduced isolation level + such as read committed. This is + true of both base API and DPL cursors. +

    +
    +
    +
    +
    +

    Using Cursors with Uncommitted Data

    +
    +
    +
    +

    + + As described in Reading Uncommitted Data + above, it is possible to relax your transaction's isolation + level such that it can read data modified but not yet committed + by another transaction. You can configure this when you create + your transaction handle, and when you do so then all cursors opened + inside that transaction will automatically use uncommitted reads. +

    +

    + You can also do this when you create a cursor handle from within + a serializable transaction. When you do this, only those + cursors configured for uncommitted reads uses uncommitted reads. +

    +

    + The following example shows how to configure an individual cursor handle + to read uncommitted data from within a serializable (full isolation) transaction. + For an example of + configuring a transaction to perform uncommitted reads in + general, see Reading Uncommitted Data. +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Cursor;
    +import com.sleepycat.je.CursorConfig;
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null,              // txn handle
    +                                    "sampleDatabase",  // db file name
    +                                    dbConfig);
    +
    +    // Open the transaction. Note that this is a repeatable
    +    // read transaction.
    +    Transaction txn = myEnv.beginTransaction(null, null);
    +    Cursor cursor = null;
    +    try {
    +        // Use the transaction handle here
    +        // Get our cursor. Note that we pass the transaction 
    +        // handle here. Note also that we cause the cursor 
    +        // to perform uncommitted reads.
    +        CursorConfig cconfig = new CursorConfig();
    +        cconfig.setReadUncommitted(true);
    +        cursor = db.openCursor(txn, cconfig);
    +
    +        // From here, you perform your cursor reads and writes 
    +        // as normal, committing and aborting the transactions as 
    +        // is necessary, and testing for deadlock exceptions as 
    +        // normal (omitted for brevity). 
    +        
    +        ... 
    +

    + If you are using the DPL: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.CursorConfig;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import com.sleepycat.persist.EntityCursor;
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.PrimaryIndex;
    +import com.sleepycat.persist.StoreConfig;
    +
    +import java.util.Iterator;
    +
    +import java.io.File;
    +
    +...
    +
    +EntityStore myStore = null;
    +Environment myEnv = null;
    +PrimaryIndex<String,AnEntityClass> pKey;
    +try {
    +
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Set up the entity store
    +    StoreConfig myStoreConfig = new StoreConfig();
    +    myStoreConfig.setAllowCreate(true);
    +    myStoreConfig.setTransactional(true);
    +
    +    // Instantiate the store
    +    myStore = new EntityStore(myEnv, storeName, myStoreConfig);
    +
    +    // Open the transaction. Note that this is a repeatable
    +    // read transaction.
    +    Transaction txn = myEnv.beginTransaction(null, null);
    +
    +    //Configure our cursor for uncommitted reads.
    +    CursorConfig cconfig = new CursorConfig();
    +    cconfig.setReadUncommitted(true);
    +
    +    // Get our cursor. Note that we pass the transaction 
    +    // handle here. Note also that we cause the cursor 
    +    // to perform uncommitted reads.
    +    EntityCursor<AnEntityClass> cursor = pKey.entities(txn, cconfig);
    +
    +    try {
    +        // From here, you perform your cursor reads and writes 
    +        // as normal, committing and aborting the transactions as 
    +        // is necessary, and testing for deadlock exceptions as 
    +        // normal (omitted for brevity). 
    +        
    +        ... 
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/txnconcurrency.html b/docs/TransactionGettingStarted/txnconcurrency.html new file mode 100644 index 0000000..ac45a7c --- /dev/null +++ b/docs/TransactionGettingStarted/txnconcurrency.html @@ -0,0 +1,373 @@ + + + + + + Chapter 4. Concurrency + + + + + + + + + +
    +
    +
    +
    +

    Chapter 4. Concurrency

    +
    +
    +
    + +

    + + JE offers a great deal of support for multi-threaded + + applications even when transactions are not in use. Many of JE's + handles are + thread-safe + and JE provides a + flexible locking subsystem for managing databases in a concurrent + application. Further, JE provides a robust mechanism for + detecting and responding to + + lock conflicts. + All of these concepts are + explored in this chapter. +

    +

    + Before continuing, it is useful to define a few terms that will appear + throughout this chapter: +

    +
    +
      +
    • +

      + Thread of control +

      +

      + Refers to a thread that is performing work in your application. + Typically, in this book that thread will be performing JE + operations. +

      +
    • +
    • +

      + Locking +

      +

      + When a thread of control obtains + access to a shared resource, it is said to be + locking that resource. Note that + JE supports both exclusive and non-exclusive locks. See + Locks for more information. +

      +
    • +
    • +

      + Free-threaded +

      +

      + Data structures and objects are free-threaded if they can be + shared across threads of control without any explicit locking on + the part of the application. Some books, libraries, and + programming languages may use the term + thread-safe for data structures or objects + that have this characteristic. The two terms mean the + same thing. +

      +

      + For a description of free-threaded JE objects, see + Which JE Handles are Free-Threaded. +

      +
    • +
    • +

      + Blocked +

      +

      + When a thread cannot obtain a lock because some other + thread already holds a lock on that object, the lock + attempt is said to be blocked. See + Blocks for more information. +

      +
    • +
    • +

      + Deadlock +

      +

      + Occurs when two or more threads of control attempt to access conflicting resource in such a way as none + of the threads can any longer make further progress. +

      +

      + For example, if Thread A is blocked waiting for a resource held by Thread + B, while at the same time Thread B is blocked waiting for a + resource held by Thread A, then neither thread can make any + forward progress. In this situation, Thread A and Thread B + are said to be deadlocked. +

      +

      + For more information, see Deadlocks. +

      +
    • +
    • +

      + Lock Conflict +

      +

      + In JE, a lock conflict simply means that a thread of + control attempted to obtain a lock, but was unable to get + it before the lock timeout period expired. This may have + happened because a deadlock has occurred, or it might have + happened because another thread is taking too long to + complete a long-running database operation. Either way, + you do the same things in response to a lock conflict + as you do for a true deadlock. See JE Lock Management for more information. +

      +
    • +
    +
    +
    +
    +
    +
    +

    Which JE Handles are Free-Threaded

    +
    +
    +
    +

    + The following describes to what extent and under what conditions + individual handles are free-threaded. +

    +
    +
      +
    • +

      + + + Environment + + and the DPL + EntityStore + +

      +

      + This class is free-threaded. +

      +
    • +
    • +

      + + + Database + + and the DPL + PrimaryIndex + +

      +

      + These classes are free-threaded. +

      +
    • +
    • +

      + SecondaryDatabase + and DPL SecondaryIndex +

      +

      + These classes are free-threaded. +

      +
    • +
    • +

      + + + Cursor + + and the DPL + EntityCursor + +

      +

      + If the cursor is a transactional cursor, it can be used by + multiple threads of control so long as the application + serializes access to the handle. + If the cursor is not a transactional cursor, it can not be + shared across multiple threads of control at all. +

      +
    • +
    • +

      + SecondaryCursor +

      +

      + Same conditions apply as for Cursor + handles. +

      +
    • +
    • +

      + + + Transaction + +

      +

      + This class is free-threaded. +

      +
    • +
    +
    +
    +

    Note

    +

    + All other classes found in the DPL + (com.sleepycat.persist.*) and not + mentioned above are free-threaded. +

    +

    + All classes found in the bind APIs (com.sleepycat.bind.*) are free-threaded. +

    +
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/txncursor.html b/docs/TransactionGettingStarted/txncursor.html new file mode 100644 index 0000000..99d6704 --- /dev/null +++ b/docs/TransactionGettingStarted/txncursor.html @@ -0,0 +1,217 @@ + + + + + + Transactional Cursors + + + + + + + + + +
    +
    +
    +
    +

    Transactional Cursors

    +
    +
    +
    + +

    + You can transaction-protect your cursor operations by + specifying a transaction handle at the time that you create + your cursor. Beyond that, you do not ever + provide a transaction handle directly to a cursor method. +

    +

    + Note that if you transaction-protect a cursor, then you must + make sure that the cursor is closed before you either commit or + abort the transaction. For example: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Cursor;
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.OperationStatus;
    +import com.sleepycat.je.Transaction;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +
    +    // Database and environment opens omitted
    +
    +    String replacementData = "new data";
    +
    +    Transaction txn = myEnv.beginTransaction(null, null);
    +    Cursor cursor = null;
    +    try {
    +        // Use the transaction handle here
    +        cursor = db.openCursor(txn, null);
    +        DatabaseEntry key, data;
    +        
    +        DatabaseEntry key, data;
    +        while(cursor.getNext(key, data, LockMode.DEFAULT) ==
    +           OperationStatus.SUCCESS) {
    +            
    +            data.setData(replacementData.getBytes("UTF-8"));
    +            // No transaction handle is used on the cursor read or write
    +            // methods.
    +            cursor.putCurrent(data);
    +        }
    +        
    +        cursor.close();
    +        cursor = null;
    +        txn.commit();
    +    } catch (Exception e) {
    +        if (cursor != null) {
    +            cursor.close();
    +        }
    +        if (txn != null) {
    +            txn.abort();
    +            txn = null;
    +        }
    +    }
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +} 
    +
    +
    +
    +
    +

    Using Transactional DPL Cursors

    +
    +
    +
    +

    + When using the DPL, you create the cursor using the entity + class's primary or secondary index (see the + Getting Started with Berkeley DB, Java Edition + + guide for details). At the time that you create the cursor, you + pass a transaction handle to the entities() + method, and this causes all subsequent operations performed + using that cursor to be performed within the scope of the + transaction. +

    +

    + Note that if you are using a transaction-enabled store, + then you must provide a transaction handle when you open + your cursor. +

    +

    + For example: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +
    +import com.sleepycat.persist.EntityCursor;
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.PrimaryIndex;
    +
    +import java.io.File;
    +
    +...
    +
    +Environment myEnv = null;
    +EntityStore store = null;
    +
    +...
    +
    +
    +    // Store and environment open omitted, as is the DataAccessor
    +    // instantiation.
    +
    +...
    +
    +    Transaction txn = myEnv.beginTransaction(null, null);
    +    PrimaryIndex<String,Inventory> pi =
    +        store.getPrimaryIndex(String.class, Inventory.class);
    +    EntityCursor<Inventory> pi_cursor = pi.entities(txn, null);
    +
    +    try {
    +        for (Inventory ii : pi_cursor) {
    +            // do something with each object "ii"
    +            // A transactional handle is not required for any write
    +            // operations. All operations performed using this cursor
    +            // will be done within the scope of the transaction, txn.
    +        }
    +        pi_cursor.close();
    +        pi_cursor = null;
    +        txn.commit();
    +        txn = null;
    +    // Always make sure the cursor is closed when we are done with it.
    +    } catch (Exception e) {
    +        if (pi_cursor != null) {
    +            pi_cursor.close();
    +        }
    +        if (txn != null) {
    +            txn.abort();
    +            txn = null;
    +        }
    +    } 
    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/txnexample_dpl.html b/docs/TransactionGettingStarted/txnexample_dpl.html new file mode 100644 index 0000000..4544f84 --- /dev/null +++ b/docs/TransactionGettingStarted/txnexample_dpl.html @@ -0,0 +1,705 @@ + + + + + + DPL Transaction Example + + + + + + + + +
    +
    +
    +
    +

    DPL Transaction Example

    +
    +
    +
    +
    +
    +
    + + TxnGuide.java + +
    +
    + + PayloadDataEntity.java + +
    +
    + + StoreWriter.java + +
    +
    +
    +

    + The following Java code provides a fully functional example of a + multi-threaded transactional JE application using the DPL. + This example is nearly identical to the example provided in the + previous section, except that it uses an entity class and entity + store to manage its data. +

    +

    + As is the case with the previous examples, this example opens + an environment and then an entity store. It then creates + 5 threads, each of which writes 500 records to the database. + The primary key for these writes are based on pre-determined + integers, while the data is randomly generated data. + This means that the actual data is arbitrary and therefore uninteresting; + we picked it only because it requires minimum code to implement and therefore will + stay out of the way of the main points of this example. +

    +

    + Each thread writes 10 records under a single transaction + before committing and writing another 10 (this is repeated 50 + times). At the end of each transaction, but before committing, each + thread calls a function that uses a cursor to read every record in + the database. We do this in order to make some points about + database reads in a transactional environment. +

    +

    + Of course, each writer thread performs deadlock detection as + described in this manual. In addition, normal recovery is performed + when the environment is opened. +

    +

    + To implement this example, we need three classes: +

    +
    +
      +
    • +

      + TxnGuide.java +

      +

      + This is the main class for the application. It performs + environment and store management, spawns threads, and + creates the data that is placed in the database. See TxnGuide.java for implementation details. +

      +
    • +
    • +

      + StoreWriter.java +

      +

      + This class extends java.lang.Thread, and + as such it is our thread implementation. It is responsible + for actually reading and writing store. It also + performs all of our transaction management. See StoreWriter.java for + implementation details. +

      +
    • +
    • +

      + PayloadDataEntity.java +

      +

      + This is an entity class used to encapsulate several data + fields. See PayloadDataEntity.java for + implementation details. +

      +
    • +
    +
    +
    +
    +
    +
    +

    TxnGuide.java

    +
    +
    +
    +

    + The main class in our example application is used to open and + close our environment and store. It also spawns all the + threads that we need. We start with the normal series + of Java package and import statements, followed by our class + declaration: +

    +
    // File TxnGuideDPL.java
    +
    +package persist.txn;
    +
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseException;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.StoreConfig;
    +
    +import java.io.File;
    +
    +public class TxnGuideDPL { 
    +

    + Next we declare our class' private data members. Mostly these are used + for constants such as the name of the database that we are opening and + the number of threads that we are spawning. However, we also declare + our environment and database handles here. +

    +
        private static String myEnvPath = "./";
    +    private static String storeName = "exampleStore";
    +
    +    // Handles
    +    private static EntityStore myStore = null;
    +    private static Environment myEnv = null;
    +    private static final int NUMTHREADS = 5; 
    +

    + Next, we implement our usage() method. This + application optionally accepts a single command line argument which is + used to identify the environment home directory. +

    +
        private static void usage() {
    +        System.out.println("TxnGuideDPL [-h <env directory>]");
    +        System.exit(-1);
    +    } 
    +

    + Now we implement our main() method. This method + simply calls the methods to parse the command line arguments and open + the environment and store. It also creates and then joins the store writer + threads. +

    +
        public static void main(String args[]) {
    +        try {
    +            // Parse the arguments list
    +            parseArgs(args);
    +            // Open the environment and store
    +            openEnv();
    +
    +            // Start the threads
    +            StoreWriter[] threadArray;
    +            threadArray = new StoreWriter[NUMTHREADS];
    +            for (int i = 0; i < NUMTHREADS; i++) {
    +                threadArray[i] = new StoreWriter(myEnv, myStore);
    +                threadArray[i].start();
    +            }
    +
    +            for (int i = 0; i < NUMTHREADS; i++) {
    +                threadArray[i].join();
    +            }
    +        } catch (Exception e) {
    +            System.err.println("TxnGuideDPL: " + e.toString());
    +            e.printStackTrace();
    +        } finally {
    +            closeEnv();
    +        }
    +        System.out.println("All done.");
    +    } 
    +

    + Next we implement openEnv(). This method is used + to open the environment and then an entity store in that environment. Along + the way, we make sure that the transactional subsystem is correctly + initialized. +

    +
        private static void openEnv() throws DatabaseException {
    +        System.out.println("opening env and store");
    +
    +        // Set up the environment.
    +        EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +        myEnvConfig.setAllowCreate(true);
    +        myEnvConfig.setTransactional(true);
    +        //  Environment handles are free-threaded by default in JE,
    +        // so we do not have to do anything to cause the
    +        // environment handle to be free-threaded.
    +
    +        // Set up the entity store
    +        StoreConfig myStoreConfig = new StoreConfig();
    +        myStoreConfig.setAllowCreate(true);
    +        myStoreConfig.setTransactional(true);
    +
    +        // Open the environment
    +        myEnv = new Environment(new File(myEnvPath),    // Env home
    +                                    myEnvConfig);
    +
    +        // Open the store
    +        myStore = new EntityStore(myEnv, storeName, myStoreConfig);
    +    } 
    +

    + Finally, we implement the methods used to close our environment and + databases, parse the command line arguments, and provide our class + constructor. This is fairly standard code and it is mostly + uninteresting from the perspective of this manual. We include it here + purely for the purpose of completeness. +

    +
        private static void closeEnv() {
    +        System.out.println("Closing env and store");
    +        if (myStore != null ) {
    +            try {
    +                myStore.close();
    +            } catch (DatabaseException e) {
    +                System.err.println("closeEnv: myStore: " +
    +                    e.toString());
    +                e.printStackTrace();
    +            }
    +        }
    +
    +        if (myEnv != null ) {
    +            try {
    +                myEnv.close();
    +            } catch (DatabaseException e) {
    +                System.err.println("closeEnv: " + e.toString());
    +                e.printStackTrace();
    +            }
    +        }
    +    }
    +
    +    private TxnGuideDPL() {}
    +
    +    private static void parseArgs(String args[]) {
    +        int nArgs = args.length;
    +        for(int i = 0; i < args.length; ++i) {
    +            if (args[i].startsWith("-")) {
    +                switch(args[i].charAt(1)) {
    +                    case 'h':
    +                        if (i < nArgs - 1) {
    +                            myEnvPath = new String(args[++i]);
    +                        }
    +                    break;
    +                    default:
    +                        usage();
    +                }
    +            }
    +        }
    +    }
    +} 
    +
    +
    +
    +
    +
    +

    PayloadDataEntity.java

    +
    +
    +
    +

    + Before we show the implementation of the store writer thread, we + need to show the class that we will be placing into the store. This + class is fairly minimal. It simply allows you to store and retrieve an + int, a String, and a + double. The int is our primary key. +

    +
    package persist.txn;
    +import com.sleepycat.persist.model.Entity;
    +import com.sleepycat.persist.model.PrimaryKey;
    +import static com.sleepycat.persist.model.Relationship.*;
    +
    +@Entity
    +public class PayloadDataEntity {
    +    @PrimaryKey
    +    private int oID;
    +
    +    private String threadName;
    +
    +    private double doubleData;
    +
    +    PayloadDataEntity() {}
    +
    +    public double getDoubleData() { return doubleData; }
    +    public int getID() { return oID; }
    +    public String getThreadName() { return threadName; }
    +
    +    public void setDoubleData(double dd) { doubleData = dd; }
    +    public void setID(int id) { oID = id; }
    +    public void setThreadName(String tn) { threadName = tn; }
    +
    +} 
    +
    +
    +
    +
    +
    +

    StoreWriter.java

    +
    +
    +
    +

    + StoreWriter.java provides the implementation + for our entity store writer thread. It is responsible for: +

    +
    +
      +
    • +

      + All transaction management. +

      +
    • +
    • +

      + Responding to deadlock exceptions. +

      +
    • +
    • +

      + Providing data to be stored in the entity store. +

      +
    • +
    • +

      + Writing the data to the store. +

      +
    • +
    +
    +

    + In order to show off some of the ACID properties provided + by JE's transactional support, + StoreWriter.java does some things in a less + efficient way than you would probably decide to use in a + true production application. First, it groups 10 database + writes together in a single transaction when you could just + as easily perform one write for each transaction. If you + did this, you could use auto commit for the individual + database writes, which means your code would be slightly + simpler and you would run a much + smaller chance of encountering blocked and deadlocked + operations. However, by doing things this way, we are able + to show transactional atomicity, as well as deadlock + handling. +

    +

    + To begin, we provide the usual package and import statements, and we declare our class: +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.CursorConfig;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.LockConflictException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.Transaction;
    +
    +import com.sleepycat.persist.EntityCursor;
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.PrimaryIndex;
    +
    +import java.util.Iterator;
    +import java.util.Random;
    +import java.io.UnsupportedEncodingException;
    +
    +public class StoreWriter extends Thread
    +{ 
    +

    + Next we declare our private data members. Notice that we get handles + for the environment and the entity store. The random number generator + that we instantiate is used + to generate unique data for storage in the database. Finally, the + MAX_RETRY variable is used to define how many times + we will retry a transaction in the face of a deadlock. +

    +
        private EntityStore myStore = null;
    +    private Environment myEnv = null;
    +    private PrimaryIndex<Integer,PayloadDataEntity> pdKey;
    +    private Random generator = new Random();
    +    private boolean passTxn = false;
    +
    +    private static final int MAX_RETRY = 20; 
    +

    + Next we implement our class constructor. The most interesting thing about our constructor is + that we use it to obtain our entity class's primary index. +

    +
        // Constructor. Get our handles from here
    +    StoreWriter(Environment env, EntityStore store)
    +
    +        throws DatabaseException {
    +        myStore = store;
    +        myEnv = env;
    +
    +        // Open the data accessor. This is used to store persistent
    +        // objects.
    +        pdKey = myStore.getPrimaryIndex(Integer.class,
    +                    PayloadDataEntity.class);
    +    } 
    +

    + Now we implement our thread's run() method. + This is the method that is run when StoreWriter + threads are started in the main program (see TxnGuide.java). +

    +
        // Thread method that writes a series of records
    +    // to the database using transaction protection.
    +    // Deadlock handling is demonstrated here.
    +    public void run () { 
    +

    + The first thing we do is get a null transaction + handle before going into our main loop. We also begin the top transaction loop here that causes our application to + perform 50 transactions. +

    +
            Transaction txn = null;
    +
    +        // Perform 50 transactions
    +        for (int i=0; i<50; i++) { 
    +

    + Next we declare a retry variable. This is used to + determine whether a deadlock should result in our retrying the + operation. We also declare a retry_count variable + that is used to make sure we do not retry a transaction forever in the + unlikely event that the thread is unable to ever get a necessary lock. + (The only thing that might cause this is if some other thread dies + while holding an important lock. This is the only code that we have to + guard against that because the simplicity of this application makes it + highly unlikely that it will ever occur.) +

    +
               boolean retry = true;
    +           int retry_count = 0;
    +           // while loop is used for deadlock retries
    +           while (retry) { 
    +

    + Now we go into the try block that we use for + deadlock detection. We also begin our transaction here. +

    +
                    // try block used for deadlock detection and
    +                // general exception handling
    +                try {
    +
    +                    // Get a transaction
    +                    txn = myEnv.beginTransaction(null, null); 
    +

    + Now we write 10 objects under the transaction that we have just begun. + By combining multiple writes together under a single transaction, + we increase the likelihood that a deadlock will occur. Normally, + you want to reduce the potential for a deadlock and in this case + the way to do that is to perform a single write per transaction. In + other words, we should be using auto commit to + write to our database for this workload. +

    +

    + However, we want to show deadlock handling and by performing + multiple writes per transaction we can actually observe deadlocks + occurring. We also want to underscore the idea that you can + combing multiple database operations together in a single atomic + unit of work. So for our example, we do the (slightly) wrong thing. +

    +
    +
    +                    // Write 10 PayloadDataEntity objects to the 
    +                    // store for each transaction
    +                    for (int j = 0; j < 10; j++) {
    +                        // Instantiate an object
    +                        PayloadDataEntity pd = new PayloadDataEntity();
    +
    +                        // Set the Object ID. This is used as the 
    +                        // primary key.
    +                        pd.setID(i + j);
    +
    +                        // The thread name is used as a secondary key, and
    +                        // it is retrieved by this class's getName() 
    +                        // method.
    +                        pd.setThreadName(getName());
    +
    +                        // The last bit of data that we use is a double
    +                        // that we generate randomly. This data is not
    +                        // indexed.
    +                        pd.setDoubleData(generator.nextDouble());
    +
    +                        // Do the put
    +                        pdKey.put(txn, pd);
    +                    } 
    +

    + Having completed the inner database write loop, we could simply + commit the transaction and continue on to the next block of 10 + writes. However, we want to first illustrate a few points about + transactional processing so instead we call our + countObjects() method before calling the transaction + commit. countObjects() uses a cursor to read every + object in the entity store and return a count of the number of objects + that it found. +

    +

    + Because + countObjects() + reads every object in the store, if used incorrectly the thread + will self-deadlock. The writer thread has just written 500 objects + to the database, but because the transaction used for that write + has not yet been committed, each of those 500 objects are still + locked by the thread's transaction. If we then simply run a + non-transactional cursor over the store from within the same + thread that has locked those 500 objects, the cursor will + block when it tries to read one of those transactional + protected records. The thread immediately stops operation at that + point while the cursor waits for the read lock it has + requested. Because that read lock will never be released (the thread + can never make any forward progress), this represents a + self-deadlock for the thread. +

    +

    + There are three ways to prevent this self-deadlock: +

    +
    +
      +
    1. +

      + We can move the call to + countObjects() to a point after the + thread's transaction has committed. +

      +
    2. +
    3. +

      + We can allow countObjects() to + operate under the same transaction as all of the writes + were performed. +

      +
    4. +
    5. +

      + We can reduce our isolation guarantee for the application + by allowing uncommitted reads. +

      +
    6. +
    +
    +

    + For this example, we choose to use option 3 (uncommitted reads) to avoid + the deadlock. This means that we have to open our cursor handle + so that it knows to perform uncommitted reads. +

    +
                        // commit
    +                    System.out.println(getName() + " : committing txn : "
    +                                       + i);
    +                    System.out.println(getName() + " : Found " +
    +                        countObjects(txn) + " objects in the store.");
    +

    + Having performed this somewhat inelegant counting of the objects in the + database, we can now commit the transaction. +

    +
                        try {
    +                        txn.commit();
    +                        txn = null;
    +                    } catch (DatabaseException e) {
    +                        System.err.println("Error on txn commit: " +
    +                            e.toString());
    +                    }
    +                    retry = false; 
    +

    + If all goes well with the commit, we are done and we can move on to the + next batch of 10 objects to add to the store. However, in the event + of an error, we must handle our exceptions correctly. The first of + these is a deadlock exception. In the event of a deadlock, we want to + abort and retry the transaction, provided that we have not already + exceeded our retry limit for this transaction. +

    +
                    } catch (LockConflictException lce) {
    +                    System.out.println("################# " + getName() +
    +                        " : caught deadlock");
    +                    // retry if necessary
    +                    if (retry_count < MAX_RETRY) {
    +                        System.err.println(getName() +
    +                            " : Retrying operation.");
    +                        retry = true;
    +                        retry_count++;
    +                    } else {
    +                        System.err.println(getName() +
    +                            " : out of retries. Giving up.");
    +                        retry = false;
    +                    } 
    +

    + In the event of a standard, non-specific database exception, we simply + log the exception and then give up (the transaction is not retried). +

    +
                    } catch (DatabaseException e) {
    +                    // abort and don't retry
    +                    retry = false;
    +                    System.err.println(getName() +
    +                        " : caught exception: " + e.toString());
    +                    e.printStackTrace();  
    +

    + And, finally, we always abort the transaction if the transaction handle + is not null. Note that immediately after committing our transaction, we + set the transaction handle to null to guard against aborting a + transaction that has already been committed. +

    +
                    } finally {
    +                    if (txn != null) {
    +                        try {
    +                            txn.abort();
    +                        } catch (Exception e) {
    +                            System.err.println("Error aborting txn: " +
    +                                e.toString());
    +                            e.printStackTrace();
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    } 
    +

    + The final piece of our StoreWriter class is the + countObjects() implementation. Notice how in + this example we open the cursor such that it performs uncommitted + reads: +

    +
        // A method that counts every object in the store.
    +
    +    private int countObjects(Transaction txn)  throws DatabaseException {
    +        int count = 0;
    +
    +        CursorConfig cc = new CursorConfig();
    +        // This is ignored if the store is not opened with uncommitted read
    +        // support.
    +        cc.setReadUncommitted(true);
    +        EntityCursor<PayloadDataEntity> cursor = pdKey.entities(txn, cc);
    +
    +        try {
    +            for (PayloadDataEntity pdi : cursor) {
    +                    count++;
    +            }
    +        } finally {
    +            if (cursor != null) {
    +                cursor.close();
    +            }
    +        }
    +
    +        return count;
    +
    +    }
    +} 
    +
    +

    + This completes our transactional example. If you would like to + experiment with this code, you can find the example in the following + location in your JE distribution: +

    +
    JE_HOME/examples/persist/txn
    +
    + + + diff --git a/docs/TransactionGettingStarted/txnexample_java.html b/docs/TransactionGettingStarted/txnexample_java.html new file mode 100644 index 0000000..a7fba10 --- /dev/null +++ b/docs/TransactionGettingStarted/txnexample_java.html @@ -0,0 +1,767 @@ + + + + + + Base API Transaction Example + + + + + + + + + +
    +
    +
    +
    +

    Base API Transaction Example

    +
    +
    +
    +
    +
    +
    + + TxnGuide.java + +
    +
    + + PayloadData.java + +
    +
    + + DBWriter.java + +
    +
    +
    +

    + The following Java code provides a fully functional example of a + multi-threaded transactional JE application. + The example opens an environment and database, and then creates 5 + threads, each of which writes 500 records to the database. The keys + used for these writes are pre-determined strings, while the data is + a class that contains randomly generated data. This means that the actual + data is arbitrary and therefore uninteresting; we picked it only + because it requires minimum code to implement and therefore will + stay out of the way of the main points of this example. +

    +

    + Each thread writes 10 records under a single transaction + before committing and writing another 10 (this is repeated 50 + times). At the end of each transaction, but before committing, each + thread calls a function that uses a cursor to read every record in + the database. We do this in order to make some points about + database reads in a transactional environment. +

    +

    + Of course, each writer thread performs deadlock detection as + described in this manual. In addition, normal recovery is performed + when the environment is opened. +

    +

    + To implement this example, we need three classes: +

    +
    +
      +
    • +

      + TxnGuide.java +

      +

      + This is the main class for the application. It performs + environment and database management, spawns threads, and + creates the data that is placed in the database. See TxnGuide.java for implementation details. +

      +
    • +
    • +

      + DBWriter.java +

      +

      + This class extends java.lang.Thread, and + as such it is our thread implementation. It is responsible + for actually reading and writing to the database. It also + performs all of our transaction management. See DBWriter.java for + implementation details. +

      +
    • +
    • +

      + PayloadData.java +

      +

      + This is a data class used to encapsulate several data + fields. It is fairly uninteresting, except that the usage + of a class means that we have to use the bind APIs to + serialize it for storage in the database. See PayloadData.java for + implementation details. +

      +
    • +
    +
    +
    +
    +
    +
    +

    TxnGuide.java

    +
    +
    +
    +

    + The main class in our example application is used to open and + close our environment and database. It also spawns all the + threads that we need. We start with the normal series + of Java package and import statements, followed by our class + declaration: +

    +
    // File TxnGuide.java
    +
    +package je.txn;
    +
    +import com.sleepycat.bind.serial.StoredClassCatalog;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseException;
    +
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +
    +import java.io.File;
    +import java.io.FileNotFoundException;
    +
    +public class TxnGuide { 
    +

    + Next we declare our class' private data members. Mostly these are used + for constants such as the name of the database that we are opening and + the number of threads that we are spawning. However, we also declare + our environment and database handles here. +

    +
        private static String myEnvPath = "./";
    +    private static String dbName = "mydb.db";
    +    private static String cdbName = "myclassdb.db";
    +
    +    // DB handles
    +    private static Database myDb = null;
    +    private static Database myClassDb = null;
    +    private static Environment myEnv = null;
    +
    +    private static final int NUMTHREADS = 5; 
    +

    + Next, we implement our usage() method. This + application optionally accepts a single command line argument which is + used to identify the environment home directory. +

    +
        private static void usage() {
    +        System.out.println("TxnGuide [-h <env directory>]");
    +        System.exit(-1);
    +    } 
    +

    + Now we implement our main() method. This method + simply calls the methods to parse the command line arguments and open + the environment and database. It also creates the stored class catalog + that we use for serializing the data that we want to store in our + database. Finally, it creates and then joins the database writer + threads. +

    +
        public static void main(String args[]) {
    +        try {
    +            // Parse the arguments list
    +            parseArgs(args);
    +            // Open the environment and databases
    +            openEnv();
    +            // Get our class catalog (used to serialize objects)
    +            StoredClassCatalog classCatalog =
    +                new StoredClassCatalog(myClassDb);
    +
    +            // Start the threads
    +            DBWriter[] threadArray;
    +            threadArray = new DBWriter[NUMTHREADS];
    +            for (int i = 0; i < NUMTHREADS; i++) {
    +                threadArray[i] = new DBWriter(myEnv, myDb, classCatalog);
    +                threadArray[i].start();
    +            }
    +
    +            // Join the threads. That is, wait for each thread to 
    +            // complete before exiting the application.
    +            for (int i = 0; i < NUMTHREADS; i++) {
    +                threadArray[i].join();
    +            }
    +        } catch (Exception e) {
    +            System.err.println("TxnGuide: " + e.toString());
    +            e.printStackTrace();
    +        } finally {
    +            closeEnv();
    +        }
    +        System.out.println("All done.");
    +    } 
    +

    + Next we implement openEnv(). This method is used + to open the environment and then a database in that environment. Along + the way, we make sure that the transactional subsystem is correctly + initialized. +

    +

    + For the database open, notice that we open the database such that it + supports duplicate records. This is required purely by the data that + we are writing to the database, and it is only necessary if you run the + application more than once without first deleting the environment. +

    +
        private static void openEnv() throws DatabaseException {
    +        System.out.println("opening env");
    +
    +        // Set up the environment.
    +        EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +        myEnvConfig.setAllowCreate(true);
    +        myEnvConfig.setTransactional(true);
    +        // Environment handles are free-threaded by default in JE,
    +        // so we do not have to do anything to cause the
    +        // environment handle to be free-threaded.
    +
    +        // Set up the database
    +        DatabaseConfig myDbConfig = new DatabaseConfig();
    +        myDbConfig.setAllowCreate(true);
    +        myDbConfig.setTransactional(true);
    +        myDbConfig.setSortedDuplicates(true);
    +
    +        // Open the environment
    +        myEnv = new Environment(new File(myEnvPath),    // Env home
    +                                myEnvConfig);
    +
    +        // Open the database. Do not provide a txn handle. This open
    +        // is auto committed because DatabaseConfig.setTransactional()
    +        // is true.
    +        myDb = myEnv.openDatabase(null,     // txn handle
    +                                  dbName,   // Database file name
    +                                  myDbConfig);
    +
    +        // Used by the bind API for serializing objects 
    +        // Class database must not support duplicates
    +        myDbConfig.setSortedDuplicates(false);
    +        myClassDb = myEnv.openDatabase(null,     // txn handle
    +                                       cdbName,  // Database file name
    +                                       myDbConfig);
    +    } 
    +

    + Finally, we implement the methods used to close our environment and + databases, parse the command line arguments, and provide our class + constructor. This is fairly standard code and it is mostly + uninteresting from the perspective of this manual. We include it here + purely for the purpose of completeness. +

    +
        private static void closeEnv() {
    +        System.out.println("Closing env and databases");
    +        if (myDb != null ) {
    +            try {
    +                myDb.close();
    +            } catch (DatabaseException e) {
    +                System.err.println("closeEnv: myDb: " +
    +                    e.toString());
    +                e.printStackTrace();
    +            }
    +        }
    +
    +        if (myClassDb != null ) {
    +            try {
    +                myClassDb.close();
    +            } catch (DatabaseException e) {
    +                System.err.println("closeEnv: myClassDb: " +
    +                    e.toString());
    +                e.printStackTrace();
    +            }
    +        }
    +
    +        if (myEnv != null ) {
    +            try {
    +                myEnv.close();
    +            } catch (DatabaseException e) {
    +                System.err.println("closeEnv: " + e.toString());
    +                e.printStackTrace();
    +            }
    +        }
    +    }
    +
    +    private TxnGuide() {}
    +
    +    private static void parseArgs(String args[]) {
    +        for(int i = 0; i < args.length; ++i) {
    +            if (args[i].startsWith("-")) {
    +                switch(args[i].charAt(1)) {
    +                    case 'h':
    +                        myEnvPath = new String(args[++i]);
    +                        break;
    +                    default:
    +                        usage();
    +                }
    +            }
    +        }
    +    }
    +} 
    +
    +
    +
    +
    +
    +

    PayloadData.java

    +
    +
    +
    +

    + Before we show the implementation of the database writer thread, we + need to show the class that we will be placing into the database. This + class is fairly minimal. It simply allows you to store and retrieve an + int, a String, and a + double. We will be using the JE bind API from + within the writer thread to serialize instances of this class and place + them into our database. +

    +
    package je.txn;
    +
    +import java.io.Serializable;
    +
    +public class PayloadData implements Serializable {
    +    private int oID;
    +    private String threadName;
    +    private double doubleData;
    +
    +    PayloadData(int id, String name, double data) {
    +        oID = id;
    +        threadName = name;
    +        doubleData = data;
    +    }
    +
    +    public double getDoubleData() { return doubleData; }
    +    public int getID() { return oID; }
    +    public String getThreadName() { return threadName; }
    +} 
    +
    +
    +
    +
    +
    +

    DBWriter.java

    +
    +
    +
    +

    + DBWriter.java provides the implementation + for our database writer thread. It is responsible for: +

    +
    +
      +
    • +

      + All transaction management. +

      +
    • +
    • +

      + Responding to deadlock exceptions. +

      +
    • +
    • +

      + Providing data to be stored into the database. +

      +
    • +
    • +

      + Serializing and then writing the data to the database. +

      +
    • +
    +
    +

    + In order to show off some of the ACID properties provided + by JE's transactional support, + DBWriter.java does some things in a less + efficient way than you would probably decide to use in a + true production application. First, it groups 10 database + writes together in a single transaction when you could just + as easily perform one write for each transaction. If you + did this, you could use auto commit for the individual + database writes, which means your code would be slightly + simpler and you would run a much + smaller chance of encountering blocked and deadlocked + operations. However, by doing things this way, we are able + to show transactional atomicity, as well as deadlock + handling. +

    +

    + At the end of each transaction, + DBWriter.java runs a cursor over the + entire database by way of counting the number of records + currently existing in the database. There are better ways + to discover this information, but in this case we want to + make some points regarding cursors, transactional + applications, and deadlocking (we get into this in more + detail later in this section). +

    +

    + To begin, we provide the usual package and import statements, and we declare our class: +

    +
    package je.txn;
    +
    +import com.sleepycat.bind.EntryBinding;
    +import com.sleepycat.bind.serial.StoredClassCatalog;
    +import com.sleepycat.bind.serial.SerialBinding;
    +import com.sleepycat.bind.tuple.StringBinding;
    +
    +import com.sleepycat.je.Cursor;
    +import com.sleepycat.je.CursorConfig;
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.LockMode;
    +import com.sleepycat.je.LockConflictException;
    +import com.sleepycat.je.OperationStatus;
    +import com.sleepycat.je.Transaction;
    +
    +import java.io.UnsupportedEncodingException;
    +import java.util.Random;
    +
    +public class DBWriter extends Thread
    +{ 
    +

    + Next we declare our private data members. Notice that we get handles + for the environment and the database. We also obtain a handle for an + EntryBinding. We will use this to serialize + PayloadData class instances (see PayloadData.java) for storage in + the database. The random number generator that we instantiate is used + to generate unique data for storage in the database. The + MAX_RETRY variable is used to define how many times + we will retry a transaction in the face of a deadlock. And, finally, + keys is a String array that + holds the keys used for our database entries. +

    +
        private Database myDb = null;
    +    private Environment myEnv = null;
    +    private EntryBinding dataBinding = null;
    +    private Random generator = new Random();
    +
    +
    +    private static final int MAX_RETRY = 20;
    +
    +    private static String[] keys = {"key 1", "key 2", "key 3",
    +                                    "key 4", "key 5", "key 6",
    +                                    "key 7", "key 8", "key 9",
    +                                    "key 10"}; 
    +

    + Next we implement our class constructor. The most interesting thing + we do here is instantiate a serial binding for serializing + PayloadData instances. +

    +
        // Constructor. Get our DB handles from here
    +    DBWriter(Environment env, Database db, StoredClassCatalog scc)
    +        throws DatabaseException {
    +        myDb = db;
    +        myEnv = env;
    +        dataBinding = new SerialBinding(scc, PayloadData.class);
    +    } 
    +

    + Now we implement our thread's run() method. + This is the method that is run when DBWriter + threads are started in the main program (see TxnGuide.java). +

    +
        // Thread method that writes a series of records
    +    // to the database using transaction protection.
    +    // Deadlock handling is demonstrated here.
    +    public void run () { 
    +

    + The first thing we do is get a null transaction + handle before going into our main loop. We also begin the top transaction loop here that causes our application to + perform 50 transactions. +

    +
            Transaction txn = null;
    +
    +        // Perform 50 transactions
    +        for (int i=0; i<50; i++) { 
    +

    + Next we declare a retry variable. This is used to + determine whether a deadlock should result in our retrying the + operation. We also declare a retry_count variable + that is used to make sure we do not retry a transaction forever in the + unlikely event that the thread is unable to ever get a necessary lock. + (The only thing that might cause this is if some other thread dies + while holding an important lock. This is the only code that we have to + guard against that because the simplicity of this application makes it + highly unlikely that it will ever occur.) +

    +
               boolean retry = true;
    +           int retry_count = 0;
    +           // while loop is used for deadlock retries
    +           while (retry) { 
    +

    + Now we go into the try block that we use for + deadlock detection. We also begin our transaction here. +

    +
                    // try block used for deadlock detection and
    +                // general db exception handling
    +                try {
    +
    +                    // Get a transaction
    +                    txn = myEnv.beginTransaction(null, null); 
    +

    + Now we write 10 records under the transaction that we have just begun. + By combining multiple writes together under a single transaction, + we increase the likelihood that a deadlock will occur. Normally, + you want to reduce the potential for a deadlock and in this case + the way to do that is to perform a single write per transaction. In + other words, we should be using auto commit to + write to our database for this workload. +

    +

    + However, we want to show deadlock handling and by performing + multiple writes per transaction we can actually observe deadlocks + occurring. We also want to underscore the idea that you can + combing multiple database operations together in a single atomic + unit of work. So for our example, we do the (slightly) wrong thing. +

    +

    + Further, notice that we store our key into a + DatabaseEntry using + com.sleepycat.bind.tuple.StringBinding to + perform the serialization. Also, when we instantiate the + PayloadData object, we call + getName() which gives us the string + representation of this thread's name, as well as + Random.nextDouble() which gives us a random + double value. This latter value is used so as to avoid duplicate + records in the database. +

    +
    +                    // Write 10 records to the db
    +                    // for each transaction
    +                    for (int j = 0; j < 10; j++) {
    +                        // Get the key
    +                        DatabaseEntry key = new DatabaseEntry();
    +                        StringBinding.stringToEntry(keys[j], key);
    +
    +                        // Get the data
    +                        PayloadData pd = new PayloadData(i+j, getName(),
    +                            generator.nextDouble());
    +                        DatabaseEntry data = new DatabaseEntry();
    +                        dataBinding.objectToEntry(pd, data);
    +
    +                        // Do the put
    +                        myDb.put(txn, key, data);
    +                    } 
    +

    + Having completed the inner database write loop, we could simply + commit the transaction and continue on to the next block of 10 + writes. However, we want to first illustrate a few points about + transactional processing so instead we call our + countRecords() method before calling the transaction + commit. countRecords() uses a cursor to read every + record in the database and return a count of the number of records + that it found. +

    +

    + Because + countRecords() + reads every record in the database, if used incorrectly the thread + will self-deadlock. The writer thread has just written 500 records + to the database, but because the transaction used for that write + has not yet been committed, each of those 500 records are still + locked by the thread's transaction. If we then simply run a + non-transactional cursor over the database from within the same + thread that has locked those 500 records, the cursor will + block when it tries to read one of those transactional + protected records. The thread immediately stops operation at that + point while the cursor waits for the read lock it has + requested. Because that read lock will never be released (the thread + can never make any forward progress), this represents a + self-deadlock for the thread. +

    +

    + There are three ways to prevent this self-deadlock: +

    +
    +
      +
    1. +

      + We can move the call to + countRecords() to a point after the + thread's transaction has committed. +

      +
    2. +
    3. +

      + We can allow countRecords() to + operate under the same transaction as all of the writes + were performed. +

      +
    4. +
    5. +

      + We can reduce our isolation guarantee for the application + by allowing uncommitted reads. +

      +
    6. +
    +
    +

    + For this example, we choose to use option 3 (uncommitted reads) to avoid + the deadlock. This means that we have to open our cursor handle + so that it knows to perform uncommitted reads. +

    +
                        // commit
    +                    System.out.println(getName() + " : committing txn : " 
    +                        + i);
    +
    +                    // Using uncommitted reads to avoid the deadlock, so
    +                    // null is passed for the transaction here.
    +                    System.out.println(getName() + " : Found " +
    +                        countRecords(null) + " records in the database.");
    +

    + Having performed this somewhat inelegant counting of the records in the + database, we can now commit the transaction. +

    +
                        try {
    +                        txn.commit();
    +                        txn = null;
    +                    } catch (DatabaseException e) {
    +                        System.err.println("Error on txn commit: " +
    +                            e.toString());
    +                    }
    +                    retry = false; 
    +

    + If all goes well with the commit, we are done and we can move on to the + next batch of 10 records to add to the database. However, in the event + of an error, we must handle our exceptions correctly. The first of + these is a deadlock exception. In the event of a deadlock, we want to + abort and retry the transaction, provided that we have not already + exceeded our retry limit for this transaction. +

    +
                    } catch (LockConflictException le) {
    +                    System.out.println("################# " + getName() +
    +                        " : caught deadlock");
    +                    // retry if necessary
    +                    if (retry_count < MAX_RETRY) {
    +                        System.err.println(getName() +
    +                            " : Retrying operation.");
    +                        retry = true;
    +                        retry_count++;
    +                    } else {
    +                        System.err.println(getName() +
    +                            " : out of retries. Giving up.");
    +                        retry = false;
    +                    } 
    +

    + In the event of a standard, non-specific database exception, we simply + log the exception and then give up (the transaction is not retried). +

    +
                    } catch (DatabaseException e) {
    +                    // abort and don't retry
    +                    retry = false;
    +                    System.err.println(getName() +
    +                        " : caught exception: " + e.toString());
    +                    e.printStackTrace();  
    +

    + And, finally, we always abort the transaction if the transaction handle + is not null. Note that immediately after committing our transaction, we + set the transaction handle to null to guard against aborting a + transaction that has already been committed. +

    +
                    } finally {
    +                    if (txn != null) {
    +                        try {
    +                            txn.abort();
    +                        } catch (Exception e) {
    +                            System.err.println("Error aborting txn: " +
    +                                e.toString());
    +                            e.printStackTrace();
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    } 
    +

    + The final piece of our DBWriter class is the + countRecords() implementation. Notice how in + this example we open the cursor such that it performs uncommitted + reads: +

    +
        // A method that counts every record in the database.
    +
    +    // Note that this method exists only for illustrative purposes.
    +    // A more straight-forward way to count the number of records in
    +    // a database is to use the Database.getStats() method.
    +    private int countRecords(Transaction txn)  throws DatabaseException {
    +        DatabaseEntry key = new DatabaseEntry();
    +        DatabaseEntry data = new DatabaseEntry();
    +        int count = 0;
    +        Cursor cursor = null;
    +
    +        try {
    +            // Get the cursor
    +            CursorConfig cc = new CursorConfig();
    +            cc.setReadUncommitted(true);
    +            cursor = myDb.openCursor(txn, cc);
    +            while (cursor.getNext(key, data, LockMode.DEFAULT) ==
    +                    OperationStatus.SUCCESS) {
    +
    +                    count++;
    +            }
    +        } finally {
    +            if (cursor != null) {
    +                cursor.close();
    +            }
    +        }
    +
    +        return count;
    +
    +    }
    +} 
    +
    +

    + This completes our transactional example. If you would like to + experiment with this code, you can find the example in the following + location in your JE distribution: +

    +
    JE_HOME/examples/je/txn
    +
    + + + diff --git a/docs/TransactionGettingStarted/txnindices.html b/docs/TransactionGettingStarted/txnindices.html new file mode 100644 index 0000000..cf04481 --- /dev/null +++ b/docs/TransactionGettingStarted/txnindices.html @@ -0,0 +1,161 @@ + + + + + + Secondary Indices with Transaction Applications + + + + + + + + + +
    +
    +
    +
    +

    Secondary Indices with Transaction Applications

    +
    +
    +
    +

    + You can use transactions with your secondary indices so long as you + + + + + open the secondary index so that it is transactional. + + + +

    +

    + All other aspects of using secondary indices with transactions are + identical to using secondary indices without transactions. In + addition, transaction-protecting + + + secondary cursors is performed just as you protect normal + cursors — you simply have to make sure the cursor is + opened using a transaction handle, and that the cursor is + closed before the handle is either either committed or + aborted. + + See Transactional Cursors for details. +

    +

    + Note that when you use transactions to protect your database writes, your secondary indices are protected from + corruption because updates to the primary and the secondaries are performed in a single atomic transaction. +

    +
    +

    Note

    +

    + If you are using the DPL, then be aware that + you never have to provide a transactional + handle when opening an index, be it a primary + or a secondary. However, if transactions are + enabled for your store, then all of the indexes + that you open will be enabled for transactional + usage. Moreover, any write operation performed + using that index will be done using a + transaction, regardless of whether you + explicitly provide a transactional handle to the + write operation. +

    +

    + If you do not explicitly provide a transaction + handle to DPL write operations performed on a + transactional store, then auto commit is + silently used for that operation. +

    +
    +

    + For example: +

    +
    package je.txn;
    +
    +import com.sleepycat.bind.tuple.TupleBinding;
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseType;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.SecondaryDatabase;
    +import com.sleepycat.je.SecondaryConfig;
    +
    +import java.io.FileNotFoundException;
    +
    +...
    +
    +// Environment and primary database opens omitted.
    +
    +SecondaryConfig mySecConfig = new SecondaryConfig();
    +mySecConfig.setAllowCreate(true);
    +mySecConfig.setTransactional(true);
    +
    +SecondaryDatabase mySecDb = null;
    +try {
    +    // A fake tuple binding that is not actually implemented anywhere.
    +    // The tuple binding is dependent on the data in use.
    +    // See the Getting Started Guide for details
    +    TupleBinding myTupleBinding = new MyTupleBinding();
    +
    +    // Open the secondary. FullNameKeyCreator is not actually implemented
    +    // anywhere. See the Getting Started Guide for details.
    +    FullNameKeyCreator keyCreator = 
    +        new FullNameKeyCreator(myTupleBinding);
    +
    +    // Set the key creator on the secondary config object.
    +    mySecConfig.setKeyCreator(keyCreator);
    +
    +    // Perform the actual open. Because this database is configured to be
    +    // transactional, the open is automatically wrapped in a transaction.
    +    //      - myEnv is the environment handle.
    +    //      - myDb is the primary database handle.
    +    String secDbName = "mySecondaryDatabase";
    +    mySecDb = myEnv.openSecondary(null, secDbName, null, myDb, 
    +                                  mySecConfig);
    +} catch (DatabaseException de) {
    +    // Exception handling goes here ...
    +} 
    +
    + + + diff --git a/docs/TransactionGettingStarted/usingtxns.html b/docs/TransactionGettingStarted/usingtxns.html new file mode 100644 index 0000000..ef3f47c --- /dev/null +++ b/docs/TransactionGettingStarted/usingtxns.html @@ -0,0 +1,390 @@ + + + + + + Chapter 3. Transaction Basics + + + + + + + + + +
    +
    +
    +
    +

    Chapter 3. Transaction Basics

    +
    +
    +
    + +

    + Once you have enabled transactions for your environment and your databases, + you can use them to protect your database operations. You do this by + acquiring a transaction handle and then using that handle for any + database operation that you want to participate in that transaction. +

    +

    + You obtain a transaction handle using the + + + Environment.beginTransaction() method. + + +

    +

    + Once you have completed all of the operations that you want to include + in the transaction, you must commit the transaction using the + + + Transaction.commit() method. + + + +

    +

    + If, for any reason, you want to abandon the transaction, you abort + it using + + + Transaction.abort(). + + + + +

    +

    + Any transaction handle that has been committed or aborted can no longer + be used by your application. +

    +

    + Finally, you must make sure that all transaction handles are either + committed or aborted before closing your databases and environment. +

    +
    +

    Note

    +

    + If you only want to transaction protect a single database write operation, you can use auto commit to + perform the transaction administration. When you use auto commit, you do not need an explicit transaction + handle. See Auto Commit for more information. +

    +
    +

    + For example, the following example opens a transactional-enabled environment and + store, obtains a transaction handle, and then performs a write + operation under its protection. In the event of any failure in the + write operation, the transaction is aborted and the store is left in a + state as if no operations had ever been attempted in the first place. + +

    +
    package persist.txn;
    +
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +
    +import com.sleepycat.persist.EntityStore;
    +import com.sleepycat.persist.StoreConfig;
    +
    +import java.io.File;
    +
    +...
    +
    +Environment myEnv = null;
    +EntityStore store = null;
    +
    +// Our convenience data accessor class, used for easy access to 
    +// EntityClass indexes.
    +DataAccessor da;
    +
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    StoreConfig storeConfig = new StoreConfig();
    +    storeConfig.setTransactional(true);
    +
    +    EntityStore store = new EntityStore(myEnv, 
    +                             "EntityStore", storeConfig);
    +
    +    da = new DataAccessor(store);
    +
    +    // Assume that Inventory is an entity class.
    +    Inventory theInventory = new Inventory();
    +    theInventory.setItemName("Waffles");
    +    theInventory.setItemSku("waf23rbni");
    +
    +    Transaction txn = myEnv.beginTransaction(null, null);
    +
    +    try {
    +        // Put the object to the store using the transaction handle.
    +        da.inventoryBySku.put(txn, theInventory);
    +
    +        // Commit the transaction. The data is now safely written to the
    +        // store.
    +        txn.commit();
    +    // If there is a problem, abort the transaction
    +    } catch (Exception e) {
    +        if (txn != null) {
    +            txn.abort();
    +            txn = null;
    +        }
    +    }
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +} 
    +

    + The same thing can be done with the base API; the + database in use is left unchanged if the write operation fails: +

    +
    package je.txn;
    +
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseEntry;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import com.sleepycat.je.Transaction;
    +
    +import java.io.File;
    +
    +...
    +
    +Database myDatabase = null;
    +Environment myEnv = null;
    +try {
    +    EnvironmentConfig myEnvConfig = new EnvironmentConfig();
    +    myEnvConfig.setTransactional(true);
    +    myEnv = new Environment(new File("/my/env/home"),
    +                              myEnvConfig);
    +
    +    // Open the database. Create it if it does not already exist.
    +    DatabaseConfig dbConfig = new DatabaseConfig();
    +    dbConfig.setTransactional(true);
    +    myDatabase = myEnv.openDatabase(null,
    +                                    "sampleDatabase",
    +                                    dbConfig);
    +
    +    String keyString = "thekey";
    +    String dataString = "thedata";
    +    DatabaseEntry key = 
    +        new DatabaseEntry(keyString.getBytes("UTF-8"));
    +    DatabaseEntry data = 
    +        new DatabaseEntry(dataString.getBytes("UTF-8"));
    +
    +    Transaction txn = myEnv.beginTransaction(null, null);
    +        
    +    try {
    +        myDatabase.put(txn, key, data);
    +        txn.commit();
    +    } catch (Exception e) {
    +        if (txn != null) {
    +            txn.abort();
    +            txn = null;
    +        }
    +    }
    +
    +} catch (DatabaseException de) {
    +    // Exception handling goes here
    +} 
    +
    +
    +
    +
    +

    Committing a Transaction

    +
    +
    +
    +

    + In order to fully understand what is happening when you commit + a transaction, you must first understand a little about what + JE is doing with + + + + + its log files. + + + Logging causes all database or + store write operations to be identified in + + + + + log files (remember that in JE, your log files are + your database files; there is no difference between the two). + Enough information is written to restore your entire BTree + + + in the event of a system or application failure, so by performing + logging, JE ensures the integrity of your data. +

    +

    + Remember that all write activity made to your database or + store is + identified in JE's logs as the writes are performed by your + application. However, JE maintains logs in memory. + Eventually this information is written to disk, but especially + in the case of a transactional application this data may be + held in memory until the transaction is committed, or + JE runs out of buffer space for the logging information. +

    +

    + When you commit a transaction, the following occurs: +

    +
    +
      +
    • +

      + A commit record is written to the log. This + indicates that the modifications made by the + transaction are now permanent. By default, this write is performed synchronously to disk so the + commit record arrives in the log files before any other actions are taken. +

      +
    • +
    • +

      + Any log information held in memory is (by default) + synchronously written to disk. Note that this requirement can be + relaxed, depending on the type of commit you perform. + See Non-Durable Transactions for + more information. + +

      +

      + Note that a transaction commit only writes the BTree's leaf nodes to JE's log files. All other + internal BTree structures are left unwritten. +

      +
    • +
    • +

      + All locks held by the transaction are released. This means + that read operations performed by other transactions or + threads of control can now see the modifications without + resorting to uncommitted reads (see Reading Uncommitted Data for more information). +

      +
    • +
    +
    +

    + To commit a transaction, you simply call + + + Transaction.commit(). + + +

    +

    + Remember that transaction commit causes only the BTree leaf nodes to be written to JE's log files. Any + other modifications made to the the BTree as a result of the transaction's activities are not written to the + log file. This means that over time JE's normal recovery time can greatly increase (remember that JE always runs + normal recovery when it opens an environment). +

    +

    + For this reason, JE by default runs the checkpointer thread. This background thread runs + a checkpoint on a periodic interval so as to ensure that the amount of data that needs to be + recovered upon environment open is minimized. In addition, you can also run a checkpoint manually. + For more information, see Checkpoints. +

    +

    + Note that once you have committed a transaction, the transaction + handle that you used for the transaction is no longer valid. To + perform database activities under the control of a new + transaction, you must obtain a fresh transaction handle. +

    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/wrapup.html b/docs/TransactionGettingStarted/wrapup.html new file mode 100644 index 0000000..d12fcef --- /dev/null +++ b/docs/TransactionGettingStarted/wrapup.html @@ -0,0 +1,254 @@ + + + + + + Chapter 6. Summary and Examples + + + + + + + + + +
    +
    +
    +
    +

    Chapter 6. Summary and Examples

    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Anatomy of a Transactional Application + +
    +
    + + Base API Transaction Example + +
    +
    +
    +
    + + TxnGuide.java + +
    +
    + + PayloadData.java + +
    +
    + + DBWriter.java + +
    +
    +
    +
    + + DPL Transaction Example + +
    +
    +
    +
    + + TxnGuide.java + +
    +
    + + PayloadDataEntity.java + +
    +
    + + StoreWriter.java + +
    +
    +
    +
    +
    +

    + Throughout this manual we have presented the concepts and + mechanisms that you need to provide transactional protection for + your application. In this chapter, we summarize these + mechanisms, and we provide a complete example of a multi-threaded + transactional JE application. +

    +
    +
    +
    +
    +

    Anatomy of a Transactional Application

    +
    +
    +
    +

    + Transactional applications are characterized by performing the + following activities: +

    +
    +
      +
    1. +

      + Create your environment handle. +

      +
    2. +
    3. +

      + Open your environment, specifying that the transactional subsystem is to be used. +

      +
    4. +
    5. +

      + If you are using the base API, open your database handles, indicating that they are to support transactions. + Otherwise, open your store such that it is configured for transactions. +

      +
    6. +
    7. +

      + Spawn off worker threads. How many of these you need and + how they split their JE workload is entirely up to your + application's requirements. However, any worker threads + that perform write operations will do the following: +

      +
      +
        +
      1. +

        + Begin a transaction. +

        +
      2. +
      3. +

        + Perform one or more read and write + operations. +

        +
      4. +
      5. +

        + Commit the transaction if all goes well. +

        +
      6. +
      7. +

        + Abort and retry the operation if a deadlock is + detected. +

        +
      8. +
      9. +

        + Abort the transaction for most other errors. +

        +
      10. +
      +
      +
    8. +
    9. +

      + On application shutdown: +

      +
      +
        +
      1. +

        + Make sure there are no opened cursors. +

        +
      2. +
      3. +

        + Make sure there are no active transactions. Either + abort or commit all transactions before shutting + down. +

        +
      4. +
      5. +

        + Close your databases. +

        +
      6. +
      7. +

        + Close your environment. +

        +
      8. +
      +
      +
    10. +
    +
    +
    +

    Note

    +

    + Robust JE applications should monitor their worker threads to + make sure they have not died unexpectedly. If a thread does + terminate abnormally, you must shutdown all your worker threads + and then run normal recovery (you will have to reopen your + environment to do this). This is the only way to clear any + resources (such as a lock or a mutex) that the abnormally + exiting worker thread might have been holding at the time that + it died. +

    +

    + Failure to perform this recovery can cause your + still-functioning worker threads to eventually block forever + while waiting for a lock that will never be released. +

    +
    +

    + In addition to these activities, which are entirely handled by code + within your application, you also need to periodically back up your + log files. This is required in order to obtain the durability + guarantee made by JE's transaction ACID support. See + Backing up and Restoring Berkeley DB, Java Edition Applications + for more information. +

    +
    +
    + + + diff --git a/docs/TransactionGettingStarted/writeblock.jpg b/docs/TransactionGettingStarted/writeblock.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b382b82fe1909eb79e9bc588335c5048ed82b81 GIT binary patch literal 6369 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 literal 0 HcmV?d00001 diff --git a/docs/changelog.html b/docs/changelog.html new file mode 100644 index 0000000..11d71b1 --- /dev/null +++ b/docs/changelog.html @@ -0,0 +1,3587 @@ + + + + + + The Berkeley DB Java Edition Package: BDB JE Library Version + 12.2.7.5 (Release 7.5.11) Change Log + + + + + +

    Oracle Berkeley DB Java Edition 12c R2 Change Log

    +

    Release 7.5.11

    + + + +

    Upgrading from JE 7.4 or earlier

    + +In JE 7.5 the on-disk file format moved to 15. The file format change is +forward compatible in that JE files created with earlier releases can be read +when opened with JE 7.5 or later. The change is not backward compatible in that +files created with JE 7.5 or later cannot be read by earlier releases. After +an existing environment is opened read/write using JE 7.5, the environment can +no longer be read by earlier releases. + +

    Upgrading from JE 7.3 or earlier

    + +No file format changes were included in JE 7.4 and there are no file format +compatibility issues when upgrading from JE 7.3. + +

    Upgrading from JE 7.2 or earlier

    + +In JE 7.3 the on-disk file format moved to 14. The file format change is +forward compatible in that JE files created with earlier releases can be read +when opened with JE 7.3 or later. The change is not backward compatible in that +files created with JE 7.3 or later cannot be read by earlier releases. After +an existing environment is opened read/write using JE 7.3, the environment can +no longer be read by earlier releases. + +

    Upgrading from JE 7.1 or earlier

    + +No file format changes were included in JE 7.2 and there are no file format +compatibility issues when upgrading from JE 7.1. + +

    Upgrading from JE 7.0 or earlier

    + +In JE 7.1 the on-disk file format moved to 13. The file format change is +forward compatible in that JE files created with earlier releases can be read +when opened with JE 7.1 or later. The change is not backward compatible in that +files created with JE 7.1 or later cannot be read by earlier releases. After +an existing environment is opened read/write using JE 7.1, the environment can +no longer be read by earlier releases. +

    +In JE 7.1 the HA wire format also changed in order to support the durable +transaction commits feature (see [#25057]). Until all nodes in a replication +group have been upgraded to JE 7.1, this optimization is not fully applied. + +

    Upgrading from JE 6.4 or earlier

    + +In JE 7.0 the on-disk file format moved to 12. The file format change is +forward compatible in that JE files created with earlier releases can be read +when opened with JE 7.0 or later. The change is not backward compatible in that +files created with JE 7.0 or later cannot be read by earlier releases. After +an existing environment is opened read/write using JE 7.0, the environment can +no longer be read by earlier releases. +

    +In JE 7.0 the HA wire format also changed in order to support the TTL feature. +Until all nodes in a replication group have been upgraded to JE 7.0, the TTL +feature cannot be used. An exception will be thrown if a write with a non-zero +TTL is attempted, and not all nodes have been upgraded. See further below for +a description of the TTL feature. + +

    Upgrading from JE 6.3 or earlier

    + +No file format changes were included in JE 6.4 and there are no file format +compatibility issues when upgrading from JE 6.3. +

    +A behavior change was made to DiskOrderedCursor that may require some +applications to increase the JE cache size. To prevent applications from +having to reserve memory in the Java heap for the DiskOrderedCursor, memory +used by the DiskOrderedCursor is now subtracted from the JE cache budget. The +maximum amount of such memory is specified, as before, using +DiskOrderedCursorConfig.setInternalMemoryLimit. [#24291] + +

    Upgrading from JE 6.2 or earlier

    + +In JE 6.3 the on-disk file format moved to 11. The file format change is +forward compatible in that JE files created with earlier releases can be read +when opened with JE 6.3 or later. The change is not backward compatible in that +files created with JE 6.3 or later cannot be read by earlier releases. After +an existing environment is opened read/write using JE 6.3, the environment can +no longer be read by earlier releases. + +

    Upgrading from JE 6.1 or earlier

    + +In JE 6.2 the on-disk file format moved to 10. The file format change is +forward compatible but not backward compatible, as usual. + +

    Upgrading from JE 6.0 or earlier

    + +There was no file format change in JE 6.1. + +An API change in JE 6.1.3 [#23330] requires application changes if write +operations are performed on a non-replicated database in a replicated +environment. A code change is necessary for applications with the following +characteristics: +

    +

      +
    • A ReplicatedEnvironment is used. +
    • A non-replicated, transactional Database is accessed + (DatabaseConfig.setReplicated(false) and setTransactional(true) are called) + in this environment. +
    • When writing to this database, an explicit (non-null) Transaction is + specified. +
    +

    +In order to perform write operations in such cases, the application must now +call TransactionConfig.setLocalWrite(true) and use this configuration to create +a Transaction for performing writes to the non-replicated database. +

    +In addition, it is no longer possible to use a single transaction to write to +both replicated and a non-replicated databases. IllegalOperationException will +be thrown if this is attempted. +

    +These changes were necessary to prevent corruption when a transaction contains +write operations for both replicated and non-replicated databases, and a +failover occurs that causes a rollback of this transaction. The probability of +corruption is low, but it can occur under the right conditions. +

    +For more information see the javadoc for TransactionConfig.setLocalWrite(true), +and the "Non-replicated Databases in a Replicated Environment" section of the +ReplicatedEnvironment class javadoc. + +

    Upgrading from JE 5.0 or earlier

    + +In addition to the file format changes, a change was made involving partial +Btree and duplicate comparators. Partial comparators are an advanced feature +that few applications use. As of JE 6.0, using partial comparators is not +recommended. Applications that do use partial comparators must change their +comparator classes to implement the new PartialComparator tag interface, before +running the application with JE 6. Failure to do so may cause incorrect +behavior during transaction aborts. See the PartialComparator javadoc for more +information. + +

    Upgrading from JE 4.1 or earlier

    + +There are two important notes about the file format change in JE 5.0. +
      +
    1. + The file format change enabled significant improvements in operation + performance, memory and disk footprint, and concurrency of databases with + duplicate keys. Due to these changes, an upgrade utility must be run before + opening an environment with this release, if the environment was created + using JE 4.1 or earlier. See the Upgrade Procedure below for more + information. +
    2. +
    3. + An application which uses JE replication may not upgrade directly from JE + 4.0 to JE 5.0 or later. Instead, the upgrade must be done from JE 4.0 to + JE 4.1 and then to JE 5.0 or later. Applications already at JE 4.1 are not + affected. Upgrade guidance can be found in the new chapter, "Upgrading a + JE Replication Group", in the "Getting Started with BDB JE High + Availability" guide. +
    4. +
    + +Due to the format changes in JE 5, a special utility program must be run for an +environment created with JE 4.1 or earlier, prior to opening the environment +with JE 5.0 or later. The utility program is part of JE 4.1. JE 4.1.20, or a +later version of JE 4.1, must be used. +

    +One of two utility programs must be used, which are available in the release +package for JE 4.1.20, or a later release of JE 4.1. If you are currently +running a release earlier than JE 4.1.20, then you must download the latest JE +4.1 release package in order to run these utilities. +

    +The steps for upgrading are as follows. +

      +
    1. Stop the application using BDB JE.
    2. +
    3. Run the DbPreUpgrade_4_1 or DbRepPreUpgrade_4_1 utility. + If you are using a regular non-replicated Environment: +
          java -jar je-4.1.20.jar DbPreUpgrade_4_1 -h <dir>
      + If you are using a JE ReplicatedEnvironment: +
          java -jar je-4.1.20.jar DbRepPreUpgrade_4_1
      +         -h <dir>
      +         -groupName <group name>
      +         -nodeName <node name>
      +         -nodeHostPort <host:port>
    4. +
    5. Finally, start the application using the current JE 5.0 (or later) + release of BDB JE.
    6. +
    +

    +The second step -- running the utility program -- does not perform data +conversion. This step simply performs a special checkpoint to prepare the +environment for upgrade. It should take no longer than an ordinary startup and +shutdown. +

    +During the last step -- when the application opens the JE environment using the +current release (JE 5 or later) -- all databases configured for duplicates will +automatically be converted before the Environment or +ReplicatedEnvironment constructor returns. Note that a database +might be explicitly configured for duplicates using +DatabaseConfig.setSortedDuplicates(true), or implicitly configured +for duplicates by using a DPL MANY_TO_XXX relationship +(Relationship.MANY_TO_ONE or +Relationship.MANY_TO_MANY). +

    +The duplicate database conversion only rewrites internal nodes in the Btree, +not leaf nodes. In a test with a 500 MB cache, conversion of a 10 million +record data set (8 byte key and data) took between 1.5 and 6.5 minutes, +depending on number of duplicates per key. The high end of this range is when +10 duplicates per key were used; the low end is with 1 million duplicates per +key. +

    +To make the duplicate database conversion predictable during deployment, users +should measure the conversion time on a non-production system before upgrading +a deployed system. When duplicates are converted, the Btree internal nodes are +preloaded into the JE cache. A new configuration option, +EnvironmentConfig.ENV_DUP_CONVERT_PRELOAD_ALL, can be set to false +to optimize this process if the cache is not large enough to hold the internal +nodes for all databases. For more information, see the javadoc for this +property. +

    +If an application has no databases configured for duplicates, then the last +step simply opens the JE environment normally, and no data conversion is +performed. +

    +If the user fails to run the DbPreUpgrade_4_1 or DbRepPreUpgrade_4_1 utility +program before opening an environment with JE 5 or later for the first time, an +exception such as the following will normally be thrown by the +Environment or ReplicatedEnvironment constructor: +

    +  com.sleepycat.je.EnvironmentFailureException: (JE 6.0.1) JE 4.1 duplicate DB
    +  entries were found in the recovery interval. Before upgrading to JE 5.0, the
    +  following utility must be run using JE 4.1 (4.1.20 or later):
    +  DbPreUpgrade_4_1.  See the change log.
    +  UNEXPECTED_STATE: Unexpected internal state, may have side effects.
    +    at com.sleepycat.je.EnvironmentFailureException.unexpectedState(EnvironmentFailureException.java:376)
    +    at com.sleepycat.je.recovery.RecoveryManager.checkLogVersion8UpgradeViolations(RecoveryManager.java:2694)
    +    at com.sleepycat.je.recovery.RecoveryManager.buildTree(RecoveryManager.java:549)
    +    at com.sleepycat.je.recovery.RecoveryManager.recover(RecoveryManager.java:198)
    +    at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:610)
    +    ...  
    +

    +If the user fails to run the DbPreUpgrade_4_1 or DbRepPreUpgrade_4_1 utility +program, but no exception is thrown when the environment is opened with JE 5 +or later, this is probably because the application performed an +Environment.sync before last closing the environment with JE 4.1 +or earlier, and nothing else happened to be written (by the application or JE +background threads) after the sync operation. In this case, running the +upgrade utility is not necessary. + + +


    +

    Changes in 7.5.11

    + +
      + + + +
    1. +Removed the following incorrect javadoc for cursor read operations: +

      In a replicated environment, an explicit +transaction must have been specified when opening the cursor, unless +read-uncommitted isolation is specified via the CursorConfig or LockMode +parameter.

      +

      When a null Transaction parameter is specified for a read operation in a +replicated environment, the default consistency +(ReplicationConfig.CONSISTENCY_POLICY) is used.

      +[#26037] (7.5.0) +

    2. + +
    3. +The data verifier has been enhanced to perform Btree verification. Btree +verification is performed by the background data verifier, the DbVerify +utility, the DbVerify.verify method, the Database.verify method and the +Environment.verify method. +

      +Previously, the DbVerify utility and the DbVerify/Database/Environment.verify +methods performed a very rudimentary and inefficient form of verification. +Btree verification now includes several different types of integrity checks +and is performed more efficiently than before. +

      +Background verification (see EnvironmentConfig.ENV_RUN_VERIFIER and +VERIFY_SCHEDULE) now includes basic Btree verification and secondary index +verification by default. There are two other types of verification can be +enabled as described below. Previously, background verification only included +log checksum verification (see EnvironmentConfig.VERIFY_LOG). +

      +The javadoc for these parameters contains a complete description of the types +of verification. Other changes to be aware of are: +

        +
      • Only one instance of log corruption or basic Btree corruption now will + be detected by data verification. Previously, the verifier would + attempt to skip over such a detected corruption and continue, although + this approach was unreliable. Now the Environment is always invalidated + when such corruption is detected, and it isn't possible to continue. +
      • When index corruption is detected, the environment is not invalidated. + Instead, the corrupt index (secondary database) is marked as corrupt + in memory. All subsequent access to a corrupt index will now throw + SecondaryIntegrityException. To correct the problem, the application + may perform a full restore or rebuild the corrupt index. This new + behavior applies whether the index corruption was detected during + Btree verification or during normal access to the index. +
      • When basic Btree verification or log checksum verification fails, the + Environment is invalidated (must be closed) and an + EnvironmentFailureException is thrown. If the corruption is known to be + persistent, the EnvironmentFailureException.isCorrupt method will + return true. Additionally, when a persistent corruption is detected and + the Environment is open for read-write access, a marker file named + 7fffffff.jdb is created in the Environment directory that will prevent + re-opening the environment. If an attempt is made to re-open the + Environment, the original EnvironmentFailureException will be thrown. + This is meant to safeguard against using a corrupt environment when the + original exception is accidentally overlooked. While the marker file + can be deleted to allow re-opening the environment, this is normally + unsafe and is not recommended.
      • +
      • The different types of verification can be enabled or disabled in the + background data verifier using EnvironmentConfig.VERIFY_BTREE, + VERIFY_SECONDARIES and VERIFY_DATA_RECORDS. Additional params control + the Btree verification batch size and delay between batches: + VERIFY_BTREE_BATCH_SIZE and VERIFY_BTREE_BATCH_DELAY.
      • +
      • When using the DbVerify/Database/Environment.verify methods, the + different types of verification can be enabled or disabled using + new methods in the VerifyConfig class: setVerifySecondaries and + setVerifyDataRecords. New methods also control the verification batch + size and delay between batches: setBatchSize and setBatchDelay.
      • +
      • When using the DbVerify command line, data record verification can be + enabled using -vdr, and batch size/delay can be specified + using -bs and -d. Note that secondary + integrity verification is not possible using the command line because + this feature requires the secondary databases to have been opened by + the application.
      • +
      • The Database.verify and Environment.verify methods now throw an + EnvironmentFailureException (as described above) if verification fails. + Previously, these methods did not give any indication of failure. This + is a change in behavior.
      • +
      • Updated existing javadoc in several cases where the javadoc was + incorrect. Existing behavior was not changed in these cases. +
          +
        • Updated Environment.verify javadoc to indicate that the 'out' + parameter is unused and VerifyConfig.setShowProgressStream + should be used instead.
        • +
        • Updated VerifyConfig.getPrintInfo javadoc to indicate that the + information in printed to System.err by default (not + System.out) and the default is to use the stream specified by + VerifyConfig.getShowProgressStream.
        • +
        • Updated the javadoc for VerifyConfig.setPropagateExceptions and + VerifyConfig.setAggressive to note that these settings + currently have no effect.
        • +
        +
      • +
      • Log verification (checksum validation) was previously supported. + However, performance testing determined that log verification had a + a negative impact on throughput and latency for some workloads. To + avoid this, a delay between reads has been added. This delay can be + configured using EnvironmentConfig.VERIFY_LOG_READ_DELAY, + VerifyLog.setReadDelay and the -d command line arg.
      • + +
      +[#25960] (7.5.1) +

    4. + +
    5. +Configuration parameters for limiting disk usage have been added: +Environment.MAX_DISK and FREE_DISK. MAX_DISK should be specified for JE HA +applications when upgrading to this release, since data files will be reserved +for potential replication to nodes that are out of contact. More reserved +files are retained for potential replication in this release, as described +further below. If MAX_DISK is not specified, all the free space on the volume +(minus 5GB of free space, with the default setting of FREE_DISK) will +eventually be used. The EnvironmentMutableConfig.setMaxDisk method is provided +as a convenience for setting MAX_DISK. +

      +Disk usage is now monitored and a new exception, DiskLimitException, is thrown +when attempting a write operation when the threshold is in danger of being +exceeded. In this situation, read operations are still allowed. Previously, the +Environment was invalidated and closed when the volume was filled. Allowing +read operations now provides partial availability in this situation. The +FREE_DISK parameter also now prevents filling the disk completely, which eases +manual recovery. +

      +Although behavior is now improved when available space has been used, the +application-level goal must be to prevent the situation entirely by monitoring +disk usage and taking recourse before the situation occurs. To support this, +new JE statistics have been added: +

        +
      • activeLogSize: EnvironmentStats.getActiveLogSize()
      • +
      • reservedLogSize: EnvironmentStats.getReservedLogSize()
      • +
      • protectedLogSize: EnvironmentStats.getProtectedLogSize()
      • +
      • protectedLogSizeMap: EnvironmentStats.getProtectedLogSizeMap()
      • +
      • availableLogSize: EnvironmentStats.getAvailableLogSize()
      • +
      +We strongly recommend using availableLogSize to monitor disk usage and take +corrective action well before this value reaches zero. Monitoring the file +system size of the JE data files is not a good substitute for this, since the +data files includes reserved files which will be deleted by JE automatically. +

      +Additional details are listed below. +

        +
      • + DiskLimitException may be thrown by all record write operations, + Environment.checkpoint, Environment.sync, and Environment.close + (when the final checkpoint cannot be performed). +
      • +
      • + The following HA config params are deprecated and no longer needed: + ReplicationConfig.REP_STREAM_TIMEOUT, REPLAY_COST_PERCENT and + REPLAY_FREE_DISK_PERCENT. Reserved files are now retained based on + available disk space. EnvironmentConfig.MAX_DISK and FREE_DISK should + be used instead. +

        + REPLAY_COST_PERCENT is no longer used. However, REP_STREAM_TIMEOUT is + still used when some, but not all, nodes in a group have been upgraded + to 7.5 or later. REPLAY_FREE_DISK_PERCENT is still used when it has + been specified and is non-zero, and FREE_DISK has not been specified. + In this case, REPLAY_FREE_DISK_PERCENT overrides the FREE_DISK default + value. If both REPLAY_FREE_DISK_PERCENT and FREE_DISK are specified, an + IllegalArgumentException is thrown. +

      • +
      • + EnvironmentStats.getFileDeletionBacklog has been deprecated and always + returns zero. Use EnvironmentStats.getProtectedLogSize() and + getProtectedLogSizeMap() to monitor protected files. +
      • +
      • + If EnvironmentConfig.CLEANER_BYTES_INTERVAL is zero or unspecified, it + is now set to the minimum of EnvironmentConfig.LOG_FILE_MAX divided by + four (this was the previous default) and 100 MB. The new 100 MB + maximum is to ensure that the cleaner is woken frequently enough, so + that reserved files are deleted quickly enough to avoid violating a + disk limit. Use caution when overriding the default value. +
      • +
      • + Previously, reserved files (files cleaned but not deleted) were not + persistently marked as being reserved. So when the Environment was + closed and re-opened, these files would be cleaned again. This + re-cleaning was fairly quick because they were 0% utilized, but was a + waste of resources nonetheless. Now, reserved files are marked as such + in the cleaner's persistent metadata and this avoids re-cleaning. +
      • +
      • + Previously, reserved files were included in the DbSpace output and + shown as 0% utilized. They were also reflected in the total + utilization, which was therefore inaccurate, since utilization applies + to activeLogSize. Now, reserved files are omitted from the list of + files and the total utilization. The amount of space used by reserved + files is printed at the end of the summary. If the {@code -q} option + is not specified, the reserved file numbers are also printed. +
      • +
      • + Database.count and DiskOrderedCursor (which both internally use a + disk-ordered scanner) now only protect active files from deletion. + Previously they unnecessarily also protected reserved files. +
      • +
      • + DbBackup now only protects active files from deletion. Previously it + unnecessarily also protected reserved files. In addition, the + DbBackup.removeFileProtection method has been added to allow removing + protection from a file that has been copied, before calling + DbBackup.endBackup. +
      • +
      • + NetworkRestore now only protects active files, and the two most recent + reserved files, from deletion. Previously it unnecessarily protected + all reserved files. In addition, the protection is removed for files + that have been transferred, prior to the completion of the entire + restore. +
      • +
      • + The totalLogSize and endOfLog stats (EnvironmentStats.getTotalLogSize + and getEndOfLog) are no longer "slow" stats. They are returned by + Environment.getStats regardless of the StatsConfig.getFast setting. +
      • +
      • + The je.stat.csv file now contains all stats, not just "fast" stats. + Previously, "slow" stats were omitted. Since the stat retrieval + frequency is one minute and this is done by a background thread, + there is no reason not to include all stats. +
      • +
      • + Fixed a bug where per-Database cleaner metadata could accumulate under + certain conditions. +
      • +
      +[#25220] (7.5.3) +

    6. + +
    7. +Fixed a compatibility problem with the Azul Zulu JVM. Previously the following +exception would occur when using JE with Zulu: +
      +The database environment could not be opened: java.lang.IllegalStateException:
      +Could not access Zing management bean. Make sure -XX:+UseZingMXBeans was
      +specified.
      +
      +[#26163] (7.5.3) +

    8. + +
    9. +Added ReplicationConfig.TXN_ROLLBACK_DISABLED to allow manual control over +rollback, including rollback of transactions considered to be non-durable. +See the javadoc for more information. +

      +[#26220] (7.5.7) +


    10. + +
    11. +Fixed a bug that could cause OutOfMemoryError when performing a network +restore (NetworkRestore.execute) after an InsufficientLogException (ILE) is +thrown. The ILE holds a reference to the internals (e.g., data cache) of the +old environment handle. Previously, this reference was not cleared by the +network restore. If the application then re-opened the environment, without +discarding all references to the ILE, OutOfMemoryError could occur due to the +presence of two data caches in the heap at the same time. Now the network +restore clears the internal references when the restore is complete. +

      +[#26305] (7.5.8) +


    12. + +
    13. +Fixed a bug that could prevent performing a network restore +(NetworkRestore.execute), after a prior network restore was aborted or +incomplete for any reason. For example, this could occur if the process is +killed during the first network restore, and then another network restore is +attempted. The problem could occur only in an environment with a relatively +large data set, specifically where at least one billion write transactions had +been performed. An example stack trace is below. +
      +java.lang.NumberFormatException: For input string: "7473413648"
      +    at java.lang.NumberFormatException.forInputString(
      +        NumberFormatException.java:65)
      +    at java.lang.Integer.parseInt(Integer.java:583)
      +    at java.lang.Integer.parseInt(Integer.java:615)
      +    at com.sleepycat.je.rep.InsufficientLogException.init(
      +        InsufficientLogException.java:218)
      +    at com.sleepycat.je.rep.impl.RepImpl.handleRestoreRequired(
      +        RepImpl.java:2296)
      +    at com.sleepycat.je.recovery.RecoveryManager.findEndOfLog(
      +        RecoveryManager.java:543)
      +    at com.sleepycat.je.recovery.RecoveryManager.recover(
      +        RecoveryManager.java:339)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(
      +        EnvironmentImpl.java:841)
      +    at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:222)
      +    at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:267)
      +    at com.sleepycat.je.Environment.init(Environment.java:252)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.init(
      +        ReplicatedEnvironment.java:607)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.init(
      +        ReplicatedEnvironment.java:466)
      +...
      +
      +This has been fixed. Without the fix, a workaround for the problem is to +remove all the .jdb files from the destination node, before performing the +network restore. +

      +[#26311] (7.5.8) +


    14. + +
    15. +Fixed an incorrect assertion when CLEANER_FORCE_CLEAN_FILES is specifid, and a +specified file is already being cleaned. An example stack traced is below: +
      +java.lang.AssertionError
      +at com.sleepycat.je.cleaner.FileSelector.selectFileForCleaning(FileSelector.java:193)
      +at com.sleepycat.je.cleaner.FileProcessor.doClean(FileProcessor.java:395)
      +at com.sleepycat.je.cleaner.Cleaner.doClean(Cleaner.java:670)
      +...
      +
      +[#26326] (7.5.9) +

    16. + +
    + + +
    +

    Changes in 7.4.5

    + +
      + +
    1. +Fixed an internal deadlock between the following internal classes: +ExpirationProfile, IN, FileSelector. This deadlock occurred very rarely (only +once in our testing). It did not cause a persistent problem -- restarting the +process was a safe workaround. +[#25613] (7.4.1) +

    2. + +
    3. +EnvironmentConfig.CLEANER_FORCE_CLEAN_FILES has been made mutable. +[#25821] (7.4.2) +

    4. + +
    5. +The OperationResult.isUpdate() method has been added for distinguishing inserts +and updates performed by a Put.OVERWRITE operation. +[#25882] (7.4.2) +

    6. + +
    7. +Fixed unsafe file deletion issue in network restore. If the network restore was +performed on a node without closing the environment, the deletion of obsolete +log files was considered an unsafe operation that caused the restore to fail. + +The error message was: +
      +  com.sleepycat.je.EnvironmentFailureException:../env Log file 00000000.jdb
      +  was deleted unexpectedly. LOG_UNEXPECTED_FILE_DELETION: A log file was
      +  unexpectedly deleted, log is likely invalid. Environment is invalid and must
      +  be closed. Originally thrown by HA thread: REPLICA 3(-1) 
      +
      +[#25834] (7.4.3) +

    8. + +
    9. +Logging of internal nodes (INs) has been reduced when deleting many records in +a contiguous key range. +[#25939] (7.4.3) +

    10. + +
    11. +Fixed a bug that could have caused duplicate records to be returned via the +iterator() method of the DPL and Collections API. The iterator reads records +in batches, and if a record at the end of the last batch was deleted by another +thread, fetching the next batch could have read (and later returned via the +iterator) duplicate records, depending on thread timing. +[#25976] (7.4.3) +

    12. + +
    13. +Fixed a bug that prevented LogOverwriteException from being thrown when +assertions were disabled. LogOverwriteException is thrown to prevent creation +of an invalid backup, although this can only happen in rare cases and only on +an HA replica node. See the LogOverwriteException javadoc for more information. +[#25989] (7.4.4) +

    14. + +
    15. +Fixed a bug that caused the following assertion to fire when using a Database +in deferred-write mode (DatabaseConfig.setDeferredWrite(true)) for which data +was previously written in normal (non-deferred-write) mode. +
      +java.lang.AssertionError
      +  com.sleepycat.je.tree.BIN.shouldLogDelta(BIN.java:1927)
      +  ...
      +
      +[#25999] (7.4.4) +

    16. + +
    + + +
    +

    Changes in 7.3.7

    + +
      + +
    1. +EnvironmentConfig.LOG_N_DATA_DIRECTORIES has been deprecated. This +feature is not known to provide benefits beyond that of a simple RAID +configuration and will be removed in the next release, which is slated +for mid-April, 2017. +

    2. + +
    3. +Added Arbiter functionality that adds additional write availability +for replication groups that have two Electable members. For details see the +javadoc for com.sleepycat.je.rep.arbiter.Arbiter. +[#25567] (7.3.0) +

    4. + +
    5. +Operation throughput statistics have been simplified and improved. Previously, +these statistics represented API calls rather than CRUD operations which caused +confusion when a single API call performed multiple CRUD operations, some CRUD +operations (key search operations on any node, and all operations on a replica +node) were missing, the operation statistics were not included in the +EnvironmentStats.toString result, and none of the operation statistics were +available via EnvironmentStats getter methods. Previously the throughput stats, +listed below, were only visible via the je.stat.csv file. +
      +    Name
      +    ----
      +    dbDelete
      +    dbGet
      +    dbGetSearchBoth
      +    dbPut
      +    dbPutNoDupData
      +    dbPutNoOverWrite
      +    cursorDelete
      +    cursorGetCurrent
      +    cursorGetFirst
      +    cursorGetLast
      +    cursorGetNext
      +    cursorGetNextDup
      +    cursorGetNextNoDup
      +    cursorGetPrev
      +    cursorGetPrevDup
      +    cursorGetPrevNoDup
      +    cursorPut
      +    cursorPutCurrent
      +    cursorPutNoDupData
      +    cursorPutNoOverwrite
      +    secondaryCursorDelete
      +    secondaryCursorGetCurrent
      +    secondaryCursorGetFirst
      +    secondaryCursorGetLast
      +    secondaryCursorGetNext
      +    secondaryCursorGetNextDup
      +    secondaryCursorGetNextNoDup
      +    secondaryCursorGetPrev
      +    secondaryCursorGetPrevDup
      +    secondaryCursorGetPrevNoDup
      +    secondaryDbDelete
      +    secondaryDbGet
      +    secondaryDbGetSearchBoth
      +
      +Now, the following statistics representing CRUD operations are output in the +je.stats.cvs file and the EnvironmentStats.toString method, are included for +all nodes including replicas, and are available via new EnvironmentStats getter +methods. These replace the statistics listed above. +
      +    Name                   EnvironmentStats method
      +    ----                   -----------------------
      +    priSearch              getPriSearchOps()
      +    priSearchFail          getPriSearchFailOps()
      +    secSearch              getSecSearchOps()
      +    secSearchFail          getSecSearchFailOps()
      +    priPosition            getPriPositionOps()
      +    secPosition            getSecPositionOps()
      +    priInsert              getPriInsertOps()
      +    priInsertFail          getPriInsertFailOps()
      +    secInsert              getSecInsertOps()
      +    priUpdate              getPriUpdateOps()
      +    secUpdate              getSecUpdateOps()
      +    priDelete              getPriDeleteOps()
      +    priDeleteFail          getPriDeleteFailOps()
      +    secDelete              getSecDeleteOps()
      +
      +The new statistics should be considered internal operations or units of work +rather than API calls. This approach is used to allow correlating operations to +performance measurements. It also reduces the number of statistics by more than +half. The javadoc of the new EnvironmentStats getter methods describe the +mapping from API calls to operation statistics. +

      +[#23792] (7.3.0) +


    6. + +
    7. +Data corruption is now detected as soon as possible by using an internal JE +background task. This detects data corruption caused by media/disk failure by +reading the log sequentially and verifying checksums. This is the equivalent of +running the current DbVerifyLog utility, but it is performed automatically and +periodically. The schedule for performing verification can be controlled by the +new EnvironmentConfig.ENV_RUN_VERIFIER, VERIFY_SCHEDULE and VERIFY_LOG +parameters. By default, verification is on and occurs once a day at midnight, +local time. +

      +When corruption is detected, the Environment will be invalidated and an +EnvironmentFailureException will be thrown. Applications catching this +exception can call the new EnvironmentFailureException.isCorrupted method to +determine whether corruption was detected. +

      +If isCorrupted returns true, a network restore (or restore from backup) should +be performed to avoid further problems. The advantage of performing +verification frequently is that a problem may be detected sooner than it would +be otherwise. For HA applications, this means that the network restore can be +done while the other nodes in the group are up, minimizing exposure to +additional failures. +

      +[#25221] (7.3.0) +


    8. + +
    9. +Repeat-fault reads have been eliminated, for the most part, for LNs (Btree leaf +nodes, which represent record data on disk.) Previously, if an LN's on-disk +size was greater than EnvironmentConfig.LOG_FAULT_READ_SIZE (2kB by default), +two reads would be required to fetch the LN from disk. The first read would +always include the log entry header, which contains the exact entry size, and +the second read (repeat-read) was needed to read the entire entry. The second +read includes the entire entry, although normally it will be cached by the file +system. +

      +Now, only a single read is needed because the last logged size for LNs is now +stored in the Btree, for all LNs written with JE 6.0 and later, and this can be +used to determine the exact size needed for the read buffer. The benefits of +this change are 1) the amount of IO is reduced (although the repeat-read +normally reads data that is cached by the file system), and 2) the statistics +describing IO activity are simpler to analyze without the repeat-reads in the +picture. +

      +Note that INs (Btree internal nodes) can still cause repeat-reads when they are +fetched, because the last logged size for INs is not stored in the Btree. +However, in many applications all INs are cached and therefore INs are rarely +read from disk (except during a cache warm-up period). The nRepeatFaultReads +statistic (EnvironmentStats.getNRepeatFaultReads) indicates the number of +repeat-reads. +

      +[#25387] (7.3.0) +


    10. + +
    11. +Several bugs were fixed related to performing a preload (Database.preload or +Environment.preload) when an off-heap cache is configured (via +EnvironmentConfig.setOffHeapCacheSize). These bugs sometimes caused an +incomplete preload as well as producing an incorrect (corrupt) data set. +In releases prior to 7.3, preload should not be used with an off-heap cache. +[#25594] (7.3.1) +

    12. + +
    13. +Network restores are instigated by a JE HA application when an +environment open results in an InsufficientLogException. If a network +restore is interrupted, the application should retry until it +succeeds. Failing to do so might result in an environment log that is +corrupted or inconsistent. This JE release adds a new mechanism to +persistently mark that a network restore has started, and to prevent +inadvertent use of the environment before the restore has +completed. The marker file is named 7fffffff.jdb, and is recognized +and managed by JE. The required steps for handling an +InsufficientLogException are unchanged; the marker file is an internal +mechanism. +

      +[#25369] (7.3.1) +


    14. + +
    15. +Fixed a bug that prevented the transaction timeout for a write operation from +being honored in JE HA applications. When a transaction's ReplicaAckPolicy +required waiting for a replica, the timeout was not always honored and the +transaction sometimes took longer than the specified timeout. +[#25692] (7.3.4) +

    16. + +
    17. +Preload (Database.preload and Environment.preload) has been changed so that it +does not populate the off-heap cache. Only the main cache (in the Java heap) is +now populated. This was done to avoid a corruption problem linked to preload +and the off-heap cache. Population of the off-heap cache will be added in a +future release. Note that when an off-heap cache is configured, preload will +not populate it, but other operations will populate it as data is evicted from +the main cache. +[#25594] (7.3.7) +

    18. + +
    + + +
    +

    Changes in 7.2.8

    + +
      + +
    1. +Fixed a problem where Environment.removeDatabase or truncateDatabase may have +taken a long time to complete, due to internal retries. +[#25361] (7.2.0) +

    2. + +
    3. +Reduced GC overhead by avoiding the re-creation of internal lock objects, in +cases where a record is locked by only one thread/transaction at a time. This +overhead was introduced when deadlock detection was added in JE 7.1 [#16260]. +The overhead is small, but could have impacted certain critical code paths, +such as transaction replay on an HA replica node. +

      +[#25355] (7.2.0) +


    4. + +
    5. +Improved support for JDK 9. (Note that JDK 9 is not officially supported until +it becomes generally available.) Previously, using JE with JDK 9 would cause +the following exception: +
      +  java.lang.IllegalStateException: java.lang.IllegalAccessException: class
      +  com.sleepycat.je.utilint.JVMSystemUtils cannot access class
      +  sun.management.BaseOperatingSystemImpl (in module java.management) because
      +  module java.management does not export sun.management to unnamed module
      +  @73846619
      +
      +A workaround for this problem was to specify the following JVM option: +
      +  -XaddExports:java.management/sun.management=ALL-UNNAMED
      +
      +Specifying this option is no longer necessary. +[#25383] (7.2.0) +

    6. + +
    7. +Made several changes to make NullPointerExceptions less likely when closing an +Environment. NullPointerException sometimes occurs when one thread is calling +Environment.close and other threads (either application threads or internal +JE threads) are concurrently accessing the Environment. It is still possible +for NullPointerException and other unexpected exceptions to occur, but they +should now happen less frequently, and IllegalStateException should normally be +thrown instead. +

      +Several additional fixes were made as a result of these changes: +

        +
      • When a database is closed, Database.getDatabaseName now throws + IllegalStateException. Previously, it returned null and this was not + documented. This could have caused NullPointerException in the + application.
      • +
      • When a database is closed, Database.getConfig now throws + IllegalStateException. Previously, it returned a non-null, but + sometimes incorrect, configuration.
      • +
      • When an environment is closed, Environment.printStartupInfo() now + throws IllegalStateException; previously NullPointerException was + thrown. As before, this method may be called when the environment is + invalid but not yet closed, but now this behavior is documented.
      • +
      • As before, the Environment.getConfig and getMutableConfig methods may + be called when the environment is invalid but not yet closed, but now + this behavior is documented.
      • +
      • When an environment is invalid but not yet closed, and the + Environment.setMutableConfig method is called, an + EnvironmentFailureExcpetion is now thrown. Previously, the method's + behavior in this case was undefined.
      • +
      • When an environment is closed or invalid, + ReplicatedEnviornment.transferMaster now throws IllegalStateException + or EnvironmentFailureExcpetion. Previously a NullPointerException was + thrown.
      • +
      +

      +[#21590] (7.2.1) +


    8. + +
    9. +Fixed a problem where checkpointing sometimes did not occur after log cleaning +when application write operations stopped, preventing the reclaiming of disk +space. This was a common problem with tests that expect disk space to be +reclaimed. In production systems it could also be a problem during repair of an +out-of-disk situation. See the javadoc for the configuration property, +EnvironmentConfig.CLEANER_WAKEUP_INTERVAL, for details. +

      +Note that an earlier fix [#23180] in JE 7.1 caused cleaning to occur in this +situation, but a checkpoint is also needed to reclaim disk space after +cleaning. In addition, the earlier fix was not reliable in certain cases where +the cleaner thread awoke concurrently with the last write operation. +

      +[#25364] (7.2.1) +


    10. + +
    11. +Improved behavior and error handling support for an invalidated Environment. +When an Environment is invalidated due to an EnvironmentFailureException, the +user must call Environment.close(). Calls to any other JE methods will re-throw +the invalidating EnvironmentFailureException. In addition, this exception may +need special handling by the application, for example, an +InsufficientLogException (which extends EnvironmentFailureException) must be +handled by performing a network restore. +

      +Several changes have been made to make this process simpler and more reliable. +

        +
      • The first invalidating EnvironmentFailureException is now saved + internally, and this exception is re-thrown when making a JE API call + (other than Environment.close). Previously, when multiple + EnvironmentFailureException occurred, the last one thrown was saved and + re-thrown. +

        + (After the environment is invalidated by an + EnvironmentFailureException, other EnvironmentFailureExceptions may be + thrown later as side effects of the original problem, or possibly as + separate problems. It is normally the first invalidating exception that + is most relevant.)

      • + +
      • The Environment.getInvalidatingException method has been added. This + returns the invalidating exception described above.
      • + +
      • The Environment.isClosed method has been added. The existing + Environment.isValid returns false in two cases: when an environment is + closed, and when it is invalid but not yet closed. This new isClosed + method can be used to distinguish between these two cases. The javadoc + for isValid was clarified accordingly.
      • +
      +

      +[#25248] (7.2.1) +


    12. + +
    13. +Detect unexpected JE log file deletions. Normally all JE log file deletions +should be performed as a result of JE log cleaning. If an external file +deletion is detected, JE assumes this was accidental. This will cause the +environment to be invalidated and all methods will throw +EnvironmentFailureException. +[#25201] (7.2.2) +

    14. + +
    15. +Enhanced the background log flushing capability in JE HA, and made this feature +available with or without HA. +

      +Previously, the ReplicationConfig.RUN_LOG_FLUSH_TASK and +LOG_FLUSH_TASK_INTERVAL parameters specified whether and how often JE HA would +periodically perform a flush and fsync, to force NO_SYNC or WRITE_NO_SYNC +transactions to the file system and to the storage device. The default interval +was 5 minutes. These parameters are now deprecated. For backward compatibility +information, see the javadoc for these parameters. +

      +In place of the deprecated HA parameters, the +EnvironmentConfig.LOG_FLUSH_NO_SYNC_INTERVAL and LOG_FLUSH_SYNC_INTERVAL +parameters have been added. These specify two separate intervals for flushing +to the file system and the storage device, with default values of 5 seconds and +20 seconds, respectively. Frequent periodic flushing to the file system +provides improved durability for NO_SYNC transactions. Without this flushing, +if application write operations stop, then some number of NO_SYNC transactions +would be left in JE memory buffers and would be lost in the event of a crash. +For HA applications, this flushing reduces the possibility of +RollbackProhibitedException. +

      +[#25417] (7.2.2) +


    16. + +
    17. +DbCacheSize has been improved for applications using CacheMode.EVICT_LN and an +off-heap cache. This change applies when the -offheap argument is specified. +The -maincache argument may now be omitted, and the size of the main cache is +assumed to be the amount needed to hold all internal nodes (INs). Previously, +it was difficult to use DbCacheSize to determine the main and off-heap cache +sizes when using EVICT_LN, because DbCacheSize required specifying the main +cache size and assumed that LNs would be stored in the main cache (when there +was room). +

      +[#25380] (7.2.6) +


    18. + +
    + + +
    +

    Changes in 7.1.9

    + +
      + +
    1. +Fixed a bug that might have caused data corruption. Multi-threaded writes were +incorrectly allowed during recovery, due to eviction. The smaller the cache +relative to the recovery interval and data set size, the more likely this was +to occur. This could have caused corruption, but this was never confirmed. +

      +Note that the corruption problem that motivated this fix occurred with an ext3 +file system with a default configuration (write barrier not enabled). This is +not recommended for JE, because JE relies on ordered writes. However, we don't +have any proof that the problem was ext3 specific, because it was not +reproducible. +

      +During testing of this fix, a separate problem was fixed in the exception +listener mechanism (EnvironmentConfig.setExceptionListener). Previously, when a +JE background thread threw an Error (due to an assertion or out-of-memory +condition, for example), this was not reported to the listener. Now, the +EnvironmentFailureException, which is created as a result of the Error, is +reported to the listener. +

      +In addition, when an unhandled exception occurred in the background eviction +threads, an EnvironmentFailureException was not created, and so the Environment +was not invalidated. This was another reason for the lack of notifications to +the exception listener. This has been corrected. +

      +Note that when using a shared cache, unhandled exceptions during eviction do +not always invalidate the Environment or cause exception listener events. +This issue is not addressed by the fixes mentioned. +

      +[#25084] (7.1.0) +


    2. + +
    3. +Changes to track durable transaction commits (transaction durability requiring +acknowledgements from at least a simple majority of nodes) explicitly in the JE +HA log. Only durable transaction commits now count towards the rollback limit +specified in com.sleepycat.je.rep.ReplicationConfig.TXN_ROLLBACK_LIMIT, thus +allowing for automatic rollback and recovery in more cases. +

      +[#25057] (7.1.0) +


    4. + +
    5. +Fixed a bug that could prevent an HA internal thread from exiting on the master +node, preventing internal state from being updated, and potentially causing +disk usage to grow on all nodes. The internal thread also cannot be +interrupted, causing a hang. An example thread dump for JE 5.0.98 is below. +
      +"Feeder Input for rg2-rn1" #93465 daemon prio=5 os_prio=0 tid=0x00007fb40c028800 nid=0x109c runnable [0x00007fb3757d6000]
      +    java.lang.Thread.State: RUNNABLE
      +         at java.lang.Throwable.fillInStackTrace(Native Method)
      +         at java.lang.Throwable.fillInStackTrace(Throwable.java:783)
      +         - locked <0x00000003d0ae00e0> (a java.lang.IllegalArgumentException)
      +         at java.lang.Throwable.(Throwable.java:250)
      +         at java.lang.Exception.(Exception.java:54)
      +         at java.lang.RuntimeException.(RuntimeException.java:51)
      +         at java.lang.IllegalArgumentException.(
      +            IllegalArgumentException.java:42)
      +         at java.nio.Buffer.position(Buffer.java:244)
      +         at com.sleepycat.je.log.FileReader.threadSafeBufferPosition(
      +            FileReader.java:920)
      +         at com.sleepycat.je.log.FileReader$ReadWindow.fillFromFile(
      +            FileReader.java:1185)
      +         at com.sleepycat.je.log.FileReader$ReadWindow.slideAndFill(
      +            FileReader.java:1063)
      +         at com.sleepycat.je.log.FileReader.setBackwardPosition(
      +            FileReader.java:587)
      +         at com.sleepycat.je.log.FileReader.getLogEntryInReadBuffer(
      +            FileReader.java:429)
      +         at com.sleepycat.je.log.FileReader.readNextEntryAllowExceptions(
      +            FileReader.java:256)
      +         at com.sleepycat.je.log.FileReader.readNextEntry(FileReader.java:229)
      +         at com.sleepycat.je.rep.stream.FeederSyncupReader.scanBackwards(
      +            FeederSyncupReader.java:123)
      +         at com.sleepycat.je.rep.stream.FeederReplicaSyncup.
      +            makeResponseToEntryRequest(FeederReplicaSyncup.java:283)
      +         at com.sleepycat.je.rep.stream.FeederReplicaSyncup.execute(
      +            FeederReplicaSyncup.java:100)
      +         at com.sleepycat.je.rep.impl.node.Feeder$InputThread.run(
      +            Feeder.java:413)
      +
      +[#25088] (7.1.0) +

    6. + +
    7. +Deadlock detection has been implemented to improve performance and behavior +when lock conflicts occur due to a deadlock. Performance is improved when the +deadlock can be detected without blocking or blocking for a shorter time +period, since the deadlock can be broken sooner and this can increase +concurrency. Behavior is improved because DeadlockException is now thrown +when a deadlock is detected, more debugging information is included in the +exception, and deadlock detection is reliable. +

      +In earlier releases, a LockTimeoutException was eventually thrown when a +deadlock occurred, but only after the lock timeout expired. This exception +sometimes contained information about a potential deadlock, but that +information was not always correct. +

      +Specific changes include: +

        +
      • + DeadlockException is now thrown when a deadlock is detected. Note that + LockTimeoutException is still thrown when the lock timeout expires and a + deadlock is not detected. TransactionTimeoutException is thrown when the + transaction timeout expires and a deadlock is not detected. +
      • + Deadlock detection is performed when a lock conflict is detected. A new + configuration parameter, EnvironmentConfig.LOCK_DEADLOCK_DETECT, can be + used to disable deadlock detection, By default, deadlock detection is + enabled. See EnvironmentConfig.LOCK_DEADLOCK_DETECT for more details about + the deadlock detection procedure. +
      • + When deadlock detection is enabled, another new parameter, + EnvironmentConfig.LOCK_DEADLOCK_DETECT_DELAY, may be used to improve + performance under certain circumstances. By default this is set to zero, + meaning no special delay. +
      • + EnvironmentConfig.LOCK_OLD_LOCK_EXCEPTIONS is now deprecated and has + no effect, as if were set to false. Also, LockNotGrantedException has been + removed; it was replaced by LockNotAvailableException in JE 3.3. In + addition, TransactionTimeoutException is always thrown when a transaction + times out, not DeadlockException. +

        +

        +
        Historical Note:
        +
        + In JE releases 3.3 and earlier, {@link DeadlockException} or a + subclass of it was always thrown when a lock conflict occurred. + Applications typically caught {@link DeadlockException} in order to + detect lock conflicts and determine whether to retry a transaction. + {@link DeadlockException} itself was thrown when a lock or transaction + timeout occurred and {@link LockNotGrantedException} (a subclass of + {@link DeadlockException}) was thrown when a lock conflict occurred + for a no-wait transaction (see {@link TransactionConfig#setNoWait}). +

        + In all releases after JE 3.3, new exceptions and the new base class + {@link LockConflictException} are available. {@link + LockConflictException} should be caught to handle lock conflicts in a + general manner, instead of catching {@link DeadlockException}. +

        + In all releases after JE 3.3, LockNotGrantedException was replaced by + LockNotAvailableException. LockNotGrantedException was deprecated + because it misleadingly extended DeadlockException. Now in JE 6.5, + LockNotGrantedException has been removed. +

        +
        +
      +[#16260] (7.1.1) +

    8. + +
    9. +Fixed a bug that impacts the use of the Serializable isolation mode. When +multiple threads were performing read and write operations, phantom prevention +did not work in certain cases. +[#25149] (7.1.1) +

    10. + +
    11. +Fixed a problem where cleaning sometimes did not occur after application write +operations stopped. This was a common problem with tests that expect disk space +to be reclaimed. In production systems it could also be a problem during repair +of an out-of-disk situation. See the javadoc for the new configuration +property, EnvironmentConfig.CLEANER_WAKEUP_INTERVAL, for details. +

      +(Note that this fix does not cause checkpointing to occur, and a checkpoint is +sometimes needed to reclaim disk space after cleaning. A later fix in JE 7.2 +[#25364] corrects this problem as well.) +

      +[#23180] (7.1.1) +


    12. + +
    13. +Fixed two bugs that could cause mutex deadlocks during Environment.close() and +ReplicatedEnvrionment.shutdownGroup(). An example deadlock is shown below. +
      +"ReplayThread" #37 daemon prio=5 os_prio=0 tid=0x00007fe11001f800 nid=0xfad
      +waiting for monitor entry [0x00007fe0fa1e6000]
      +   java.lang.Thread.State: BLOCKED (on object monitor)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.removeConfigObserver(
      +        EnvironmentImpl.java:2675)
      +    - waiting to lock <0x00000000f131de08> (a com.sleepycat.je.rep.impl.RepImpl)
      +    at com.sleepycat.je.statcap.StatCapture.clearEnv(StatCapture.java:176)
      +    - locked <0x00000000f131f078> (a com.sleepycat.je.statcap.StatCapture)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.shutdownStatCapture(
      +        EnvironmentImpl.java:2454)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.shutdownDaemons(
      +        EnvironmentImpl.java:2345)
      +    at com.sleepycat.je.rep.impl.node.Replica.processShutdown(Replica.java:694)
      +    at com.sleepycat.je.rep.impl.node.Replica.access$1100(Replica.java:153)
      +    at com.sleepycat.je.rep.impl.node.Replica$ReplayThread.run(Replica.java:1229)
      +
      +"UNKNOWN Node6(-1)" #1 prio=5 os_prio=0 tid=0x00007fe14400c000 nid=0xf81
      +waiting for monitor entry [0x00007fe14b9e4000]
      +   java.lang.Thread.State: BLOCKED (on object monitor)
      +    at com.sleepycat.je.statcap.StatCapture.clearEnv(StatCapture.java:170)
      +    - waiting to lock <0x00000000f131f078> (a
      +        com.sleepycat.je.statcap.StatCapture)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.shutdownStatCapture(
      +        EnvironmentImpl.java:2454)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.shutdownDaemons(
      +        EnvironmentImpl.java:2345)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.doClose(EnvironmentImpl.java:1884)
      +    - locked <0x00000000f131de08> (a com.sleepycat.je.rep.impl.RepImpl)
      +    at com.sleepycat.je.dbi.DbEnvPool.closeEnvironment(DbEnvPool.java:374)
      +    - locked <0x00000000f131de08> (a com.sleepycat.je.rep.impl.RepImpl)
      +    - locked <0x00000000f1015b30> (a com.sleepycat.je.dbi.DbEnvPool)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.close(EnvironmentImpl.java:1742)
      +    at com.sleepycat.je.Environment.close(Environment.java:445)
      +    - locked <0x00000000f2102ce8> (a com.sleepycat.je.rep.ReplicatedEnvironment)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.close(
      +        ReplicatedEnvironment.java:830)
      +    - locked <0x00000000f2102ce8> (a com.sleepycat.je.rep.ReplicatedEnvironment)
      +    ...
      +
      +[#25195] (7.1.2) +

    14. + +
    15. +A new exception, EnvironmentWedgedException, is now thrown by Environment.close +when a badly behaved internal thread cannot be shutdown, and the current +process must be shut down and restarted before re-opening the Environment. +Prior to this change, when a thread could not be shut down, the application was +not informed about the problem via an exception, and the badly behaved thread +somtimes caused unpredictable behavior in the Environment, even if it were +closed and re-opened. See EnvironmentWedgedException for more details. +

      +[#25222] (7.1.3) +


    16. + +
    17. +The default value for ReplicationConfig.REP_STREAM_TIMEOUT was changed from +24 hours to 30 minutes. The default value was changed to 30 minutes in the +documentation in JE 6.0.5 [#22575], but code change was omitted, accidentally +leaving the default value of 24 hours. A 30 minute value is much more +reasonable than 24 hours, since during this period, files will be retained for +feeding a dead or lagging replica, and this can cause an out-of-disk condition +if enough data is written during this period. In the earlier change in JE +6.0.5, the REPLAY_COST_PERCENT and REPLAY_FREE_DISK_PERCENT parameters were +added, and these also allow retention of files for replicas, but without the +risk of creating an out-of-disk condition. +

      +[#25254] (7.1.4) +


    18. + +
    19. +Improved Environment.close for an invalid Environment, to reduce the +probability of an OOME (OutOfMemoryError) when re-opening the Environment. +

      +For an invalid Environment, previously JE did not attempt to close Databases +during Environment.close. Also with an invalid Environment, Database.close +simply re-threw the invalidating exception, and the Database was not closed. +

      +The impact was that Environment and Database handles for a closed, invaid +Environment would continue to refer to internal data structures and +consequently to the cached data set. If another Environment was then opened, +while referencing the previous Environment or Database handles, this could +have caused OOME if the resident objects for both Environments did not fit in +the heap. This was especially likely if recovery for the new Environment +caused loading of a large data set. +

      +The javadoc indicates that applications should discard all handles after +closing an Environment. However, this is impractical at least in one use case: +when asynchronously closing an Environment due to an exception and then +re-opening it. When this is done asynchronously, it may be impractical to set +all old handle references to null before opening the new handle. So in this +case there will be a time interval where both Environments are referenced. +

      +Now, Environment.close clears references to internal data structures in the +Environment handle and all Database handles that have been opened via that +Environment. +

      +[#25238] (7.1.7) +


    20. + +
    21. +Fixes an HA bug that manifested itself as a RollbackProhibitedException when +replication nodes were running different JE versions and a version 6.4.15 +Replica contacted a version 7 Master with a version less than 7.1.8. +

      +[#25362] (7.1.8) +


    22. + +
    + + +
    +

    Changes in 7.0.5

    + +
      + +
    1. +A Time-To-Live (TTL) feature has been added to allow efficient purging of +records whose lifetime is can be set in advance. Records can be assigned a TTL +using WriteOptions.setTTL. The javadoc for the WriteOptions class contains a +Time-To-Live section with more information about the TTL feature. +

      +New 'get', 'put' and 'delete' API methods have been added to support the TTL +feature and expansion of the API in the future. Each 'get' method has a +ReadOptions parameter, and each 'put' and 'delete' method has a WriteOptions +parameter. WriteOptions includes TTL parameters so that a TTL can be assigned +to a record. The return value for the new methods is an OperationResult, or +null if the operation fails. OperationResult includes the record's expiration +time, for records that have been assigned a TTL. The new methods are as +follows. +

      +Note that the Collections API does not have new method signatures, since it +conforms to the standard Java collections interfaces. Therefore, it is not +currently possible to specify a TTL using the Collection API. However, it is +possible to use the DPL API for writing data with a TTL, and then use +EntityIndex.map or sortedMap to additionally use the Collections API. +

      +com.sleepycat.je.Database
      +
      +  OperationResult get(Transaction txn, DatabaseEntry key, DatabaseEntry data,
      +                      Get getType, ReadOptions options)
      +
      +  OperationResult put(Transaction txn, DatabaseEntry key, DatabaseEntry data,
      +                      Put putType, WriteOptions options)
      +
      +  OperationResult delete(Transaction txn, DatabaseEntry key,
      +                         WriteOptions options)
      +
      +com.sleepycat.je.Cursor
      +
      +  OperationResult get(DatabaseEntry key, DatabaseEntry data,
      +                      Get getType, ReadOptions options)
      +
      +  OperationResult put(DatabaseEntry key, DatabaseEntry data,
      +                      Put putType, WriteOptions options)
      +
      +  OperationResult delete(WriteOptions options)
      +
      +com.sleepycat.je.SecondaryDatabase
      +
      +  OperationResult get(Transaction txn, DatabaseEntry key, DatabaseEntry pKey,
      +                      DatabaseEntry data, Get getType, ReadOptions options)
      +
      +  OperationResult delete(Transaction txn, DatabaseEntry key,
      +                         WriteOptions options)
      +
      +com.sleepycat.je.SecondaryCursor
      +
      +  OperationResult get(DatabaseEntry key, DatabaseEntry pKey,
      +                      DatabaseEntry data, Get getType, ReadOptions options)
      +
      +  OperationResult delete(WriteOptions options)
      +
      +com.sleepycat.je.ForwardCursor
      +com.sleepycat.je.JoinCursor
      +com.sleepycat.je.DiskOrderedCursor
      +
      +  OperationResult get(DatabaseEntry key, DatabaseEntry data,
      +                      Get getType, ReadOptions options)
      +  // Get.NEXT and CURRENT only
      +
      +com.sleepycat.persist.PrimaryIndex
      +
      +  OperationResult put(Transaction txn, E entity,
      +                      Put putType, WriteOptions writeOptions)
      +  // Put.OVERWRITE and NO_OVERWRITE only
      +
      +com.sleepycat.persist.EntityIndex
      +
      +  EntityResult get(Transaction txn, K key,
      +                   Get getType, ReadOptions readOptions)
      +  // Get.SEARCH only, more types may be supported later
      +
      +  OperationResult delete(Transaction txn, K key, WriteOptions writeOptions)
      +
      +com.sleepycat.persist.EntityCursor
      +
      +  EntityResult get(Get getType, ReadOptions readOptions)
      +  // All Get types except SEARCH_*, which may be supported later
      +
      +  OperationResult update(V entity, WriteOptions writeOptions)
      +
      +  OperationResult delete(WriteOptions writeOptions)
      +
      +The 'put' methods are passed a Put enum value and the 'get' methods are passed +a Get enum value. The enum values correspond to the methods of the older API. +For example, Get.SEARCH corresponds to the older Cursor.getSearchKey method and +Put.NO_OVERWRITE corresponds to the older Database.putNoOverwrite method. +Future enhancements, like TTL, may be supported via the newer 'get' and 'put' +methods, so we recommend that these methods are used instead of the older API +methods. However, there are no plans to deprecate or remove the older methods +at this time. In fact, the older methods still appear in most of the JE example +programs and documentation. +

      +ReadOptions and WriteOptions contain a CacheMode parameter for specifying the +cache mode on a per-operation. ReadOptions also contains a LockMode property, +which corresponds to the LockMode parameter of the older 'get' and 'put' +methods. To ease the translation of existing code, a LockMode.toReadOptions +method is provided. +

      +Another API change has to do with key-only 'get' operations, where returning +the record data is not needed. Previously, returning the data and its +associated overhead could be avoided only by calling DatabaseEntry.setPartial. +Now, null may be passed for the data parameter instead. In fact, null may now +be passed for all "output parameters", in both the new and old versions of the +'get' and 'put' methods. For more information, see the "Input and Output +Parameters" section of the DatabaseEntry class javadoc. +

      +The JE cleaner has also been enhanced to perform purging of expired data. For +each data file, a histogram of expired data sizes is stored and used by the +cleaner. Along with the obsolete size information that the cleaner already +maintains, the histogram allows knowing when a file is ready for cleaning. New +related cleaner statistics are as follows: +

        +
      • EnvironmentStats.getNLNsExpired - the number of expired LNs processed + by the cleaner.
      • +
      • EnvironmentStats.getCurrentMinUtilization - replacement for + getLastKnownUtilization, which is now deprecated.
      • +
      • EnvironmentStats.getCurrentMaxUtilization - the maximum utilization + are often different than the minimum, when TTL is used.
      • +
      • EnvironmentStats.getNCleanerTwoPassRuns - two-pass cleaning is + used when the maximum and minimum diverge.
      • +
      • EnvironmentStats.getNCleanerRevisalRuns - two-pass cleaning can result + in revised expiration data.
      • +
      +

      +Another indication of expired data is shown by the DbSpace utility. This now +outputs minimum and maximum utilization and the total expired bytes. A new +option for this utility, -t DATE-TIME, shows the utilization and +expired bytes for a specified time. +

      +The DbCacheSize utility now has a -ttl option. Specifying this +option causes the estimated cache size to include space for an expiration time +for each record. +

      +The RecoveryProgress.POPULATE_EXPIRATION_PROFILE phase was added to indicate +that the cleaner is reading the stored histograms into cache. +

      +EnvironmentConfig.ENV_EXPIRATION_ENABLED is a new config param that is true by +default, meaning that expired data is filtered from queries and purged by the +cleaner. It might be set to false to recover data after an extended down time. +

      +In addition, the cleaner "backlog" mechanism has been removed, meaning that +EnvironmentStats.getCleanerBacklog and +EnvironmentConfig.CLEANER_MAX_BATCH_FILES are now deprecated. The backlog +mechansim has not been beneficial for some time and was due for removal. When +using TTL, because two-pass cleaning can occur even when true utilization is +below EnvironmentConfig.CLEANER_MIN_UTILIZATION, the cleaner backlog statistic +would have been misleading. +

      +[#16845] (7.0.0) +


    2. + +
    3. +Fixed a bug causing the following exception. In JE versions from 6.2 to 6.4, +this could occur when EnvironmentConfig.NODE_MAX_ENTRIES or +DatabaseConfig.setNodeMaxEntries is more than 128, which is the default value. +
      +Caused by: java.lang.ArrayIndexOutOfBoundsException: -96
      +    at com.sleepycat.je.tree.BINDeltaBloomFilter.setBit(
      +        BINDeltaBloomFilter.java:257)
      +    at com.sleepycat.je.tree.BINDeltaBloomFilter.add(
      +        BINDeltaBloomFilter.java:113)
      +    at com.sleepycat.je.tree.BIN.createBloomFilter(BIN.java:1863)
      +    at com.sleepycat.je.tree.IN.serialize(IN.java:6037)
      +    at com.sleepycat.je.tree.IN.writeToLog(IN.java:6021)
      +    at com.sleepycat.je.log.entry.INLogEntry.writeEntry(INLogEntry.java:349)
      +    at com.sleepycat.je.log.LogManager.marshallIntoBuffer(LogManager.java:731)
      +    at com.sleepycat.je.log.LogManager.log(LogManager.java:346)
      +    ...
      +
      +[#24896] (7.0.0) +

    4. + +
    + + +
    +

    Changes in 6.4.15

    + +
      + +
    1. +Made several minor improvements to off-heap cache behavior. +
        +
      • + The OffHeap:offHeapCriticalNodesTargeted statistic was added for + monitoring off-heap critical eviction, which increases operation latency + in application threads. See + EnvironmentStats.getOffHeapCriticalNodesTargeted. +
      • +
      • + To reduce off-heap critical eviction, the default for + EnvironmentConfig.OFFHEAP_EVICT_BYTES was changed from 1MB to 50MB. +
      • +
      • + To reduce off-heap evictor thread contention, the default for + EnvironmentConfig.OFFHEAP_MAX_THREADS was changed from 10 to 3, and an + internal check was added to reduce contention when all threads are busy. +
      • +
      +[#23889] (6.4.10) +

    2. + +
    3. +Fixed a bug that caused internal Btree corruption when using the off-heap +cache and performing insertions. The bug was observed when using +CacheMode.EVICT_BIN, but could also occur if BIN eviction is frequent for +other reasons. The bug causes persistent corruption that would require +reverting to a backup (or HA network restore) to correct. The bug was observed +to cause one of the two following exceptions at the time the corruption was +created. +

      +The following assertion would rarely occur, and only if assertions were +enabled of course. +

      +com.sleepycat.je.EnvironmentFailureException: (JE 6.4.10)
      +UNEXPECTED_STATE: Unexpected internal state, may have side effects.
      +    at com.sleepycat.je.EnvironmentFailureException.unexpectedState(
      +    EnvironmentFailureException.java:397)
      +    at com.sleepycat.je.tree.IN.getKnownChildIndex(IN.java:782)
      +    at com.sleepycat.je.evictor.OffHeapCache.freeRedundantBIN(
      +    OffHeapCache.java:1974)
      +    at com.sleepycat.je.tree.IN.updateLRU(IN.java:695)
      +    at com.sleepycat.je.tree.IN.latchShared(IN.java:600)
      +    at com.sleepycat.je.recovery.DirtyINMap.selectDirtyINsForCheckpoint(
      +    DirtyINMap.java:277)
      +    at com.sleepycat.je.recovery.Checkpointer.doCheckpoint(
      +    Checkpointer.java:816)
      +    at com.sleepycat.je.recovery.Checkpointer.onWakeup(Checkpointer.java:593)
      +    at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:184)
      +    at java.lang.Thread.run(Thread.java:745)
      +
      +

      +The following assertion would occur more often, whether or not assertions were +enabled. +

      +com.sleepycat.je.EnvironmentFailureException: (JE 6.4.10)
      +UNEXPECTED_STATE_FATAL: Failed adding new IN ...
      +    at com.sleepycat.je.EnvironmentFailureException.unexpectedState(
      +    EnvironmentFailureException.java:441)
      +    at com.sleepycat.je.dbi.INList.add(INList.java:204)
      +    at com.sleepycat.je.tree.IN.addToMainCache(IN.java:2966)
      +    at com.sleepycat.je.tree.IN.postLoadInit(IN.java:2939)
      +    at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:2513)
      +    at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:2279)
      +    at com.sleepycat.je.tree.Tree.searchSplitsAllowed(Tree.java:1919)
      +    at com.sleepycat.je.tree.Tree.searchSplitsAllowed(Tree.java:1857)
      +    at com.sleepycat.je.tree.Tree.searchSplitsAllowed(Tree.java:1775)
      +    at com.sleepycat.je.tree.Tree.findBinForInsert(Tree.java:1746)
      +    at com.sleepycat.je.dbi.CursorImpl.insertRecordInternal(
      +    CursorImpl.java:1381)
      +    at com.sleepycat.je.dbi.CursorImpl.insertOrUpdateRecord(
      +    CursorImpl.java:1280)
      +    at com.sleepycat.je.Cursor.putNoNotify(Cursor.java:2504)
      +    at com.sleepycat.je.Cursor.putNotify(Cursor.java:2365)
      +    at com.sleepycat.je.Cursor.putNoDups(Cursor.java:2223)
      +    at com.sleepycat.je.Cursor.putInternal(Cursor.java:2060)
      +    at com.sleepycat.je.Cursor.put(Cursor.java:730)
      +
      +[#24564] (6.4.11) +

    4. + +
    5. +Fixed a bug that could cause queries to return the wrong result, and also +could cause persistent Btree corruption. The bug is present in releases 6.3.0 +to 6.4.11. The conditions for the bug are as follows. +
        +
      • A custom key comparator must not be configured.
      • +
      • The DB must not be a duplicates DB (because an internal key comparator + is used).
      • +
      • Key prefixing must be configured for the DB (or at least, it must have + been configured when data was written).
      • +
      • The bug will occur when the search key of an operation (either a read + or a write operation, including internal operations such as cleaning + and checkpointing) is a prefix of the common prefix for all the keys + in an IN. In this case, if a custom comparator is not used, the + default internal comparator will return a wrong result when comparing + the search key with another key in the IN. This will in general result + in wrong results and/or data corruption.
      • +
      • For a query to return the wrong result, the specified search key must + be a prefix of other keys in the DB. For example, key A is a prefix of + key A1 and A2.
      • +
      • For corruption to occur, some keys in the DB must be a prefix of other + keys. For example, keys A, A1 and A2 are stored.
      • +
      • In both cases above (a query with the wrong result and corruption), + the smaller key which is a prefix of other keys must also be smaller + or equal to JE's internal key prefix for the Btree internal node (IN) + that is accessed. This means that all keys in the IN, or roughly 100 + adjacent keys, must have this prefix.
      • +
      +[#24583] (6.4.12) +

    6. + +
    7. +Fixed a bug in preload (Database.preload and Environment.preload) that +prevented all data from being preloaded. It did not cause corruption of any +kind, and the data that was not preloaded was still accessible, i.e., it +would be loaded when acessed through normal API operations. +

      +Data was missed by preload when BIN-deltas were present in cache. If the +preload was performed immediately after opening the Environment, this would +normally happen only after a crash-recovery (a normal shutdown did not occur). +If the preload was performed later on, BIN-deltas might also be in cache due +to eviction. +

      +[#24565] (6.4.12) +


    8. + +
    9. +Fixed a bug in preload (Database.preload and Environment.preload) that caused +preloaded data to be evicted from cache by a subsequent operation using +CacheMode.UNCHANGED. +

      +[#24629] (6.4.14) +


    10. + +
    11. +Fixed a bug where the information about lock owners and waiters in +LockConflictException was sometimes incorrect due to a time window between +detecting the lock conflict and constructing the exception. The fix applies to +the LockConflictException.getOwnerTxnIds and getWaiterTxnIds methods, and to +the two lines in the first part of the exception message starting with +"Owners:" and "Waiters:". +

      +In addition, the list of waiters will now contain the locker or Transaction +requesting the lock, for which the LockConflictException is thrown. +

      +The fix does NOT apply to the information output when +EnvironmentConfig.TXN_DUMP_LOCKS is set to true. This information is by nature +somewhat inaccurate, because normal locking operations are not frozen when this +dump is occurring, so changes to the state of the lock table are occurring +concurrently. +

      +The fix also does NOT apply to the deadlock information that is sometimes +included in the exception message. This information can also be inaccurate due +to concurrent locking operations. This is a larger problem that will be fixed +in a future release. +

      +[#24623] (6.4.14) +


    12. + +
    13. +Fixed a bug that could cause a "log file not found" exception during recovery, +i.e., when opening the Environment. The circumstances that provoked this bug +are: +
        +
      • The bug could only occur in Btrees with 4 or more levels, which + typically means a single Database must have roughly one million records + or more. +
      • +
      • The bug is more likely to occur with insertion heavy workloads. +
      • +
      • The bug has existed in all earlier versions of JE, but is more likely + to occur in JE 6.2 and later. +
      • +
      +The bug does not cause a permanent data corruption, if upgrading to JE 6.4.14 +is possible. In other words, if the problem occurs in an earlier version, +upgrading to 6.4.14 or later will allow the Environment to be opened. +
      +Example exception:
      +
      +Exception in thread "main" com.sleepycat.je.EnvironmentFailureException:
      +(JE 6.4.9) ... last LSN=0x20c7b6/0xa986dc LOG_INTEGRITY: Log information is
      +incorrect, problem is likely persistent. Environment is invalid and must be
      +closed.
      +        at com.sleepycat.je.recovery.RecoveryManager.traceAndThrowException(
      +            RecoveryManager.java:3176)
      +        at com.sleepycat.je.recovery.RecoveryManager.readINs(
      +            RecoveryManager.java:1039)
      +        at com.sleepycat.je.recovery.RecoveryManager.buildINs(
      +            RecoveryManager.java:842)
      +        at com.sleepycat.je.recovery.RecoveryManager.buildTree(
      +            RecoveryManager.java:757)
      +        at com.sleepycat.je.recovery.RecoveryManager.recover(
      +            RecoveryManager.java:387)
      +        at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(
      +            EnvironmentImpl.java:717)
      +        at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(
      +            DbEnvPool.java:254)
      +        at com.sleepycat.je.Environment.makeEnvironmentImpl(
      +            Environment.java:287)
      +        at com.sleepycat.je.Environment.(Environment.java:268)
      +        at com.sleepycat.je.Environment.(Environment.java:212)
      +        at com.sleepycat.je.util.DbDump.openEnv(DbDump.java:422)
      +        at com.sleepycat.je.util.DbDump.listDbs(DbDump.java:316)
      +        at com.sleepycat.je.util.DbDump.main(DbDump.java:296)
      +Caused by: com.sleepycat.je.EnvironmentFailureException:
      +(JE 6.4.9) ... fetchIN of 0x20c756/0x4e81bd parent IN=2785507 IN
      +class=com.sleepycat.je.tree.IN lastFullLsn=0x20c7af/0xc81b2d
      +lastLoggedLsn=0x20c7af/0xc81b2d parent.getDirty()=true state=0
      +LOG_FILE_NOT_FOUND: Log file missing, log is likely invalid. Environment is
      +invalid and must be closed.
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:2523)
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:2293)
      +        at com.sleepycat.je.tree.Tree.getParentINForChildIN(Tree.java:1418)
      +        at com.sleepycat.je.recovery.RecoveryManager.recoverChildIN(
      +            RecoveryManager.java:1338)
      +        at com.sleepycat.je.recovery.RecoveryManager.recoverIN(
      +            RecoveryManager.java:1166)
      +        at com.sleepycat.je.recovery.RecoveryManager.replayOneIN(
      +            RecoveryManager.java:1130)
      +        at com.sleepycat.je.recovery.RecoveryManager.readINs(
      +            RecoveryManager.java:1021)
      +        ... 11 more
      +Caused by: java.io.FileNotFoundException: .../0020c756.jdb (No such file or directory)
      +        at java.io.RandomAccessFile.open(Native Method)
      +        at java.io.RandomAccessFile.(RandomAccessFile.java:241)
      +        at java.io.RandomAccessFile.(RandomAccessFile.java:122)
      +        at com.sleepycat.je.log.FileManager$DefaultRandomAccessFile.(
      +            FileManager.java:3226)
      +        at com.sleepycat.je.log.FileManager$6.createFile(
      +            FileManager.java:3254)
      +        at com.sleepycat.je.log.FileManager.openFileHandle(
      +            FileManager.java:1333)
      +        at com.sleepycat.je.log.FileManager.getFileHandle(
      +            FileManager.java:1204)
      +        at com.sleepycat.je.log.LogManager.getLogSource(LogManager.java:1136)
      +        at com.sleepycat.je.log.LogManager.getLogEntry(
      +            LogManager.java:823)
      +        at com.sleepycat.je.log.LogManager.getLogEntryAllowInvisibleAtRecovery(
      +            LogManager.java:788)
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:2345)
      +        ... 17 more
      +
      +Thanks to Alexander Kharichev for reproducing this bug and capturing the data +files that allowed us to find the problem. This took many months of +persistence, and special instrumentation for using with the CLEANER_EXPUNGE +option in a production environment. +

      +[#24663] (6.4.14) +


    14. + +
    15. +Fixed a bug that caused PreloadStats.getNEmbeddedLNs to return zero when using +PreloadConfig.setLoadLNs(false). getNEmbeddedLNs now returns the number of +embedded LNs loaded into cache, irrespective of the setLoadLNs setting. +

      +[#24688] (6.4.15) +


    16. + +
    17. +Fixed a performance problem related to the off-heap cache. Previously, when the +off-heap cache overflowed, BINs (bottom internal nodes) were evicted before +evicting LNs (records or leaf nodes), when the LNs were in dirty BINs. The +effect was that more read I/O was required to fetch the INs when they were +needed. In general, disregarding the LRU, BINs should be kept in cache in +preference to LNs, and the fix corrects the implementation of that policy. +

      +In addition, a change was made to allow off-heap LNs to be evicted sooner, to +to delay eviction of off-heap BINs (or their mutation to BIN-deltas). +Previously, when a BIN was evicted from main cache and moved off-heap, its +off-heap LNs were made "hot" in the off-heap cache. This no longer occurs. +

      +[#24717] (6.4.25) +


    18. + +
    + + +
    +

    Changes in 6.4.9

    + +
      + +
    1. +Fixed a bug that (rarely) caused an exception such as the following, during +shutdown of a ReplicatedEnvironment. This caused no persistent damage, but the +unexpected runtime exception could cause exception handling problems or at +least confusion. +
      +com.sleepycat.je.EnvironmentFailureException.unexpectedException(
      +    EnvironmentFailureException.java:351)
      +    at com.sleepycat.je.log.LogManager.serialLog(LogManager.java:496)
      +    at com.sleepycat.je.log.LogManager.logItem(LogManager.java:438)
      +    at com.sleepycat.je.log.LogManager.log(LogManager.java:350)
      +    at com.sleepycat.je.tree.LN.logInternal(LN.java:752)
      +    at com.sleepycat.je.tree.LN.optionalLog(LN.java:473)
      +    at com.sleepycat.je.dbi.CursorImpl.updateRecordInternal(
      +        CursorImpl.java:1689)
      +    at com.sleepycat.je.dbi.CursorImpl.insertOrUpdateRecord(
      +        CursorImpl.java:1321)
      +    at com.sleepycat.je.Cursor.putNoNotify(Cursor.java:2509)
      +    at com.sleepycat.je.Cursor.putNotify(Cursor.java:2370)
      +    at com.sleepycat.je.Cursor.putForReplay(Cursor.java:2038)
      +    at com.sleepycat.je.DbInternal.putForReplay(DbInternal.java:186)
      +    at com.sleepycat.je.rep.impl.node.Replay.applyLN(Replay.java:1012)
      +    ... 2 more
      +Caused by: java.lang.NullPointerException
      +    at com.sleepycat.je.rep.vlsn.VLSNIndex.decrement(VLSNIndex.java:526)
      +    at com.sleepycat.je.rep.impl.RepImpl.decrementVLSN(RepImpl.java:840)
      +    at com.sleepycat.je.log.LogManager.serialLogWork(LogManager.java:710)
      +    at com.sleepycat.je.log.LogManager.serialLog(LogManager.java:481)
      +    ... 13 more
      +
      +[#24281] (6.4.0) +

    2. + +
    3. +Fixed a recovery (startup) performance problem that occurred when extremely +large numbers of .jdb files were present. For large data sets, the default file +size (10 MB) results in large numbers of files. A directory listing of these +files was performed by JE when reading the log sequentially during recovery, +and this noticeably slowed down recovery. With this fix, recovery no longer +performs a directory listing. +

      +However, other utilities that read the entire log (e.g., DbPrintLog) must +perform a directory listing to skip over gaps in the sequence of files numbers +caused by log file deletion (cleaning). Therefore, when a large data set is +expected or possible, the file size (EnvironmentConfig.LOG_FILE_MAX) should be +configured to a larger size. A file size of one GB is recommended for large +data sets. +

      +[#24332] (6.4.0) +


    4. + +
    5. +Fixed a transient problem for HA applications that resulted in an exception +such as the following. This occurred when quorum was temporarily lost. The fix +will prevent this exception from occurring. Note that even when the problem +occurred, the node automatically recovered quorum, so the problem was not +persistent. +
      +com.sleepycat.je.EnvironmentFailureException: (JE 6.3.7) Problem in
      +ReadWindow.fill, reading from = 0 UNEXPECTED_EXCEPTION: Unexpected internal
      +Exception, may have side effects. MasterFeederSource fetching vlsn=5,096,275
      +waitTime=1000 Uncaught exception in feeder thread:Thread[Feeder Output for
      +rg1-rn5,5,main] Originally thrown by HA thread: MASTER rg1-rn1(1)
      +    at com.sleepycat.je.EnvironmentFailureException.unexpectedException(
      +        EnvironmentFailureException.java:366)
      +    at com.sleepycat.je.rep.stream.FeederReader$SwitchWindow.fillNext(
      +        FeederReader.java:572)
      +    at com.sleepycat.je.log.FileReader.readData(FileReader.java:822)
      +    at com.sleepycat.je.log.FileReader.readNextEntryAllowExceptions(
      +        FileReader.java:379)
      +    at com.sleepycat.je.log.FileReader.readNextEntry(FileReader.java:276)
      +    at com.sleepycat.je.rep.stream.FeederReader.scanForwards(
      +        FeederReader.java:308)
      +    at com.sleepycat.je.rep.stream.MasterFeederSource.getWireRecord(
      +        MasterFeederSource.java:100)
      +    at com.sleepycat.je.rep.impl.node.Feeder$OutputThread.writeAvailableEntries(
      +        Feeder.java:1219)
      +    at com.sleepycat.je.rep.impl.node.Feeder$OutputThread.run(Feeder.java:1109)
      +Caused by: java.io.FileNotFoundException:
      +/scratch/suitao/dctesting/kvroot/mystore/sn3/rg1-rn1/env/00000000.jdb (No such
      +file or directory)
      +    at java.io.RandomAccessFile.open(Native Method)
      +    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:241)
      +    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:122)
      +    at com.sleepycat.je.log.FileManager$DefaultRandomAccessFile.<init>(
      +        FileManager.java:3201)
      +    at com.sleepycat.je.log.FileManager$6.createFile(FileManager.java:3229)
      +    at com.sleepycat.je.log.FileManager.openFileHandle(FileManager.java:1308)
      +    at com.sleepycat.je.log.FileManager.getFileHandle(FileManager.java:1179)
      +    at com.sleepycat.je.rep.stream.FeederReader$SwitchWindow.fillNext(
      +        FeederReader.java:511)
      +    ... 7 more
      +
      +[#24299] (6.4.0) +

    6. + +
    7. +Added an off-heap cache capability. An off-heap cache can be used to utilize +large memories more efficiently than when using the same memory for the file +system cache, while avoiding the Java GC overheap associated with large Java +heaps. See the EnvironmentMutableConfig.setOffHeapCacheSize javadoc for +information on how to enable the cache and its impact on performance. +

      +Please be aware of the following limitations in the initial release of this +feature: +

        +
      • + The off-heap cache is not currently used for deferred-write and + temporary databases, i.e., databases created using + DatabaseConfig.setTemporary(true) or setDeferredWrite(true). For such + databases, only the main (in-heap) cache is used. +
      • +
      • + As described in the EnvironmentMutableConfig.setOffHeapCacheSize + javadoc, the off-heap cache only works when Unsafe.allocateMemory is + available in the JDK used to run the JE application. The Oracle JDK is + compatible. +
      • +
      • + When testing the off-heap cache on the IBM JDK, using Linux, we + noticed that the per-memory block overhead is much higher than when + using the Oracle JDK. We observed an extra 70 byte overhead per block + that is allocated by Unsafe.allocateMemory. This overhead is not + currently accounted for in our initial version of the off-heap + allocator, so users of the IBM JDK should expect that more off-heap + memory will be used than what DbCacheSize calculates and more than + what the EnvironmentStats.getOffHeapTotalBytes method reports. We + would like to solitic input on this issue from our users who are + familiar with the internals of the IBM JDK. +
      • +
      • + The Getting Started Guide does does not yet contain information about + the off-heap cache. Please refer to the javadoc. +
      • +
      +

      +The following additional API additions are associated with the off-heap cache. +

        +
      • + EnvironmentMutableConfig.setOffHeapCacheSize + (EnvironmentConfig.MAX_OFF_HEAP_MEMORY). This is the only configuration + parameter that must be set to use the off-heap cache. See the + setOffHeapCacheSize javadoc for details on the purpose and function of the + off-heap cache. +
      • +
      • + EnvironmentConfig.OFFHEAP_N_LRU_LISTS. Allows reducing contention among + threads performing eviction, with the cost of reduced LRU accuracy. +
      • +
      • + EnvironmentConfig.OFFHEAP_CORE_THREADS, OFFHEAP_MAX_THREADS, + OFFHEAP_KEEP_ALIVE. Used to configure the thread pool for the off-heap + evictor. +
      • +
      • + EnvironmentConfig.ENV_RUN_OFFHEAP_EVICTOR. Used to disable the off-heap + evictor thread for applications calling Environment.evictMemory + explicitly. +
      • +
      • + EnvironmentConfig.OFFHEAP_EVICT_BYTES. Determines the size of an + eviction batch. +
      • +
      • + EnvironmentConfig.OFFHEAP_CHECKSUM. Can be used for debugging. +
      • +
      • + EnvironmentStats.getOffHeap*. These 20 new getter methods allow getting + off-heap cache statistics. +
      • +
      +

      +[#23889] (6.4.1) +


    8. + +
    9. +Several improvements were made to DiskOrderedCursor performance and behavior. +These improvements also apply to Database.count, which uses the same internal +scanning mechanism as DiskOrderedCursor. +
        +
      • + DiskOrderedCursor now no longer accumulates LSNs for data that is resident + in the JE cache. Before, data resident in cache would sometimes be fetched + from disk to avoid filling the output queue for the scan. This is no + longer the case, and this has two important benefits: +
          +
        1. The semantics of a DiskOrderedCursor scan are now roughly the + same as when using LockMode.READ_UNCOMMITTED. There is no longer a + potential lag back to the last checkpoint. See the updated + Consistency Guarantees section in the DiskOrderedCursor javadoc + for details.
        2. +
        3. Less read IO is performed in some cases.
        4. +
        + [#24226] +
      • +
      • + To prevent applications from having to reserve memory in the Java heap for + the DiskOrderedCursor, memory used by the DiskOrderedCursor is now + subtracted from the JE cache budget. The maximum amount of such memory is + specified, as before, using + DiskOrderedCursorConfig.setInternalMemoryLimit. This is a behavior change + and may require some applications to increase the JE cache size. + [#24291] +
      • +
      • + DiskOrderedCursor can now scan multiple databases using the new + Environment.openDiskOrderedCursor method. When scanning multiple databases + this method will provide better performance than scanning each database + separately. + [#24171] +
      • +
      • + DiskOrderedCursor scans now uses shared latches on upper INs, instead of + exclussive latches. This reduces contention between the DiskOrderedCursor + scan and other Btree operations, such as CRUD operations. + [#24192] +
      • +
      • + Whenever possible, DiskOrderedCursor no longer makes copies of BIN-deltas + found in the cache. This results in less memory useage (and consequently + less read IO). + [#24270] +
      • +
      +(6.4.2) +

    10. + +
    11. +Made improvements to the debug logging entries created to provide +information about log files that were protected from deletion. +

      +

        +
      • Modified entries created by the cleaner to identify which log + files were protected from deletion +
      • Modified entries created for replicated environments to provide + information about the reason files were protected from deletion +
      • Changed the logging level for these entries to INFO + to emphasize that the protection of files from deletion is expected + behavior +
      +

      +[#24241] (6.4.2) +


    12. + +
    13. +Fixed a bug where a Btree latch was not released when an Error was thrown by a +file read, during a secondary DB lookup. This could cause an +EnvironmentFailureException with the error message "Latch already held" at a +later time in the same thread, or a latch deadlock in another thread. +[#24375] (6.4.3) +

    14. + +
    15. +Fixed a bug in Database.count that caused it to loop "forever" with a large +out-of-cache data set. This also impacted Environment.truncateDatabase when +'true' was passed for the 'returnCount' param, since this causes +Database.count to be called. +[#24448] (6.4.7) +

    16. + +
    17. +Fixed a bug that could cause incomplete results to be returned from a query +using secondary indexes, when this query is performed on a replica and record +deletions are being performed on the master (and being replayed on the +replica). It could also cause LockConflictException to be thrown by the query +on the replica in this situation, even when the application's operation order +(locking order) should not cause a deadlock. +[#24507] (6.4.8) +

    18. + +
    + + +
    +

    Changes in 6.3.8

    + +
      + +
    1. +Added EnvironmentStats.getNDirtyNodesEvicted and the corresponding statistic +in the jestat.csv file. This can be used to determine how much logging and its +associated costs (cleaning, etc) are being caused by eviction when the cache +overflows. +[#24086] (6.3.0) +

    2. + +
    3. +Fixed a bug that resulted in an EnvironmentFailureException being +thrown from the method Environment.beginTransaction(), when a +replicated environment was closed at a master while new transactions were being +concurrently initiated. The following representative stack trace is symptomatic +of this problem (the specifics of the stack trace may vary depending on the JE +release): +
      +        ...
      +	at com.sleepycat.je.EnvironmentFailureException.unexpectedException(EnvironmentFailureException.java:351)
      +	at com.sleepycat.je.rep.utilint.RepUtils$ExceptionAwareCountDownLatch.awaitOrException(RepUtils.java:268)
      +	at com.sleepycat.je.rep.utilint.SizeAwaitMap.sizeAwait(SizeAwaitMap.java:106)
      +	at com.sleepycat.je.rep.impl.node.FeederManager.awaitFeederReplicaConnections(FeederManager.java:528)
      +	at com.sleepycat.je.rep.impl.node.DurabilityQuorum.ensureReplicasForCommit(DurabilityQuorum.java:74)
      +	at com.sleepycat.je.rep.impl.RepImpl.txnBeginHook(RepImpl.java:944)
      +	at com.sleepycat.je.rep.txn.MasterTxn.txnBeginHook(MasterTxn.java:158)
      +	at com.sleepycat.je.txn.Txn.initTxn(Txn.java:365)
      +	at com.sleepycat.je.txn.Txn.<init>(Txn.java:275)
      +	at com.sleepycat.je.txn.Txn.<init>(Txn.java:254)
      +	at com.sleepycat.je.rep.txn.MasterTxn.<init>(MasterTxn.java:114)
      +	at com.sleepycat.je.rep.txn.MasterTxn$1.create(MasterTxn.java:102)
      +	at com.sleepycat.je.rep.txn.MasterTxn.create(MasterTxn.java:380)
      +	at com.sleepycat.je.rep.impl.RepImpl.createRepUserTxn(RepImpl.java:924)
      +	at com.sleepycat.je.txn.Txn.createUserTxn(Txn.java:301)
      +	at com.sleepycat.je.txn.TxnManager.txnBegin(TxnManager.java:182)
      +	at com.sleepycat.je.dbi.EnvironmentImpl.txnBegin(EnvironmentImpl.java:2366)
      +	at com.sleepycat.je.Environment.beginTransactionInternal(Environment.java:1437)
      +	at com.sleepycat.je.Environment.beginTransaction(Environment.java:1319)
      +        ...
      +Caused by: java.lang.IllegalStateException: FeederManager shutdown
      +	at com.sleepycat.je.rep.impl.node.FeederManager.shutdownFeeders(FeederManager.java:498)
      +	at com.sleepycat.je.rep.impl.node.FeederManager.runFeeders(FeederManager.java:462)
      +	at com.sleepycat.je.rep.impl.node.RepNode.run(RepNode.java:1479)
      +
      +[#23970] (6.3.0) +

    4. + +
    5. +Fixed a bug that could cause a LOG_FILE_NOT_FOUND (log corruption) for +workloads where eviction is heavy and databases are often opened and closed. +[#24111] (6.3.0) +

    6. + +
    7. +Improved performance for "small" data records by embedding "small" LNs in BINs. +

      +Normally, records (key-value pairs) are stored on disk as individual byte +sequences called LNs (leaf nodes) and they are accessed via a Btree. +Specifically, the bottom layer nodes of the Btree (called BINs) contain +an array of slots, where each slot represents an associated data record. +Among other things, it stores the key of the record and the most recent +disk address of that record. Records and BTree nodes share the disk space +(are stored in the same kind of files), but LNs are stored separately from +BINs, i.e., there is no clustering or co-location of a BIN and its child LNs. +

      +With embedded LNs, a whole record may be stored inside a BIN (i.e., a BIN +slot may contain both the key and the data portion of a record). A record +will be "embedded" if the size (in bytes) of its data portion is less than +or equal to the value of the new EnvironmentConfig.TREE_MAX_EMBEDDED_LN +configuration parameter. The decision to embed a record or not is taken on a +record-by-record basis. As a result, a BIN may contain both embedded and +non-embedded records. The "embeddedness" of a record is a dynamic property: a +size-changing update may turn a non-embedded record to an embedded one or +vice-versa. +

      +The performance trade-offs of embedding or not embedding records are +described in the javadoc for the TREE_MAX_EMBEDDED_LN configuration parameter. +

      +To exploit embedded LNs during disk ordered scans, a new "binsOnly" mode +has been added in DiskOrderedCursorConfig. In this mode, only the BINs of +a database will be accessed (not the LNs). As a result, the scan will be +faster, but the data portion of a record will be returned only if the +record is embedded. This is most useful when we expect that all the records +in a database will be embedded. +

      +Finally, a new statistic has been added to the PreloadStats class. It is +the number of embedded LNs encountered during the preload() operation, +and is accessible via the getNEmbeddedLNs() method. +

      +[#21488] (6.3.0) +


    8. + +
    9. +Two more changes were done as side-effects of the embedded LNs work described +above. +

      +First, we clarified the documented definition of partial comparators, although +the actual behavior of partial comparators did not change. The documentation +change is subtle and will only be interesting to those currently using the +PartialComparator interface. See the PartialComparator javadoc for details. +

      +The second change is a fix for a bug that could occur only if a +PartialComparator was used (and as a result record keys were updatable). In +this case and under some rare situations, updates done on keys could be lost. +

      +[#21488] (6.3.0) +


    10. + +
    11. +Cleaner utilization adjustments are no longer needed, and the following related +APIs have been deprecated and will be removed completely in a future release. +In addition, cleaner probes are no longer performed, since they were used only +for utilization adjustments. +
        +
      • EnvironmentConfig.CLEANER_ADJUST_UTILIZATION
      • +
      • EnvironmentStats.getLNSizeCorrectionFactor
      • +
      • EnvironmentStats.getNCleanerProbeRuns
      • +
      +In JE 6.0 the default value for CLEANER_ADJUST_UTILIZATION was changed to +false, because the LN sizes it was adjusting were stored in the Btree in that +release. Now in JE 6.3, setting CLEANER_ADJUST_UTILIZATION has no effect and +the two stat getter methods always return zero. +

      +[#24090] (6.3.0) +


    12. + +
    13. +Added statistics that provide information about replication. +
        +
      • ReplicatedEnvironmentStats.getLastCommitTimestamp
      • +
      • ReplicatedEnvironmentStats.getLastCommitVLSN
      • +
      • ReplicatedEnvironmentStats.getReplicaDelayMap
      • +
      • ReplicatedEnvironmentStats.getReplicaLastCommitTimestampMap
      • +
      • ReplicatedEnvironmentStats.getReplicaLastCommitVLSNMap
      • +
      • ReplicatedEnvironmentStats.getReplicaVLSNLagMap
      • +
      • ReplicatedEnvironmentStats.getReplicaVLSNRateMap
      • +
      • ReplicatedEnvironmentStats.getVLSNRate
      • +
      +[#23896] (6.3.0) +

    14. + +
    15. +Made several improvements to CacheMode behavior and CacheMode javadoc, and +deprecated two CacheModes. +

      +

        +
      • + The behavior of CacheMode.EVICT_BIN has changed. Previously, the BIN + was evicted even when it was dirty. This means the BIN was logged if it + was evicted by a write operation using this mode, or if it was dirty + due to a previous write operation using any mode. Now, a dirty BIN will + not be evicted by this mode, but in this case all LNs in the BIN will + be evicted. This mode was changed in order to prevent BINs from being + logged repeatedly due to the use of this mode. Logging should be + deferred for as long as possible (ideally until the next checkpoint) in + order to reduce writing costs and associated log cleaning costs. +

        +

      • +
      • + The behavior of CacheMode.UNCHANGED has also changed. We expect the + UNCHANGED mode to be important for many applications, since it allows + performing a full Database scan without displacing hot data in the + cache. Previously, when a Btree node (LN or BIN) was loaded into cache + by an operation with this cache mode, it was left in cache. This means + that the cache was perturbed by operations using this mode, which is + contrary to the intent of the mode. Even worse such nodes were made + "hot" by the operation meaning that they would not be evicted soon. + Now, when the node is loaded into cache by an operation with this cache + mode, it is evicted from cache after the operation. An exception to + this rule is that a dirty BIN will not be evicted and logged, for the + same reasons stated above. +

        +

      • +
      • + Non-sticky cursors (see CursorConfig.setNonSticky) now work with all + cache modes. Previously, CacheMode.EVICT_BIN and MAKE_COLD were + incompatible with non-sticky cursors, because the implementation of BIN + eviction was problematic with non-sticky cursors. This problem has been + solved and these incompatibilities were removed, primarily so that + CacheMode.UNCHANGED (which may also evict BINs) will work with + non-sticky cursors. +

        +

      • +
      • + CacheMode.KEEP_HOT has been deprecated. In this release, its behavior + is unchanged. In the next release it will behave as if + CacheMode.DEFAULT were specified. The reasons for deprecating this mode + are: +

        + 1. The only potential benefit of KEEP_HOT, as compared to DEFAULT, is + that KEEP_HOT attempts to keep the record's leaf-node (LN) and its + containing bottom internal node (BIN) in cache even if it is not + accessed frequently. We don't know of a use case for this behavior. +

        + 2. There are currently implementation problems with KEEP_HOT. The + current implementation of the cache evictor is based on an LRU list, + and there is no practical way to keep all BINs accessed with KEEP_HOT + at the hot end of the LRU list. The current implementation moves it to + the hot end when it reaches the cold end (as other BINs are accessed + and moved to the hot end), if the BIN has not been accessed since it + was made "keep hot". But if the BIN again moves to the cold end, it is + evicted to try to prevent the cache from overflowing when KEEP_HOT is + used for many operations. This approach does not really guarantee that + the cache won't overflow, and also does not really force the node to + stay hot. +

        +

      • +
      • + CacheMode.MAKE_COLD has been deprecated. In this release, its behavior + is unchanged. In the next release it will behave as if + CacheMode.UNCHANGED were specified. The reasons for deprecating this + mode are: +

        + 1. MAKE_COLD was originally added in an attempt to avoid perturbing the + cache for full Database scans, etc. The UNCHANGED mode should really be + used for this purpose, especially given the improvements made to this + mode (discussed above). +

        + 2. The main difference between MAKE_COLD and the new behavior of + UNCHANGED is that MAKE_COLD always evicts the LN and BIN, regardless of + whether they have been made "hot" by other operations. Again, we don't + know of a use case for this behavior. +

        +

      • +
      • + The javadoc for the CacheMode enumeration has been reworked to reflect + the behavior changes described above. More information has also been + added about the eviction process and the behavior and intended use of + each cache mode. +

        +

      • +
      +[#24154] (6.3.2) +

    16. + +
    17. +DbBackup.startBackup has been enhanced to make the use of the +EnvironmentConfig.ENV_RECOVERY_FORCE_NEW_FILE unnecessary, except in special +cases. See the "Restoring from a backup" section in the DbBackup javadoc for +more information. [#22865] (6.3.4) +

    18. + +
    19. +The Environment.cleanLogFile method has been added to allow cleaning a single +file at a time. This is in contrast to Environment.cleanLog, which may clean a +large number of files over a long time period. See the javadoc for cleanLog and +cleanLogFile for details on the intended use cases and other information. +

      Also, the javadoc for Environment.close now talks about performing an extra +checkpoint prior to calling close and disabling the cleaner threads. This is +related to the "batch cleaning" process described in the cleanLogFile javadoc. +

      +[#24181] (6.3.4) +


    20. + +
    21. +Fixed a bug that can cause data log corruption, resulting in a failure +in DbVerifyLog or during recovery under certain circumstances. The bug could +occur when multiple threads are performing write operations concurrently. The +corruption could go unnoticed unless DbVerifyLog is run, or the corrupt portion +of the log happens to be processed by recovery. The latter is unlikely but +possible. An example of the DbVerifyLog failure is below. +
      +Caused by: com.sleepycat.je.util.LogVerificationException: Log is invalid,
      +fileName: 00038369.jdb fileNumber: 0x38369 logEntryOffset: 0x84
      +verifyState: INVALID reason: Header prevOffset=0x26 but prevEntryStart=0x45
      +
      +[#24211] (6.3.4) +

    22. + +
    23. +Fixed a bug that caused the following exception when setting the replication +helper host/port parameter to an empty string. +
      +Caused by: java.lang.IllegalArgumentException: Host and port pair was missing
      +    at com.sleepycat.je.rep.utilint.HostPortPair.getSocket(HostPortPair.java:29)
      +    at com.sleepycat.je.rep.utilint.HostPortPair.getSockets(HostPortPair.java:56)
      +    at com.sleepycat.je.rep.impl.RepImpl.getHelperSockets(RepImpl.java:1499)
      +    at com.sleepycat.je.rep.impl.node.RepNode.findMaster(RepNode.java:1214)
      +    at com.sleepycat.je.rep.impl.node.RepNode.startup(RepNode.java:787)
      +    at com.sleepycat.je.rep.impl.node.RepNode.joinGroup(RepNode.java:1988)
      +    at com.sleepycat.je.rep.impl.RepImpl.joinGroup(RepImpl.java:523)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.joinGroup(ReplicatedEnvironment.java:525)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.(ReplicatedEnvironment.java:587)
      +... 
      +
      +When an empty string is specified for the helper host/port, the parameter is +not used by JE. +[#24234] (6.3.6) +

    24. + +
    25. +Fixed DPL bytecode enhancer so it works with Java 8-compiled classes. The DPL +was working earlier with Java 8 in the sense that our Java 7-compiled libraries +could be used from a Java 8 app. But the bytecode enhancer was failing when +used to enhance a Java 8-compiled class. This was fixed by upgrading to ASM +5.0.3, which supports Java 8 bytecode. +[#24225] (6.3.6) +

    26. + +
    + + +
    +

    Changes in 6.2.7

    + +
      + +
    1. +A cursor may now be optionally configured to be "non-sticky". This has certain +performance advantages: +
        +
      • + Some processing is avoided because the prior position is not maintained. +
      • +
      • + The lock on the record at the prior position is released before acquiring + the lock on the record at the new position. This can help to prevent + deadlocks in certain situations. +
      • +
      +For more information, see the javadoc for CursorConfig.setNonSticky. +

      +[#23775] (6.2.0) +


    2. + +
    3. +Further exploitation of BIN-deltas for CRUD operations. +

      +For backgroud and previous work in this area, see the changelog for the 6.1 +release. In this release we have extended the set of CRUD operations that +are performed in BIN-deltas, without the need to mutate them to full BINs +(and thus saving the disk reads that would be required to fetch the full +BINs in memory). Specifically, the following additional operations can now +exploit BIN-deltas: +

      +Insertions and updates, when no tree node splits are required and the +key of the record to be inserted/updated is found in a BIN-delta. +

      +Blind operations: we say that a record operation (insertion, update, or +deletion) is performed "blindly" in a BIN-delta, when the delta does not +contain a slot with the operation's key and we don't need to access the +full BIN to check whether such a slot exists there or to extract any +information from the full-BIN slot, if it exists. The condition that no +tree node splits are required applies to blind operations as well. The +following operations can be performed blindly: +- Replay of insertions at replica nodes. +- Insertions during recovery redo. +- Updates and deletes during recovery redo, for databases with duplicates. +

      +A new statistic has been added to count the number blind operations performed, +including the blind put operations described below. This count can be obtained +via the EnvironmentStats.getNBINDeltaBlindOps() method. +

      +[#23680] (6.2.0) +


    4. + +
    5. +Blind put operations in BIN-deltas. +

      +Normally, blind puts are not possible: we need to know whether the put is +actually an update or an insertion, i.e., whether the key exists in the full +BIN or not. Furthermore, in case of update we also need to know the location +of the previous record version to make the current update abortable. However, +it is possible to answer at least the key existence question by adding a +small amount of extra information in the deltas. If we do so, puts that are +actual insertions can be done blindly. +

      +To answer whether a key exists in a full BIN or not, each BIN-delta stores +a bloom filter, which is a very compact, approximate representation of the +set of keys in the full BIN. Bloom filters can answer set membership questions +with no false negatives and very low probability of false positives. As a +result, put operations that are actual insertions can almost always be +performed blindly. +

      +To make possible the blind puts optimization in JE databases that use custom +BTree and/or duplicates comparators, these comparators must perform "binary +equality", that is, they must consider two keys (byte arrays) to be equal if +and only if they have the same length and they are equal byte-per-byte. To +communicate to the JE engine that a comparator does binary equality, the +comparator must implement the new BinaryEqualityComparator tag +interface. +

      +[#23768] (6.2.1) +


    6. + +
    7. +Added LockMode.READ_UNCOMMITTED_ALL. When using this mode, unlike +READ_UNCOMMITTED, deleted records will not be skipped by read operations when +the deleting transaction is still open (and may later abort, in which case the +record will no longer be deleted). See the LockMode javadoc for further +details. +

      +[#23660] (6.2.1) +


    8. + +
    9. +Added two optimizations for secondary DB read operations. +
        +
      • + For secondary DB read operations where the primary record data is not + requested (because DatabaseEntry.setPartial is called on the 'data' + parameter), a Btree lookup and record lock of the primary record are no + longer performed. This change does not impact the meaning of the isolation + mode used for such secondary reads, i.e., the semantics are correct without + acquiring a lock on the primary record. +
      • +
      • + For secondary DB read operations where the primary record data is + requested, one less record lock is now acquired. Previously, both the + primary and secondary records were locked. Now, only the primary record is + locked. This optimization does not apply to the serializable isolation + mode. The optimization applies only to the read-committed and + repeatable-read isolation modes, and does not impact the meaning of these + modes, i.e., the semantics are correct without acquiring a lock on the + secondary record. +
      • +
      +

      +[#23326] (6.2.2) +


    10. + +
    11. +Fixed a bug that could cause the following Collections API and DPL methods to +incorrectly return an empty result (no records). +
        +
      • + When using the DPL (com.sleepycat.persist) and calling EntityCursor.last() + when the cursor was created with an end point (toKey parameter). Also when + EntityCursor.prev() or prevNoDup() is called and the cursor is not + initialized, since this is equivalent to calling last(). +
      • +
      • + When using the Collections API (com.sleepycat.collections) and calling + SortedSet.last() or SortedMap.lastKey(). +
      • +
      +The problem occurs when searching for the last record in a key range, while +another thread is concurrently inserting records near the end of the key range. +An empty result is returned, regardless of the number of records in the key +range. +

      +[#23687] (6.2.2) +


    12. + +
    13. +Fixed bugs in the computation of the nINCompactKey and nINNoTarget stats +(EnvironmentStats.getNINCompactKeyIN and getNINNoTarget). Prior to the fixes, +these stats would sometimes have negative values. +[#23718] (6.2.3) +

    14. + +
    15. +Fixed a bug that caused a DB to become unusable when it is removed or truncated +(by calling Environment.removeDatabase or truncateDatabase) using a +read-committed transaction, and the transaction aborts (explicitly, or due to a +crash before commit). In this case the DB will not be accessible -- it cannot +be opened, truncated or removed. When attempting to open the DB, an exception +such as the following is thrown: +
      +Exception in thread "main" com.sleepycat.je.DatabaseNotFoundException: (JE 6.1.5) Attempted to remove non-existent database ...
      +at com.sleepycat.je.dbi.DbTree.lockNameLN(DbTree.java:869)
      +at com.sleepycat.je.dbi.DbTree.doRemoveDb(DbTree.java:1130)
      +at com.sleepycat.je.dbi.DbTree.dbRemove(DbTree.java:1183)
      +at com.sleepycat.je.Environment$1.runWork(Environment.java:947)
      +at com.sleepycat.je.Environment$DbNameOperation.runOnce(Environment.java:1172)
      +at com.sleepycat.je.Environment$DbNameOperation.run(Environment.java:1155)
      +at com.sleepycat.je.Environment.removeDatabase(Environment.java:941)
      +...
      +
      +A workaround for the problem in earlier releases is to avoid using +read-committed for a transaction used to perform a DB remove or truncate +operation. +

      +[#23821] (6.2.3) +


    16. + +
    17. +Fixed a bug that caused an exception during log cleaning, although it has been +observed very rarely. It could also potentially cause data corruption, but this +has never been reported or observed in tests. Examples of the exceptions that +have been observed are below. +
      +com.sleepycat.je.EnvironmentFailureException: Environment invalid because of
      +previous exception: (JE 6.1.0) ...
      +    at com.sleepycat.je.EnvironmentFailureException.unexpectedException(EnvironmentFailureException.java:315)
      +    at com.sleepycat.je.log.LogManager.serialLog(LogManager.java:477)
      +    at com.sleepycat.je.log.LogManager.logItems(LogManager.java:419)
      +    at com.sleepycat.je.log.LogManager.multiLog(LogManager.java:324)
      +    at com.sleepycat.je.log.LogManager.log(LogManager.java:272)
      +    at com.sleepycat.je.log.LogManager.log(LogManager.java:261)
      +    at com.sleepycat.je.log.LogManager.log(LogManager.java:223)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.rewriteMapTreeRoot(EnvironmentImpl.java:1285)
      +    at com.sleepycat.je.cleaner.FileProcessor.processFile(FileProcessor.java:701)
      +    at com.sleepycat.je.cleaner.FileProcessor.doClean(FileProcessor.java:274)
      +    at com.sleepycat.je.cleaner.FileProcessor.onWakeup(FileProcessor.java:137)
      +    at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:148)
      +    at java.lang.Thread.run(Thread.java:744)
      +Caused by: java.lang.ArrayIndexOutOfBoundsException: 111
      +    at com.sleepycat.util.PackedInteger.writeInt(PackedInteger.java:188)
      +    at com.sleepycat.je.log.LogUtils.writePackedInt(LogUtils.java:155)
      +    at com.sleepycat.je.cleaner.DbFileSummary.writeToLog(DbFileSummary.java:79)
      +    at com.sleepycat.je.dbi.DatabaseImpl.writeToLog(DatabaseImpl.java:2410)
      +    at com.sleepycat.je.dbi.DbTree.writeToLog(DbTree.java:2050)
      +    at com.sleepycat.je.log.entry.SingleItemEntry.writeEntry(SingleItemEntry.java:114)
      +    at com.sleepycat.je.log.LogManager.marshallIntoBuffer(LogManager.java:745)
      +    at com.sleepycat.je.log.LogManager.serialLogWork(LogManager.java:611)
      +    at com.sleepycat.je.log.LogManager.serialLog(LogManager.java:461)
      +    ... 11 more
      +
      +Another instance of the same problem with a slightly different stack trace is +below: +
      +java.nio.BufferOverflowException UNEXPECTED_EXCEPTION_FATAL: Unexpected
      +internal Exception, unable to continue. Environment is invalid and must be
      +closed.
      +    at com.sleepycat.je.EnvironmentFailureException.unexpectedException(EnvironmentFailureException.java:315)
      +    at com.sleepycat.je.log.LogManager.serialLog(LogManager.java:481)
      +    at com.sleepycat.je.log.LogManager.logItems(LogManager.java:423)
      +    at com.sleepycat.je.log.LogManager.multiLog(LogManager.java:325)
      +    at com.sleepycat.je.log.LogManager.log(LogManager.java:273)
      +    at com.sleepycat.je.tree.LN.logInternal(LN.java:600)
      +    at com.sleepycat.je.tree.LN.log(LN.java:411)
      +    at com.sleepycat.je.cleaner.FileProcessor.processFoundLN(FileProcessor.java:1070)
      +    at com.sleepycat.je.cleaner.FileProcessor.processLN(FileProcessor.java:884)
      +    at com.sleepycat.je.cleaner.FileProcessor.processFile(FileProcessor.java:673)
      +    at com.sleepycat.je.cleaner.FileProcessor.doClean(FileProcessor.java:278)
      +    at com.sleepycat.je.cleaner.FileProcessor.onWakeup(FileProcessor.java:137)
      +    at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:148)
      +Caused by: java.nio.BufferOverflowException
      +    at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:189)
      +    at java.nio.ByteBuffer.put(ByteBuffer.java:859)
      +    at com.sleepycat.je.log.LogUtils.writeBytesNoLength(LogUtils.java:350)
      +    at com.sleepycat.je.log.entry.LNLogEntry.writeBaseLNEntry(LNLogEntry.java:371)
      +    at com.sleepycat.je.log.entry.LNLogEntry.writeEntry(LNLogEntry.java:333)
      +    at com.sleepycat.je.log.entry.BaseReplicableEntry.writeEntry(BaseReplicableEntry.java:48)
      +    at com.sleepycat.je.log.entry.LNLogEntry.writeEntry(LNLogEntry.java:52)
      +    at com.sleepycat.je.log.LogManager.marshallIntoBuffer(LogManager.java:751)
      +    at com.sleepycat.je.log.LogManager.serialLogWork(LogManager.java:617)
      +    at com.sleepycat.je.log.LogManager.serialLog(LogManager.java:465)
      +
      +

      +[#23492] (6.2.3) +


    18. + +
    19. +Fixed a locking bug that causes a deadlock when no real deadlock exists. The +bug shows up with cursors using read-committed isolation. +

      +Here is the specific scenario: +

        +
      1. Cursor C1 in thread T1 reads a record R using Transaction X1. C1 + creates a ReadCommittedLocker L1, with X1 as its buddy. L1 locks R. +
      2. Cursor C2 in thread T2 tries to write-lock R, using another + Transaction X2. X2 waits for L1 (T2 waits for T1). +
      3. Cursor C3 in thread T1 tries to read R using X1. C3 creates a + ReadCommittedLocker L3, with X1 as its buddy. L3 tries to lock R. L1 and L3 + are not recognized as buddies, so L3 waits for X2 (T1 waits for T2) +
      +

      +[#23821] (6.2.4) +


    20. + +
    21. +The ant build (build.xml) has been updated so that the JUnit jar file is now +downloaded from Maven Central when needed for running tests with the 'test' +target. This jar is no longer needed for building a JE jar file with the 'jar' +target. See installation.html for an updated description of how to build JE and +run the unit tests. +[#23669] (6.2.7) +

    22. + +
    23. +Added EnvironmentConfig.CLEANER_USE_DELETED_DIR. This can be set to true when +trying to reproduce and analyze LOG_FILE_NOT_FOUND problems. See the javadoc +for details. More information was also added to the +EnvironmentConfig.CLEANER_EXPUNGE javadoc on the same topic. +[#23830] (6.2.8) +

    24. + +
    25. +Added debugging information when an internal latch deadlock occurs due to a bug +where a latch is not released. Note that latches are not user-visible entities +and are unrelated to record locking. Latches are used internally for thread +safety and only held for short durations. A latch deadlock is detected via a +timeout mechanism. An EnvironmentFailureException is thrown in the thread that +times out. Now, additionally a full thread dump is written to the je.info log +at logging level SEVERE. The thread dump can be used to find the deadlock. +

      +In addition, the EnvironmentConfig.ENV_LATCH_TIMEOUT parameter has been exposed +to provide control over the timeout interval for atypical applications. This +parameter has been present internally since latch timeouts were added in JE +6.0.3; however, the parameter was previously undocumented. +

      +[#23897] (6.2.9) +


    26. + +
    27. +Fixed two bugs having to do with lock conflicts. The two problems are distinct, +but both occurred while creating a LockConflictException due to a lock timeout. +
        +
      • + Fixed a bug that caused a ConcurrentModificationException when multiple + lock tables are configured (EnvironmentConfig.LOCK_N_LOCK_TABLES). The + exception was thrown when a lock conflict occurred along with particular + concurrent activity in another thread that holds a lock. The methods in + the stack trace when this problem occurs are: +
        +      ...
        +      LockManager.findDeadlock1
        +      LockManager.findDeadlock
        +      LockManager.makeTimeoutMsgInternal
        +      ...
        +      
        +
      • +
      • + Fixed a bug that caused a thread deadlock, eventually stopping all + threads accessing JE. This could happen when a lock conflict exception + occurred while attempting to lock a record with read-committed isolation, + and another thread (internal or external) also tried to lock the same + record. An example of the two threads involved in the deadlock is below. + Additional threads accessing JE methods are also likely to be blocked. +
        +      "THREAD-USING-READ-COMMITTED":
        +        at com.sleepycat.je.txn.Txn.setState(Txn.java:2039)
        +        - waiting to lock <0x000000078953b720> (a com.sleepycat.je.txn.Txn)
        +        at com.sleepycat.je.txn.Txn.setOnlyAbortable(Txn.java:1887)
        +        at com.sleepycat.je.txn.BuddyLocker.setOnlyAbortable(BuddyLocker.java:158)
        +        at com.sleepycat.je.OperationFailureException.(OperationFailureException.java:200)
        +        at com.sleepycat.je.LockConflictException.(LockConflictException.java:135)
        +        at com.sleepycat.je.LockTimeoutException.(LockTimeoutException.java:48)
        +        at com.sleepycat.je.txn.LockManager.newLockTimeoutException(LockManager.java:665)
        +        at com.sleepycat.je.txn.LockManager.makeTimeoutMsgInternal(LockManager.java:623)
        +        at com.sleepycat.je.txn.SyncedLockManager.makeTimeoutMsg(SyncedLockManager.java:97)
        +        - locked <0x000000079068eaa8> (a com.sleepycat.je.latch.Latch)
        +        at com.sleepycat.je.txn.LockManager.lockInternal(LockManager.java:390)
        +        at com.sleepycat.je.txn.LockManager.lock(LockManager.java:276)
        +        ...
        +      "ANOTHER-THREAD-LOCKING-THE-SAME-RECORD":
        +        at com.sleepycat.je.txn.SyncedLockManager.attemptLock(SyncedLockManager.java:73)
        +        - waiting to lock <0x000000079068eaa8> (a com.sleepycat.je.latch.Latch)
        +        at com.sleepycat.je.txn.LockManager.lockInternal(LockManager.java:292)
        +        at com.sleepycat.je.txn.LockManager.lock(LockManager.java:276)
        +        - locked <0x000000078953b720> (a com.sleepycat.je.txn.Txn)
        +        ...
        +      
        +
      • +
      +[#23894] (6.2.10) +

    28. + +
    29. +Fixed a bug that could cause the following exception when calling Cursor.count, +skipNext or skipPrev. The bug is likely to occur only when BINs (bottom +internal nodes of the Btree) are frequently being evicted. Although the +Environment is invalidated by this exception and must be closed, the problem is +transient -- the Environment can be re-opened and no data loss or corruption +will have occurred. +
      +(JE 6.2.6) ... Latch not held: BIN17923 currentThread: ...  currentTime: ...
      +exclusiveOwner: -none- UNEXPECTED_STATE_FATAL: Unexpected internal state,
      +unable to continue. Environment is invalid and must be closed.
      +at com.sleepycat.je.EnvironmentFailureException.unexpectedState(EnvironmentFailureException.java:405)
      +at com.sleepycat.je.latch.LatchImpl.release(LatchImpl.java:109)
      +at com.sleepycat.je.tree.IN.releaseLatch(IN.java:519)
      +at com.sleepycat.je.dbi.CursorImpl.skipInternal(CursorImpl.java:2737)
      +at com.sleepycat.je.dbi.CursorImpl.skip(CursorImpl.java:2612)
      +at com.sleepycat.je.Cursor.countHandleDups(Cursor.java:4055)
      +at com.sleepycat.je.Cursor.countInternal(Cursor.java:4028)
      +at com.sleepycat.je.Cursor.count(Cursor.java:1804) at
      +...
      +
      +The last line above is a call to Cursor.count. The same problem could happen if +Cursor.skipNext or skipPrev is called, and only the last few lines of the stack +trace above would be different. +

      +[#23872] (6.2.25) +


    30. + +
    31. +The HA Feeder output threads now batch network writes whenever possible to +reduce the resource overheads associated with transmitting small network +packets. These changes enhance replication performance; improvements in the +range of 5% have been observed for write intensive workloads. +

      +[#23274] (6.2.25) +


    32. + +
    33. +Added new statistics to count the number of user (non-internal) CRUD operations +that are performed entirely on BIN deltas. +

      +[#23883] (6.2.25) +


    34. + +
    35. +Fixed a bug where no exception was thrown when using ReplicaAckPolicy.ALL and +performing a write transaction in a two node replication group, and the replica +node was down/unresponsive. InsufficientAcksException is now thrown in this +situation, as specified in the documentation. +[#23934] (6.2.26) +

    36. + +
    37. +Fixed a bug in the internal SortedLSNTreeWalker class, which is used to +implement the Database.preload() and Environment.preload() methods. When these +methods are called, the bug can lead to the creation of a corrupted BTree, and +as a result, subsequent loss of data. The bug was introduced in JE 6.0. +

      +[#23952] (6.2.27) +


    38. + +
    39. +Added EntityIndex.getDatabase. +[#23971] (6.2.27) +

    40. + +
    41. +Fixed a bug where an assertion incorrectly fired during CRUD operations. This +happened when there was concurrent activity in other threads that changed the +number of records in the same portion of the Btree. An example stack trace is +below. +
      +java.lang.AssertionError
      + at com.sleepycat.je.dbi.CursorImpl.getCurrentKey(CursorImpl.java:500)
      + at com.sleepycat.je.dbi.CursorImpl.getCurrentKey(CursorImpl.java:483)
      + at com.sleepycat.je.Cursor.dupsGetNextOrPrevDup(Cursor.java:2882)
      + at com.sleepycat.je.Cursor.retrieveNextHandleDups(Cursor.java:2836)
      + at com.sleepycat.je.Cursor.retrieveNext(Cursor.java:2816)
      + at com.sleepycat.je.Cursor.getNextDup(Cursor.java:1150)
      + [ app specific portion ... ]
      +
      +In the stack trace above the Cursor.getNextDup method is being called. There +are other operations where the same thing could happen. The common factor is +the call to the internal CursorImpl.getCurrentKey method, which fires the +assertion. +

      +[#23971] (6.2.29) +


    42. + +
    43. +Fixed a bug that prevents recovery, i.e., prevents the Environment from being +opened. The bug has always been present in JE but has appeared in tests only +recently, and has not been reported in the field. Deleting records in a large +range of keys might make the bug more likely to occur. An example of the stack +trace when the failure occurs is below: +
      +com.sleepycat.je.EnvironmentFailureException: (JE 6.2.29) ... last
      +LSN=0x533/0x41f59 LOG_INTEGRITY: Log information is incorrect, problem is
      +likely persistent. Environment is invalid and must be closed.
      +        at com.sleepycat.je.recovery.RecoveryManager.traceAndThrowException(RecoveryManager.java:3031)
      +        at com.sleepycat.je.recovery.RecoveryManager.readINs(RecoveryManager.java:1010)
      +        at com.sleepycat.je.recovery.RecoveryManager.buildINs(RecoveryManager.java:804)
      +        at com.sleepycat.je.recovery.RecoveryManager.buildTree(RecoveryManager.java:717)
      +        at com.sleepycat.je.recovery.RecoveryManager.recover(RecoveryManager.java:352)
      +        at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:670)
      +        at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:208)
      +        at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:251)
      +        at com.sleepycat.je.Environment.(Environment.java:232)
      +        at com.sleepycat.je.Environment.(Environment.java:188)
      +        at com.sleepycat.je.rep.ReplicatedEnvironment.(ReplicatedEnvironment.java:573)
      +        at com.sleepycat.je.rep.ReplicatedEnvironment.(ReplicatedEnvironment.java:443)
      +        [ app specific portion ... ]
      +Caused by: com.sleepycat.je.EnvironmentFailureException: (JE 6.2.29) ...
      +fetchIN of 0x35c/0x3f7f9 parent IN=11688 IN class=com.sleepycat.je.tree.IN
      +lastFullVersion=0x533/0x5d47d lastLoggedVersion=0x533/0x5d47d
      +parent.getDirty()=false state=0 LOG_FILE_NOT_FOUND: Log file missing, log is
      +likely invalid. Environment is invalid and must be closed.
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:1866)
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:1764)
      +        at com.sleepycat.je.tree.Tree.getParentINForChildIN(Tree.java:1346)
      +        at com.sleepycat.je.recovery.RecoveryManager.recoverChildIN(RecoveryManager.java:2025)
      +        at com.sleepycat.je.recovery.RecoveryManager.recoverIN(RecoveryManager.java:1834)
      +        at com.sleepycat.je.recovery.RecoveryManager.replayOneIN(RecoveryManager.java:1099)
      +        at com.sleepycat.je.recovery.RecoveryManager.readINs(RecoveryManager.java:988)
      +        ... 16 more
      +Caused by: java.io.FileNotFoundException: .../0000035c.jdb (No such file or directory)
      +        at java.io.RandomAccessFile.open(Native Method)
      +        at java.io.RandomAccessFile.(RandomAccessFile.java:241)
      +        at java.io.RandomAccessFile.(RandomAccessFile.java:122)
      +        at com.sleepycat.je.log.FileManager$DefaultRandomAccessFile.(FileManager.java:3260)
      +        at com.sleepycat.je.log.FileManager$6.createFile(FileManager.java:3288)
      +        at com.sleepycat.je.log.FileManager.openFileHandle(FileManager.java:1311)
      +        at com.sleepycat.je.log.FileManager.getFileHandle(FileManager.java:1183)
      +        at com.sleepycat.je.log.LogManager.getLogSource(LogManager.java:1135)
      +        at com.sleepycat.je.log.LogManager.getLogEntry(LogManager.java:822)
      +        at com.sleepycat.je.log.LogManager.getLogEntryAllowInvisibleAtRecovery(LogManager.java:787)
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:1801)
      +        ... 22 more
      +
      +[#23990] (6.2.31) +

    44. + +
    45. +Fixed a bug that can cause data log corruption. This has been reported only as +a rare occurrence, but could impact any application where not all Btree +internal nodes fit in cache. An example stack trace is below, although other +stack traces could also apply where an IN (internal node) is being fetched. +
      +com.sleepycat.je.EnvironmentFailureException: (JE 6.2.9) ...
      +fetchIN of 0x10cbc/0x696373 parent IN=84363 IN
      +class=com.sleepycat.je.tree.IN lastFullVersion=0x10e00/0x82006e
      +lastLoggedVersion=0x10e00/0x82006e parent.getDirty()=false state=0
      +LOG_FILE_NOT_FOUND: Log file missing, log is likely invalid. Environment is
      +invalid and must be closed.
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:1866)
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:1752)
      +        at com.sleepycat.je.tree.Tree.search(Tree.java:2293)
      +        at com.sleepycat.je.tree.Tree.search(Tree.java:2193)
      +        at com.sleepycat.je.tree.Tree.getParentBINForChildLN(Tree.java:1481)
      +        at com.sleepycat.je.cleaner.FileProcessor.processLN(FileProcessor.java:836)
      +        ... 5 more
      +Caused by: java.io.FileNotFoundException: /local/pyrox/DS2/asinst_1/OUD/db/Europe/00010cbc.jdb (No such file or directory)
      +        at java.io.RandomAccessFile.open(Native Method)
      +        at java.io.RandomAccessFile.(RandomAccessFile.java:241)
      +        at java.io.RandomAccessFile.(RandomAccessFile.java:122)
      +        at com.sleepycat.je.log.FileManager$DefaultRandomAccessFile.(FileManager.java:3208)
      +        at com.sleepycat.je.log.FileManager$6.createFile(FileManager.java:3236)
      +        at com.sleepycat.je.log.FileManager.openFileHandle(FileManager.java:1305)
      +        at com.sleepycat.je.log.FileManager.getFileHandle(FileManager.java:1177)
      +        at com.sleepycat.je.log.LogManager.getLogSource(LogManager.java:1151)
      +        at com.sleepycat.je.log.LogManager.getLogEntry(LogManager.java:843)
      +        at com.sleepycat.je.log.LogManager.getLogEntryAllowInvisibleAtRecovery(LogManager.java:808)
      +        at com.sleepycat.je.tree.IN.fetchINWithNoLatch(IN.java:1801)
      +        ... 10 more
      +
      +[#24046] (6.2.31) +

    46. + +
    47. +Fixed a bug that can cause data log corruption when using a deferred-write +database. In the one reported instance of the problem, missing records were +reported. A corruption (e.g., LOG_FILE_NOT_FOUND) is also posssible. +[#24066] (6.2.31) +

    48. + +
    + + +
    +

    Changes in 6.1.5

    + +
      + +
    1. +Made an improvement to eviction for Oracle NoSQL DB users, and several +improvements to the DbCacheSize utility. +

      +For Oracle NoSQL DB users only, record versions are now discarded using a +separate eviction step. This means that the record versions can be discarded +to free cache memory without discarding the entire BIN (bottom internal node). +In general, this makes better use of memory and reduces IO for some workloads. +

      +The improvements to DbCacheSize are as follows. +

        +
      • + When -je.rep.preserveRecordVersion true is passed on the + command line, more information is output by the utility. See the new + Record Versions and Oracle NoSQL Database section of the DbCache javadoc + for more information. +
      • +
      • + The minimum and maximum cache sizes are no longer output. Previously, + the difference between these values was only due to an optimization that + applied to small log files. This optimization is now accounted for only + when the file size is small enough to allow for it. Be sure to pass + -je.log.fileMax LENGTH on the command line as described in + the javadoc. +
      • +
      • + The -outputproperties switch now outputs internalNodes, + internalNodesAndVersions, and allNodes, corresponding to the changes above. + The older minInternalNodes/maxInternalNodes and minAllNodes/maxAllNodes + values are still output but deprecated, and the min and max values in each + pair are equal. +
      • +
      • + The output has been simplified by removing the internal Btree information. + Btree information can optionally be output using the new + -btreeinfo switch. +
      • +
      +

      +[#23550] (6.1.0) +


    2. + +
    3. +Fixes a bug which prevented serialization +of ReplicaWriteException. Previously an attempt to serialize this +exception could fail with the following characteristic stack trace when +the StateChangeEvent object was encountered during serialization: + +
      + Caused by: java.io.NotSerializableException: com.sleepycat.je.rep.StateChangeEvent
      +
      +    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181)
      +    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1541)
      +    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1506)
      +    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429)
      +    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1175)
      +    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1541)
      +    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:439)
      +    at java.util.logging.LogRecord.writeObject(LogRecord.java:470)
      +    ...
      +
      +[#23578] (6.1.1) +

    4. + +
    5. +The JE HA replica replay mechanism now uses a separate thread to write replica +acknowledgements and heartbeat responses to the network. This change results in +two improvements: +
        +
      1. + The replay of changes sent by the master can make progress even in the + presence of brief network stalls, thus increasing replica replay + throughput; improvements in the range of 5 to 10% have been observed in + internal test scenarios. +
      2. +
      3. + This new thread is also used to send spontaneous heartbeat response + messages, making the heartbeat mechanism, used to detect node failures, + more robust. +
      4. +
      +[#23195] (6.1.1) +

    6. + +
    7. +Performance enhancement: executing a subset of CRUD and internal operations +on memory-resident BIN-deltas. +

      +Before JE 6.0, BIN-deltas were used as a disk optimization only: to reduce +the amount of bytes written to disk every time a new BIN version had to to be +logged. BIN-deltas would never appear in the in-memory BTrees, and if the +most recently logged version of a BIN was a delta, fetching that BIN into +the in-memory tree required 2 disk reads: one for the delta and one for the +most recent full-BIN version. +

      +Starting with JE 6.0, BIN-deltas can appear in the in-memory BTree. +Specifically, if a full dirty BIN is selected for eviction, rather than +evicting the whole BIN (and incurring a disk write), the BIN is converted +to a delta that stays in the cache. If a subsequent operation needs the full +BIN and the delta is still in the cache, only one disk read will be done. +

      +Further disk-read savings can be realized, because many operations can (under +certain conditions) be performed directly on the BIN-delta, without the need +for the full BIN. However, in 6.0, only a small subset of background +operations were modified to exploit BIN-deltas. In JE 6.1, the set of +operations that can be performed on BIN-deltas has been extended. Examples of +such operations include key searches in BTrees, if the search key is found on +a BIN delta and deletion or update of the record a cursor is located on, if +the cursor is located on a BIN-delta. These changes affect both internal +operations as well as the search, delete, and putCurrent methods of the +Database and Cursor API classes. +

      +[#23428] (6.1.1) +


    8. + +
    9. +Performance enhancement: Reduced latch contention during BTree searches. +

      +Typically, thread synchronization during BTree searches is done via latch +coupling: at most 2 tree nodes (a parent and a child) are latched at a time. +Furthermore, a node is latched in shared (SH) mode, unless it is expected that +it will be updated, in which case it is latched in exclusive (EX) mode. Finally, +SH latches are not upgradeable to EX latches (to avoid deadlocks and reduce +latching overhead). +

      +JE follows this general latch-coupling technique. However, it also has to deal +with the JE-specific fact that fetching a missing child node into the cache +requires that its memory-resident parent be updated (because the parent points +to its children via direct Java object references). As a result, during a JE +BTree search every node is potentially updated, which precludes the use of SH +latches. To cope with this complication, JE has been using one of the following +approaches during its various kinds of BTree searches: (a) use SH latches, but +if a missing child needs to be fetched, release the SH latch on the parent and +restart the search from the beginning, using EX latches on all nodes this time, +(b) do grandparent latching: use SH latches but keep a latch on the grandparent +node so that if we need to fetch a missing child of the parent node, the SH +latch on the parent can be released, and then the parent can be relatched in +EX mode, (c) do latch-coupling with EX latches only. Obviously, (c) is the +worst choice, but all of the 3 approaches result in more and longer-held EX +latches than necessary. As a result, some JE applications have experienced +performance problems due to excessive latch contention during BTree searches. +

      +In JE 6.1, a new latching algorithm has been implemented to replace all of +(a), (b), and (c) above. The new algorithm uses SH latches, but if a missing +child needs to be fetched, it first "pins" the parent (to prevent its eviction), +then releases the SH latch on the parent, and finally reads the child node +from the log (without any latches held). After the child is fetched, it +latches the remembered parent in EX mode, unpins it, and checks whether it +is still the correct parent for the search and for the child node that was +fetched. If so, the search continues down the tree. If not, it restarts the +search from the beginning. Compared to approach (a) above, this new algorithm +may restart a search multiple times, however the probability of even a single +restart is less than (a), and each restart uses SH latches. Furthermore, no +latches are held during the long random disk read done to fetch a missing +child. +

      +[#18617] (6.1.1) +


    10. + +
    11. +Fixed a bug that could result in the following exception in a JE HA + application: + +
      +com.sleepycat.je.EnvironmentFailureException: 
      + Node5(5):... VLSN 3,182,883 should be held within this tracker.
      +
      +or +
      +com.sleepycat.je.EnvironmentFailureException: 
      + Node5(5):...end of last bucket should match end of range ...
      +
      +[#23491] +

    12. + +
    13. +Improved the Monitor's ability to discover group status changes, which +should improve the robustness of notifications after the monitor is down +or when it has lost network connectivity. +

      +[#23631] (6.1.2) +


    14. + +
    15. +A new implementation for Database.count() and a new variant of Database.count() +that takes a memoryLimit as input. +

      +Counting the number of records in a database is now implemented using a +disk-ordered-scan (DOS), similar to the one used by DiskOrderedCursor. DOS may +consume a large amount of memory, and to avoid OutOfMemoryErrors, it requires +that a limit on its memory consumption is provided. As a result, a new method, +Database.count(long memoryLimit), has been implemented that takes this memory +limit as a parameter. The existing Database.count() method is still available +and uses an internally established limit. +

      +This change fixes two problems of the previous implementation (based on the +SortedLSNTreeWalker class): 1. There was no upper bound on the memory +consumption of the previous implementation and 2. It was buggy in the case +where concurrent thread activity could cause full BINs to be mutated to deltas +or vice versa. +

      +[#23646] (6.1.2) +


    16. + +
    17. +Fixed bug in DiskOrderedCursor. +

      +Iterating over the records of a database via a DiskOrderedCursor would cause +a crash if a BIN delta was encountered in the in-memory BTree (because in this +case a copy of the BIN delta was created and cached for later use, but the copy +did not contain all the needed information from the original). This bug was +introduced in JE 6.0.11. +

      +[#23646] (6.1.2) +


    18. + +
    19. +Fixed a bug in DiskOrderedCursor for DeferredWrite databases. An example of +the stack trace when the bug occurs is below. Note that although the exception +message indicates that a file is missing, actually the problem was transient +and no file was missing. Upgrading to the current JE release will fix the +problem without requiring data conversion or restoring from a backup. +
      +com.sleepycat.je.EnvironmentFailureException:
      +(JE 5.0.97) Environment must be closed, caused by:
      +com.sleepycat.je.EnvironmentFailureException:
      +Environment invalid because of previous exception:
      +(JE 5.0.97) ... java.io.FileNotFoundException: ...\ffffffff.jdb
      +(The system cannot find the file specified) LOG_FILE_NOT_FOUND:
      +Log file missing, log is likely invalid.
      +Environment is invalid and must be closed.
      +    at com.sleepycat.je.EnvironmentFailureException.wrapSelf(EnvironmentFailureException.java:210)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.checkIfInvalid(EnvironmentImpl.java:1594)
      +    at com.sleepycat.je.dbi.DiskOrderedCursorImpl.checkEnv(DiskOrderedCursorImpl.java:234)
      +    at com.sleepycat.je.DiskOrderedCursor.checkState(DiskOrderedCursor.java:367)
      +    at com.sleepycat.je.DiskOrderedCursor.getNext(DiskOrderedCursor.java:324)
      +    ...
      +
      +[#23676] (6.1.3) +

    20. + +
    21. +An API change requires application changes if +write operations are performed on a non-replicated database in a replicated +environment. A code change is necessary for applications with the following +characteristics: +

      +

        +
      • A ReplicatedEnvironment is used. +
      • A non-replicated, transactional Database is accessed + (DatabaseConfig.setReplicated(false) and setTransactional(true) are called) + in this environment. +
      • When writing to this database, an explicit (non-null) Transaction is + specified. +
      +

      +In order to perform write operations in such cases, the application must now +call TransactionConfig.setLocalWrite(true). +

      +In addition, it is no longer possible to use a single transaction to write to +both a replicated and a non-replicated databases. IllegalOperationException +will be thrown if this is attempted. +

      +These changes were necessary to prevent corruption when a transaction contains +write operations for both replicated and non-replicated databases, and a +failover occurs that causes a rollback of this transaction. The probability of +corruption is low, but it can occur under the right conditions. +

      +For more information see the javadoc for TransactionConfig.setLocalWrite(true), +and the "Non-replicated Databases in a Replicated Environment" section of the +ReplicatedEnvironment class javadoc. +

      +[#23330] (6.1.3) +


    22. + +
    23. +Read-only transactions are now supported. A read-only transaction prohibits +write operations, and more importantly in a replicated environment it +automatically uses Durability.ReplicaAckPolicy.NONE. A read-only transaction +on a Master will thus not be held up, or throw InsufficientReplicasException, +if the Master is not in contact with a sufficient number of Replicas at the +time the transaction is initiated. To configure a read-only transaction, call +TransactionConfig.setReadOnly(true). See this method's javadoc for more +information. +

      +Durability.READ_ONLY_TXN has been deprecated and TransactionConfig.setReadOnly +should be used instead. +

      +[#23330] (6.1.3) +


    24. + +
    25. +Fixed a bug that could cause a NullPointerException, such as the one below, +when a ReplicatedEnvironment is opened on an HA replica node. This prevents +the environment from being opened. +

      +The conditions that cause the bug are: +

        +
      1. a replica has been restarted after an abnormal shutdown + (ReplicatedEnvironment.close was not called), +
      2. a transaction writing records in multiple databases was in progress at + the time of the abnormal shutdown, +
      3. one of the databases, but not all of them, is then removed or truncated, + and finally +
      4. another abnormal shutdown occurs. +
      +

      +If this bug is encountered, it can be corrected by upgrading to the JE release +containing this fix, and no data loss will occur. +

      +This bug is similar to another bug that was fixed in JE 5.0.70 [#22052]. +This bug differs in that the transaction must write records in multiple +databases, and at least one but not all of the databases must be removed or +truncated between the two abnormal shutdowns. +

      +com.sleepycat.je.EnvironmentFailureException: (JE 6.1.3) Node1(-1):...
      +last LSN=0x3/0x4427 LOG_INTEGRITY: Log information is incorrect, problem is
      +likely persistent. Environment is invalid and must be closed.
      +    at com.sleepycat.je.recovery.RecoveryManager.traceAndThrowException(RecoveryManager.java:3012)
      +    at com.sleepycat.je.recovery.RecoveryManager.undoLNs(RecoveryManager.java:1253)
      +    at com.sleepycat.je.recovery.RecoveryManager.buildTree(RecoveryManager.java:741)
      +    at com.sleepycat.je.recovery.RecoveryManager.recover(RecoveryManager.java:352)
      +    at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:654)
      +    at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:208)
      +    at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:252)
      +    at com.sleepycat.je.Environment.(Environment.java:232)
      +    at com.sleepycat.je.Environment.(Environment.java:188)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.(ReplicatedEnvironment.java:573)
      +    at com.sleepycat.je.rep.ReplicatedEnvironment.(ReplicatedEnvironment.java:443)
      +    ... [app creates a new ReplicatedEnvironment here] ...
      +Caused by: java.lang.NullPointerException
      +    at com.sleepycat.je.log.entry.LNLogEntry.postFetchInit(LNLogEntry.java:412)
      +    at com.sleepycat.je.txn.TxnChain.(TxnChain.java:133)
      +    at com.sleepycat.je.txn.TxnChain.(TxnChain.java:84)
      +    at com.sleepycat.je.recovery.RollbackTracker$RollbackPeriod.getChain(RollbackTracker.java:1009)
      +    at com.sleepycat.je.recovery.RollbackTracker$Scanner.rollback(RollbackTracker.java:483)
      +    at com.sleepycat.je.recovery.RecoveryManager.undoLNs(RecoveryManager.java:1182)
      +    ... 11 more
      +
      +[#22071] (6.1.3) +

    26. + +
    27. +Fixed a bug where a transaction configured for no-wait (using +TransactionConfig.setNoWait(true)) behaved as a normal (wait) transction when +the ReadCommitted isolation mode was also used. Due to this bug, a +LockTimeoutException was thrown when a LockNotAvailableException should have +been thrown instead, and the transaction was invalidated when it should not +have been. +[#23653] (6.1.4) +

    28. + +
    29. +Fixed eviction bug for shared-cache environments. The bug caused LRU corruption +and potential memory leaks in certain cases. The bug was introduced in JE 6.0. +Note that the bug has no impact for environments that are not using a shared +cache (EnvironmentConfig.setSharedCache(true)). +[#23696] (6.1.4) +

    30. + +
    + + +
    +

    Changes in 6.0.11

    + +
      + +
    1. +Added support in JE HA for the new SECONDARY node type. SECONDARY nodes +can only be replicas, not masters, and do not participate in either +elections or durability decisions. SECONDARY nodes can be used to +increase the available number of read replicas without changing the +election or durability quorum of the group, and without requiring +communication with the secondaries during master elections or +transaction commits. +

      +Changes include adding the NodeType.SECONDARY +enumeration constant, and the +ReplicationGroup.getSecondaryNodes and +ReplicationGroup.getDataNodes methods. [#22482] (6.0.1) +


    2. + +
    3. +Made improvements to internal latching to allow interrupting threads that are +waiting on latches, cause a timeouts when a latch deadlock occurs, and enable +latch instrumentation via system properties. Note that latching is not related +to transactional locking and latches are intended to be held for very short +periods. +
        +
      • When a JE thread is waiting on an internal latch, for example, when + accessing Btree internal nodes, log buffers, etc, interrupting the thread + is now possible and will result in a ThreadInterruptedException. In + earlier versions, latching calls were not interruptible and a latch + deadlock would require a process restart.
      • +
      • When a JE thread is waiting on an internal latch, a timeout will occur + if the latch cannot be acquired after 5 minutes and a fatal + EnvironmentFailureException will be thrown. The timeout is intended to + detect latch deadlocks earlier. +
      • A system property, JE_TEST, may be defined to true (-DJE_TEST=true) to + enable JE debug/test instrumentation. Currently, this only adds latch + tracking so that an internal latching error will contain more information + about the problem. Over time, more JE instrumentation will be enabled via + this switch. The JE_TEST property is set to true automatically when + running the JE unit test suite via ant. This instrumentation is not + intended for production use. Note that in earlier versions, however, this + instrumentation was enabled when Java assertions (-ea) were enabled.
      • +
      • An additional system property, JE_CAPTURE_LATCH_OWNER, may be set to + true to capture the stack trace at the point that each latch is acquired + exclusively. This additional information will appear in latching error + messages and may help in debugging an internal latching problem. It is + fairly expensive to capture the stack trace, and this switch should not be + set in production.
      • +
      • An undocumented EnvironmentConfig parameter, je.env.sharedLatches, is + no longer used and silently ignored. Latches are now shared (read-write), + rather than exclusive, whenever possible.
      • +
      +[#22993] (6.0.3) +

    4. + +
    5. +The following log cleaner configuration parameters in the EnvironmentConfig +class have been deprecated and are no longer used. If configured, they will +be silently ignored. Lazy and proactive migration are no longer supported due +to negative impacts on eviction, checkpointing and Btree splits. If a +persistent log cleaner backlog occurs, the recommended solution is to configure +additional cleaner threads. +
        +
      • CLEANER_LAZY_MIGRATION
      • +
      • CLEANER_BACKGROUND_PROACTIVE_MIGRATION
      • +
      • CLEANER_FOREGROUND_PROACTIVE_MIGRATION
      • +
      +[#23070] (6.0.3) +

    6. + +
    7. +When using secondary databases and DPL secondary indexes, the locking order for +reads via a secondary has been changed to reduce the possibility of deadlocks. +This optimization does not apply when the serializable isolation mode is used, +and does not apply to the JoinCursor. +[#22368] (6.0.4) +

    8. + +
    9. +Improved Btree cache usage by caching a BIN-delta -- the partial form of a BIN +containing only the dirty entries -- in preference to logging it and then +evicting the entire BIN. This reduces disk reads if CRUD operations are +performed on the BIN before the entire BIN is evicted, because only one BIN +fetch rather than two is needed. Disk writes are also reduced to some degree. +The performance improvement applies only when BINs are being evicted from +cache. The improvement is signficant when CRUD operations address a non-random +subset of the keys in the data set. +

      +As part of the performance improvement work, the following statistics were +added. +

        +
      • nCachedBINDeltas: EnvironmentStats.getNCachedBINDeltas + -- Number of BIN-deltas (partial BINs) in cache. +
      • +
      • nBINDeltasFetchMiss: + EnvironmentStats.getNBINDeltasFetchMiss -- Number of BIN-deltas + fetched to satisfy btree operations. +
      • +
      • nBINsMutated: EnvironmentStats.getNBINsMutated -- The + number of BINs mutated to BIN-deltas by eviction. +
      • +
      • lastCheckpointInterval: + EnvironmentStats.getLastCheckpointInterval -- Byte length from + last checkpoint start to the previous checkpoint start. +
      • +
      +

      +In addition, the EnvironmentConfig.TREE_MAX_DELTA param has been deprecated. +As of JE 5.0, the benefit from logging BIN-deltas is unrelated to the number of +deltas that have been logged since the last full BIN. To configure BIN-delta +logging, use EnvironmentConfig.TREE_BIN_DELTA. +

      +[#22662] (6.0.5) +


    10. + +
    11. +An optimization for Databases with sorted duplicates configured has been made +to improve log cleaning performance. Records in duplicates databases need no +longer be tracked or processed by the log cleaner, which reduces cleaning costs +significantly when duplicates databases are used for a significant portion of a +data set, for example, as secondary index databases. +

      +As described under 'Upgrading from JE 5.0 or earlier' at the top of this +document, to support this cleaner optimization a change was made involving +partial Btree and duplicate comparators. Partial comparators are an advanced +feature that few applications use. As of JE 6.0, using partial comparators is +not recommended. Applications that do use partial comparators must now change +their comparator classes to implement the new PartialComparator tag interface, +before running the application with JE 6. Failure to do so may cause incorrect +behavior during transaction aborts. See the PartialComparator javadoc for more +information. +

      +[#22864] (6.0.5) +


    12. + +
    13. +Fixed a bug that sometimes resulted in an uncommitted record deletion performed +in one transaction to be visible (result in a NOTFOUND result) to an operation +performed in another transaction. This bug applies to the use of +Database.delete and PrimaryIndex.delete. It does not apply to the use of +SecondaryDatabase.delete, SecondaryIndex.delete, or the use of a cursor to +perform a deletion. Note that this problem is distinct from a similar bug that +was fixed in JE 5.0.98 ([#22892]). +

      +[#23132] (6.0.5) +


    14. + +
    15. +Modified the algorithm that protects cleaned log files from deletion to +consider the relative cost of replication replay versus network restore, +as well as available disk space. When JE HA decides whether to delete +cleaned log files, it uses information it stores about the progress of +replication replay for each electable replica to retain useful log files +even if the replicas are offline, subject to +the ReplicationConfig.REP_STREAM_TIMEOUT parameter. The +system does not store information about replication progress for +secondary replicas, though, so a different approach has been added. +

      +The modified algorithm estimates the costs of replication replay and +network restore, and protects log files from deletion that could be used +for replay if there is sufficient disk space and replay would be less +expensive than network restore. These computations apply to all +replicas, but are particularly useful for secondary replicas, for which +log files will not otherwise be retained if the replicas become +temporarily unreachable. Note that disk space calculations are only +performed when running with Java 7 or later. +

      +Two new ReplicationConfig parameters were added: +

        +
      • REPLAY_COST_PERCENT - The cost of replaying the + replication stream as compared to the cost of performing a network + restore. +
      • REPLAY_FREE_DISK_PERCENT - The target amount of free + disk space to maintain when selecting log files to retain for use in + replay. +
      +

      +[#22575] (6.0.5) +


    16. + +
    17. +An improvement was made to the calculation of log utilization to avoid +under-cleaning or over-cleaning. For example, when log utilization was +estimated to be lower than actual utilization, unnecessary over-cleaning would +occur, which could reduce performance. Or when log utilization was estimated +to be higher than actual utilization, under-cleaning would prevent reclaiming +unused disk space. +

      +To prevent these problems, the size of each logged record is now stored in the +Btree BINs (bottom internal nodes), so that utilization can be calculated +correctly during record updates and deletions, while still avoiding a fetch of +the old version of the record. With this change, the utilization adjustment +facility in the log cleaner, which attempted to compensate for this problem by +estimating utilization, is no longer needed by most applications. +

      +Therefore the EnvironmentConfig.CLEANER_ADJUST_UTILIZATION parameter is now +false by default rather than true, and will be disabled completely in a future +version of JE. For more information, see the javadoc for this parameter. +

      +[#22275] (6.0.7) +


    18. + +
    19. +The helper hosts parameter used in JE HA replication is now +mutable. Accordingly, the set/getHelperHosts() methods and the +HELPER_HOST definition in com.sleepycat.je.rep.ReplicationConfig have +been moved to their parent class, ReplicationMutableConfig. The change +is fully link and source compatible. +[#22753] (6.0.7) +

    20. + +
    21. +Improved the performance of eviction by removing a bottleneck that was causing +thread contention. Previously, for workloads with heavy eviction, threads were +often waiting on a mutex in the TargetSelector.selectIN method. This impacted +not only JE's dedicated background threads, but also application threads that +were participating in critical eviction. A new approach is used that +dramatically reduces thread contention and increases performance (compared to +JE 5 and earlier) for such workloads. +

      +In addition, the new eviction approach implements a more accurate LRU which +ensures that dirty nodes are evicted last and thereby reduces unnecessary +logging. +

      +As part of this change, the following configuration parameters were deprecated +and are ignored by JE: +

      +    EnvironmentConfig.EVICTOR_NODES_PER_SCAN
      +    EnvironmentConfig.EVICTOR_LRU_ONLY
      +
      +And the following configuration parameter was added: +
      +    EnvironmentConfig.EVICTOR_N_LRU_LISTS
      +
      +[#23063] (6.0.7) +

    22. + +
    23. +A change was made involving the charset for internal text (messages) that +appear in the JE log (.jdb files). Previously, the default JVM charset was +used. When dumping the log with DbPrintLog (e.g., for debugging purposes), +if the default JVM charset was different than the one at the time the log was +written, the text messages would be garbled. For example, this occurred when +the log was written with an EBCDIC charset and then dumped with a UTF8 charset. +This has been fixed by always writing and reading text in the UTF8 charset. +[#15296] (6.0.8) +

    24. + +
    25. +A new HA configuration parameter: +com.sleepycat.je.rep.ReplicationConfig.BIND_INADDR_ANY was added. This +parameter permits binding of the port used by HA to all the local interfaces on +the host. The javadoc associated with this configuration parameter provides +further details. +[#23437] (6.0.9) +

    26. + +
    27. +Fix a bug that could under rare conditions, primarily frequent failovers, cause +the following exception in an HA environment. +
      +Caused by: com.sleepycat.je.EnvironmentFailureException: (JE 5.0.97)
      +node2(2):foo\node2 Read invisible log entry at 0x0/0xcb776
      +hdr type="INS_LN_TX/8" vlsn v="19,373" isReplicated="1" isInvisible="1"
      +prev="0xcb74c" size="17" cksum="2626620732"
      +LOG_INTEGRITY: Log information is incorrect, problem is likely persistent.
      +fetchTarget of 0x0/0xcb776 parent IN=29 IN class=com.sleepycat.je.tree.BIN
      +lastFullVersion=0x0/0xf154c lastLoggedVersion=0x0/0xf588e
      +parent.getDirty()=true state=3
      +at com.sleepycat.je.log.LogManager.getLogEntryFromLogSource(LogManager.java:1054)
      +at com.sleepycat.je.log.LogManager.getLogEntry(LogManager.java:906)
      +at com.sleepycat.je.log.LogManager.getLogEntryAllowInvisibleAtRecovery(LogManager.java:867)
      +at com.sleepycat.je.tree.IN.fetchTarget(IN.java:1427)
      +at com.sleepycat.je.tree.BIN.fetchTarget(BIN.java:1250)
      +at com.sleepycat.je.recovery.RecoveryManager.undo(RecoveryManager.java:2415)
      +at com.sleepycat.je.recovery.RecoveryManager.rollbackUndo(RecoveryManager.java:2268)
      +...
      +
      +[#22848] (6.0.10) +

    28. + +
    29. +EntityStore.close has been changed to fix a bug that caused a memory leak when +the Database could not be closed, for example, if it had open cursors. The +javadoc for this method was also updated to warn that it must be called to +avoid memory leaks, even when the Environment is invalid. +[#23462] (6.0.10) +

    30. + +
    + + + diff --git a/docs/collections/tutorial/BasicProgram.html b/docs/collections/tutorial/BasicProgram.html new file mode 100644 index 0000000..19b84e9 --- /dev/null +++ b/docs/collections/tutorial/BasicProgram.html @@ -0,0 +1,454 @@ + + + + + + Chapter 2.  The Basic Program + + + + + + + + + +
    +
    +
    +
    +

    Chapter 2.  + The Basic Program +

    +
    +
    +
    + +

    + The Basic example is a minimal implementation of the shipment + program. It writes and reads the part, supplier and shipment + databases. +

    +

    + The complete source of the final version of the example program + is included in the Berkeley DB distribution. +

    +
    +
    +
    +
    +

    + Defining Serialized Key and Value Classes +

    +
    +
    +
    +

    + The key and value classes for each type of shipment record — + Parts, Suppliers and Shipments — are defined as ordinary Java + classes. In this example the serialized form of the key and value + objects is stored directly in the database. Therefore these classes + must implement the standard Java java.io.Serializable interface. A + compact form of Java serialization is used that does not duplicate + the class description in each record. Instead the class + descriptions are stored in the class catalog store, which is + described in the next section. But in all other respects, standard + Java serialization is used. +

    +

    + An important point is that instances of these classes are passed + and returned by value, not by reference, when they are stored and + retrieved from the database. This means that changing a key or + value object does not automatically change the database. The object + must be explicitly stored in the database after changing it. To + emphasize this point the key and value classes defined here have no + field setter methods. Setter methods can be defined, but it is + important to remember that calling a setter method will not cause + the change to be stored in the database. How to store and retrieve + objects in the database will be described later. +

    +

    + Each key and value class contains a toString method that is used + to output the contents of the object in the example program. This + is meant for illustration only and is not required for database + objects in general. +

    +

    + Notice that the key and value classes defined below do not + contain any references to com.sleepycat packages. An + important characteristic of these classes is that they are + independent of the database. Therefore, they may be easily used in + other contexts and may be defined in a way that is compatible with + other tools and libraries. +

    +

    + The PartKey class contains only the Part's Number field. +

    +

    + Note that PartKey (as well as SupplierKey below) + contain only a single String field. Instead of defining a specific + class for each type of key, the String class by itself could have + been used. Specific key classes were used to illustrate strong + typing and for consistency in the example. The use of a plain + String as an index key is illustrated in the next example program. + It is up to the developer to use either primitive Java classes such + as String and Integer, or strongly typed classes. When + there is the possibility that fields will be added later to a key + or value, a specific class should be used. + +

    + +
    import java.io.Serializable;
    +
    +public class PartKey implements Serializable
    +{
    +    private String number;
    +
    +    public PartKey(String number) {
    +        this.number = number;
    +    }
    +
    +    public final String getNumber() {
    +        return number;
    +    }
    +
    +    public String toString() {
    +        return "[PartKey: number=" + number + ']';
    +    }
    +} 
    +

    + The PartData class contains the Part's Name, Color, + Weight and City fields. +

    + +
    import java.io.Serializable;
    +
    +public class PartData implements Serializable
    +{
    +    private String name;
    +    private String color;
    +    private Weight weight;
    +    private String city;
    +
    +    public PartData(String name, String color, Weight weight, String city)
    +    {
    +        this.name = name;
    +        this.color = color;
    +        this.weight = weight;
    +        this.city = city;
    +    }
    +
    +    public final String getName()
    +    {
    +        return name;
    +    }
    +
    +    public final String getColor()
    +    {
    +        return color;
    +    }
    +
    +    public final Weight getWeight()
    +    {
    +        return weight;
    +    }
    +
    +    public final String getCity()
    +    {
    +        return city;
    +    }
    +
    +    public String toString()
    +    {
    +        return "[PartData: name=" + name +
    +               " color=" + color +
    +               " weight=" + weight +
    +               " city=" + city + ']';
    +    }
    +} 
    +

    + The Weight class is also defined here, and is used as the + type of the Part's Weight field. Just as in standard Java + serialization, nothing special is needed to store nested objects as + long as they are all Serializable. +

    + +
    import java.io.Serializable;
    +
    +public class Weight implements Serializable
    +{
    +    public final static String GRAMS = "grams";
    +    public final static String OUNCES = "ounces";
    +
    +    private double amount;
    +    private String units;
    +
    +    public Weight(double amount, String units)
    +    {
    +        this.amount = amount;
    +        this.units = units;
    +    }
    +
    +    public final double getAmount()
    +    {
    +        return amount;
    +    }
    +
    +    public final String getUnits()
    +    {
    +        return units;
    +    }
    +
    +    public String toString()
    +    {
    +        return "[" + amount + ' ' + units + ']';
    +    }
    +} 
    +

    + The SupplierKey class contains the Supplier's Number + field. +

    + +
    import java.io.Serializable;
    +
    +public class SupplierKey implements Serializable
    +{
    +    private String number;
    +
    +    public SupplierKey(String number)
    +    {
    +        this.number = number;
    +    }
    +
    +    public final String getNumber()
    +    {
    +        return number;
    +    }
    +
    +    public String toString()
    +    {
    +        return "[SupplierKey: number=" + number + ']';
    +    }
    +} 
    +

    + The SupplierData class contains the Supplier's Name, + Status and City fields. +

    + +
    import java.io.Serializable;
    +
    +public class SupplierData implements Serializable
    +{
    +    private String name;
    +    private int status;
    +    private String city;
    +
    +    public SupplierData(String name, int status, String city)
    +    {
    +        this.name = name;
    +        this.status = status;
    +        this.city = city;
    +    }
    +
    +    public final String getName()
    +    {
    +        return name;
    +    }
    +
    +    public final int getStatus()
    +    {
    +        return status;
    +    }
    +
    +    public final String getCity()
    +    {
    +        return city;
    +    }
    +
    +    public String toString()
    +    {
    +        return "[SupplierData: name=" + name +
    +               " status=" + status +
    +               " city=" + city + ']';
    +    }
    +}
    +	
    +

    + The ShipmentKey class contains the keys of both the Part + and Supplier. +

    + +
    import java.io.Serializable;
    +
    +public class ShipmentKey implements Serializable
    +{
    +    private String partNumber;
    +    private String supplierNumber;
    +
    +    public ShipmentKey(String partNumber, String supplierNumber)
    +    {
    +        this.partNumber = partNumber;
    +        this.supplierNumber = supplierNumber;
    +    }
    +
    +    public final String getPartNumber()
    +    {
    +        return partNumber;
    +    }
    +
    +    public final String getSupplierNumber()
    +    {
    +        return supplierNumber;
    +    }
    +
    +    public String toString()
    +    {
    +        return "[ShipmentKey: supplier=" + supplierNumber +
    +                " part=" + partNumber + ']';
    +    }
    +} 
    +

    + The ShipmentData class contains only the Shipment's + Quantity field. Like PartKey and SupplierKey, + ShipmentData contains only a single primitive field. + Therefore the Integer class could have been used instead of + defining a specific value class. +

    + +
    import java.io.Serializable;
    +
    +public class ShipmentData implements Serializable
    +{
    +    private int quantity;
    +
    +    public ShipmentData(int quantity)
    +    {
    +        this.quantity = quantity;
    +    }
    +
    +    public final int getQuantity()
    +    {
    +        return quantity;
    +    }
    +
    +    public String toString()
    +    {
    +        return "[ShipmentData: quantity=" + quantity + ']';
    +    }
    +} 
    +
    +
    + + + diff --git a/docs/collections/tutorial/BerkeleyDB-JE-Collections.pdf b/docs/collections/tutorial/BerkeleyDB-JE-Collections.pdf new file mode 100644 index 0000000000000000000000000000000000000000..63e93df6129f563e9348a601e0a2383953a95b16 GIT binary patch literal 405903 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
  • S-+;ajakB?m>ji1y%BZ;PspkuVUb8$p$}U9&BZ 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

    pwX~f0vmO*eX`{^{L z?_2=8LyyaGD(FE!!UDh`-&2(k)84&WBW0dvE+ZdMijYpK;{B_Nr!-sK6U&bg4I~oh zs5ivr^irF|2R>!q2kG5lv13TYseFm!!I-Eze~U};-7UY@wc5qQ>j}k|1)v594+Rsj zMjc#&y1LicU{l^hnozB5pmLn^n%-I;-iS4Pa|)$YHMp>Ax&7(XnDp6Lezs25i?{&? zxVeW!6Y4rIWaUK9Z%95L0>i>eA#-roRdc%{QL2<-348@bDE4`TX;v?K#}

    oE|CO!V%2dXlvc%g3P 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

    -~v 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 z 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 O8sSl=PODCV9{&f0^#mFK literal 0 HcmV?d00001 diff --git a/docs/collections/tutorial/Entity.html b/docs/collections/tutorial/Entity.html new file mode 100644 index 0000000..bd449e8 --- /dev/null +++ b/docs/collections/tutorial/Entity.html @@ -0,0 +1,356 @@ + + + + + + Chapter 4.  Using Entity Classes + + + + + + + + + +
    +
    +
    +
    +

    Chapter 4.  + Using Entity Classes +

    +
    +
    +
    + +

    + In the prior examples, the keys and values of each store were + represented using separate classes. For example, a PartKey + and a PartData class were used. Many times it is desirable + to have a single class representing both the key and the value, for + example, a Part class. +

    +

    + Such a combined key and value class is called an entity + class and is used along with an entity binding. Entity + bindings combine a key and a value into an entity when reading a + record from a collection, and split an entity into a key and a + value when writing a record to a collection. Entity bindings are + used in place of value bindings, and entity objects are used with + collections in place of value objects. +

    +

    + Some reasons for using entities are: +

    +
    +
      +
    • +

      + When the key is a property of an entity object representing the + record as a whole, the object's identity and concept are often + clearer than with key and value objects that are disjoint. +

      +
    • +
    • +

      + A single entity object per record is often more convenient to + use than two objects. +

      +
    • +
    +
    +

    + Of course, instead of using an entity binding, you could simply + create the entity yourself after reading the key and value from a + collection, and split the entity into a key and value yourself + before writing it to a collection. But this would detract from the + convenience of the using the Java collections API. It is convenient + to obtain a Part object directly from + Map.get + + and to add a Part object using + Set.add. + Collections having entity bindings can be used naturally without + combining and splitting objects each time a collection method is + called; however, an entity binding class must be defined by the + application. +

    +

    + In addition to showing how to use entity bindings, this example + illustrates a key feature of all bindings: Bindings are independent + of database storage parameters and formats. Compare this example to + the prior Index example and you'll see that the Sample and + SampleViews classes have been changed to use entity + bindings, but the SampleDatabase class was not changed at + all. In fact, the Entity program and the Index program can be used + interchangeably to access the same physical database files. This + demonstrates that bindings are only a "view" onto the physical + stored data. +

    +

    + Warning: When using multiple bindings for the same + database, it is the application's responsibility to ensure that the + same format is used for all bindings. For example, a serial binding + and a tuple binding cannot be used to access the same records. +

    +

    + The complete source of the final version of the example program + is included in the Berkeley DB distribution. +

    +
    +
    +
    +
    +

    + Defining Entity Classes +

    +
    +
    +
    +

    + As described in the prior section, entity classes are + combined key/value classes that are managed by entity bindings. In + this example the Part, Supplier and Shipment + classes are entity classes. These classes contain fields that are a + union of the fields of the key and value classes that were defined + earlier for each store. +

    +

    + In general, entity classes may be defined in any way desired by + the application. The entity binding, which is also defined by the + application, is responsible for mapping between key/value objects + and entity objects. +

    +

    + The Part, Supplier and Shipment + entity classes are + defined below. +

    +

    + An important difference between the entity classes defined here + and the key and value classes defined earlier is that the entity + classes are not serializable (do not implement the + Serializable + + interface). This is because the entity classes are not directly + stored. The entity binding decomposes an entity object into key and + value objects, and only the key and value objects are serialized + for storage. +

    +

    + One advantage of using entities can already be seen in the + toString() method of the classes below. These return debugging + output for the combined key and value, and will be used later to + create a listing of the database that is more readable than in the + prior examples. +

    + +
    public class Part
    +{
    +    private String number;
    +    private String name;
    +    private String color;
    +    private Weight weight;
    +    private String city;
    +
    +    public Part(String number, String name, String color, Weight weight,
    +                String city)
    +    {
    +        this.number = number;
    +        this.name = name;
    +        this.color = color;
    +        this.weight = weight;
    +        this.city = city;
    +    }
    +
    +    public final String getNumber()
    +    {
    +        return number;
    +    }
    +
    +    public final String getName()
    +    {
    +        return name;
    +    }
    +
    +    public final String getColor()
    +    {
    +        return color;
    +    }
    +
    +    public final Weight getWeight()
    +    {
    +        return weight;
    +    }
    +
    +    public final String getCity()
    +    {
    +        return city;
    +    }
    +
    +    public String toString()
    +    {
    +        return "Part: number=" + number +
    +               " name=" + name +
    +               " color=" + color +
    +               " weight=" + weight +
    +               " city=" + city + '.';
    +    }
    +} 
    + +
    public class Supplier
    +{
    +    private String number;
    +    private String name;
    +    private int status;
    +    private String city;
    +
    +    public Supplier(String number, String name, int status, String city)
    +    {
    +        this.number = number;
    +        this.name = name;
    +        this.status = status;
    +        this.city = city;
    +    }
    +
    +    public final String getNumber()
    +    {
    +        return number;
    +    }
    +
    +    public final String getName()
    +    {
    +        return name;
    +    }
    +
    +    public final int getStatus()
    +    {
    +        return status;
    +    }
    +
    +    public final String getCity()
    +    {
    +        return city;
    +    }
    +
    +    public String toString()
    +    {
    +        return "Supplier: number=" + number +
    +               " name=" + name +
    +               " status=" + status +
    +               " city=" + city + '.';
    +    }
    +}  
    + +
    public class Shipment
    +{
    +    private String partNumber;
    +    private String supplierNumber;
    +    private int quantity;
    +
    +    public Shipment(String partNumber, String supplierNumber, int quantity)
    +    {
    +        this.partNumber = partNumber;
    +        this.supplierNumber = supplierNumber;
    +        this.quantity = quantity;
    +    }
    +
    +    public final String getPartNumber()
    +    {
    +        return partNumber;
    +    }
    +
    +    public final String getSupplierNumber()
    +    {
    +        return supplierNumber;
    +    }
    +
    +    public final int getQuantity()
    +    {
    +        return quantity;
    +    }
    +
    +    public String toString()
    +    {
    +        return "Shipment: part=" + partNumber +
    +                " supplier=" + supplierNumber +
    +                " quantity=" + quantity + '.';
    +    }
    +}  
    +
    +
    + + + diff --git a/docs/collections/tutorial/SerializableEntity.html b/docs/collections/tutorial/SerializableEntity.html new file mode 100644 index 0000000..c333cda --- /dev/null +++ b/docs/collections/tutorial/SerializableEntity.html @@ -0,0 +1,345 @@ + + + + + + Chapter 6.  Using Serializable Entities + + + + + + + + + +
    +
    +
    +
    +

    Chapter 6.  + Using Serializable Entities +

    +
    +
    +
    + +

    + In the prior examples that used entities (the Entity and Tuple examples) you + may have noticed the redundancy between the serializable value + classes and the entity classes. An entity class by definition + contains all properties of the value class as well as all + properties of the key class. +

    +

    + When using serializable values it is possible to remove this + redundancy by changing the entity class in two ways: +

    +
    +
      +
    • +

      + Make the entity class serializable, so it can be used in place + of the value class. +

      +
    • +
    • +

      + Make the key fields transient, so they are not redundantly + stored in the record. +

      +
    • +
    +
    +

    + The modified entity class can then serve double-duty: It can be + serialized and stored as the record value, and it can be used as + the entity class as usual along with the Java collections API. The + PartData, SupplierData and ShipmentData + classes can then be removed. +

    +

    + Transient fields are defined in Java as fields that are not + stored in the serialized form of an object. Therefore, when an + object is deserialized the transient fields must be explicitly + initialized. Since the entity binding is responsible for creating + entity objects, it is the natural place to initialize the transient + key fields. +

    +

    + Note that it is not strictly necessary to make the key fields of + a serializable entity class transient. If this is not done, the key + will simply be stored redundantly in the record's value. This extra + storage may or may not be acceptable to an application. But since + we are using tuple keys and an entity binding class must be + implemented anyway to extract the key from the entity, it is + sensible to use transient key fields to reduce the record size. Of + course there may be a reason that transient fields are not desired; + for example, if an application wants to serialize the entity + objects for other purposes, then using transient fields should be + avoided. +

    +

    + The complete source of the final version of the example program + is included in the Berkeley DB distribution. +

    +
    +
    +
    +
    +

    + Using Transient Fields in an Entity Class +

    +
    +
    +
    +

    + The entity classes in this example are redefined such that they + can be used both as serializable value classes and as entity + classes. Compared to the prior example there are three changes to + the Part, Supplier and Shipment entity + classes: +

    +
    +
      +
    • +

      + Each class now implements the Serializable + interface. +

      +
    • +
    • +

      + The key fields in each class are declared as transient. +

      +
    • +
    • +

      + A package-private setKey() method is added to each class + for initializing the transient key fields. This method will be + called from the entity bindings. +

      +
    • +
    +
    + +
    import java.io.Serializable;
    +...
    +public class Part implements Serializable
    +{
    +    private transient String number;
    +    private String name;
    +    private String color;
    +    private Weight weight;
    +    private String city;
    +
    +    public Part(String number, String name, String color, Weight weight,
    +                String city)
    +    {
    +        this.number = number;
    +        this.name = name;
    +        this.color = color;
    +        this.weight = weight;
    +        this.city = city;
    +    }
    +
    +    final void setKey(String number)
    +    {
    +        this.number = number;
    +    }
    +
    +    public final String getNumber()
    +    {
    +        return number;
    +    }
    +
    +    public final String getName()
    +    {
    +        return name;
    +    }
    +
    +    public final String getColor()
    +    {
    +        return color;
    +    }
    +
    +    public final Weight getWeight()
    +    {
    +        return weight;
    +    }
    +
    +    public final String getCity()
    +    {
    +        return city;
    +    }
    +
    +    public String toString()
    +    {
    +        return "Part: number=" + number +
    +               " name=" + name +
    +               " color=" + color +
    +               " weight=" + weight +
    +               " city=" + city + '.';
    +    }
    +}
    +...
    +public class Supplier implements Serializable
    +{
    +    private transient String number;
    +    private String name;
    +    private int status;
    +    private String city;
    +
    +    public Supplier(String number, String name, int status, String city)
    +    {
    +        this.number = number;
    +        this.name = name;
    +        this.status = status;
    +        this.city = city;
    +    }
    +
    +    void setKey(String number)
    +    {
    +        this.number = number;
    +    }
    +
    +    public final String getNumber()
    +    {
    +        return number;
    +    }
    +
    +    public final String getName()
    +    {
    +        return name;
    +    }
    +
    +    public final int getStatus()
    +    {
    +        return status;
    +    }
    +
    +    public final String getCity()
    +    {
    +        return city;
    +    }
    +
    +    public String toString()
    +    {
    +        return "Supplier: number=" + number +
    +               " name=" + name +
    +               " status=" + status +
    +               " city=" + city + '.';
    +    }
    +}
    +...
    +public class Shipment implements Serializable
    +{
    +    private transient String partNumber;
    +    private transient String supplierNumber;
    +    private int quantity;
    +
    +    public Shipment(String partNumber, String supplierNumber, int quantity)
    +    {
    +        this.partNumber = partNumber;
    +        this.supplierNumber = supplierNumber;
    +        this.quantity = quantity;
    +    }
    +
    +    void setKey(String partNumber, String supplierNumber)
    +    {
    +        this.partNumber = partNumber;
    +        this.supplierNumber = supplierNumber;
    +    } 
    +
    +    public final String getPartNumber()
    +    {
    +        return partNumber;
    +    }
    +
    +    public final String getSupplierNumber()
    +    {
    +        return supplierNumber;
    +    }
    +
    +    public final int getQuantity()
    +    {
    +        return quantity;
    +    }
    +
    +    public String toString()
    +    {
    +        return "Shipment: part=" + partNumber +
    +                " supplier=" + supplierNumber +
    +                " quantity=" + quantity + '.';
    +    }
    +}
    +	
    +
    +
    + + + diff --git a/docs/collections/tutorial/SerializedObjectStorage.html b/docs/collections/tutorial/SerializedObjectStorage.html new file mode 100644 index 0000000..423706f --- /dev/null +++ b/docs/collections/tutorial/SerializedObjectStorage.html @@ -0,0 +1,85 @@ + + + + + + Serialized Object Storage + + + + + + + + +
    +
    +
    +
    +

    + Serialized Object Storage +

    +
    +
    +
    +

    + Serialization of an object graph includes class information as + well as instance information. If more than one instance of the same + class is serialized as separate serialization operations then the + class information exists more than once. To eliminate this + inefficiency the + StoredClassCatalog + + class will store the class format for all database records stored + using a + SerialBinding. + Refer to the + ship sample code for examples (the class + SampleDatabase in + + <INSTALL_DIR>/examples/collections/ship/basic/SampleDatabase.java + is a good place to start). +

    +
    + + + diff --git a/docs/collections/tutorial/Summary.html b/docs/collections/tutorial/Summary.html new file mode 100644 index 0000000..4378b31 --- /dev/null +++ b/docs/collections/tutorial/Summary.html @@ -0,0 +1,191 @@ + + + + + + Chapter 7.  Summary + + + + + + + + + +
    +
    +
    +
    +

    Chapter 7.  + Summary +

    +
    +
    +
    +

    + In summary, the JE JE Collections API tutorial has + demonstrated how to create different types of bindings, as well as + how to use the basic facilities of the JE JE Collections API: + the environment, databases, secondary indices, collections, and + transactions. The final approach illustrated by the last example + program, Serializable Entity, uses tuple keys and serial entity + values. Hopefully it is clear that any type of object-to-data + binding may be implemented by an application and used along with + standard Java collections. +

    +

    + The following table summarizes the differences between the + examples in the tutorial. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ExampleKeyValueEntityComments
    + + The Basic Program + + SerialSerialNoThe shipment program
    + + Using Secondary Indices and Foreign keys + + SerialSerialNoSecondary indices and foreign keys
    + + Using Entity Classes + + SerialSerialYesCombining the key and value in a single object
    + + Using Tuples + + TupleSerialYesCompact ordered keys
    + + Using Serializable Entities + + TupleSerialYesOne serializable class for entities and values
    +
    +

    + Having completed this tutorial, you may want to explore how other types of + bindings can be implemented. The bindings shown in this tutorial + are all external bindings, meaning that the data classes + themselves contain none of the binding implementation. It is also + possible to implement internal bindings, where the data + classes implement the binding. +

    +

    + Internal bindings are called marshalled bindings in the + JE JE Collections API, and in this model each data class + implements a marshalling interface. A single external binding class + that understands the marshalling interface is used to call the + internal bindings of each data object, and therefore the overall + model and API is unchanged. To learn about marshalled bindings, see + the + + + + marshal and factory examples that + came with your JE distribution (you can find them in + <INSTALL_DIR>/examples/collections/ship + + where <INSTALL_DIR> is the location where you + unpacked your JE distribution). + + + These examples continue building on + the example programs used in the tutorial. The Marshal program is + the next program following the Serializable Entity program, and the + Factory program follows the Marshal program. The source code + comments in these examples explain their differences. +

    +
    + + + diff --git a/docs/collections/tutorial/Tuple.html b/docs/collections/tutorial/Tuple.html new file mode 100644 index 0000000..57b81d2 --- /dev/null +++ b/docs/collections/tutorial/Tuple.html @@ -0,0 +1,209 @@ + + + + + + Chapter 5.  Using Tuples + + + + + + + + + +
    +
    +
    +
    +

    Chapter 5.  + Using Tuples +

    +
    +
    +
    + +

    + JE JE Collections API tuples are sequences of + primitive Java data types, for example, integers and strings. The + tuple format is a binary format for tuples that can be used + to store keys and/or values. +

    +

    + Tuples are useful as keys because they have a meaningful sort + order, while serialized objects do not. This is because the binary + data for a tuple is written in such a way that its raw byte + ordering provides a useful sort order. For example, strings in + tuples are written with a null terminator rather than with a + leading length. +

    +

    + Tuples are useful as keys or values when reducing the + record size to a minimum is important. A tuple is significantly + smaller than an equivalent serialized object. However, unlike + serialized objects, tuples cannot contain complex data types and + are not easily extended except by adding fields at the end of the + tuple. +

    +

    + Whenever a tuple format is used, except when the key or value + class is a Java primitive wrapper class, a tuple binding class must + be implemented to map between the Java object and the tuple fields. + Because of this extra requirement, and because tuples are not + easily extended, a useful technique shown in this example is to use + tuples for keys and serialized objects for values. This provides + compact ordered keys but still allows arbitrary Java objects as + values, and avoids implementing a tuple binding for each value + class. +

    +

    + Compare this example to the prior Entity example and you'll see + that the Sample class has not changed. When changing a + database format, while new bindings are needed to map key and value + objects to the new format, the application using the objects often + does not need to be modified. +

    +

    + The complete source of the final version of the example program + is included in the Berkeley DB distribution. +

    +
    +
    +
    +
    +

    + Using the Tuple Format +

    +
    +
    +
    +

    + Tuples are sequences of primitive Java values that can be + written to, and read from, the raw data bytes of a stored record. + The primitive values are written or read one at a time in sequence, + using the JE JE Collections API + TupleInput + + and + TupleOutput + + classes. These classes are very similar to the standard Java + DataInput + + and + DataOutput + + interfaces. The primary difference is the binary format of the + data, which is designed for sorting in the case of tuples. +

    +

    + For example, to read and write a tuple containing two string + values, the following code snippets could be used. +

    + +
    import com.sleepycat.bind.tuple.TupleInput;
    +import com.sleepycat.bind.tuple.TupleOutput;
    +...
    +TupleInput input;
    +TupleOutput output;
    +...
    +String partNumber = input.readString();
    +String supplierNumber = input.readString();
    +...
    +output.writeString(partNumber);
    +output.writeString(supplierNumber);  
    +

    + Since a tuple is defined as an ordered sequence, reading and + writing order must match. If the wrong data type is read (an + integer instead of string, for example), an exception may be thrown + or at minimum invalid data will be read. +

    +

    + When the tuple format is used, bindings and key creators must + read and write tuples using the tuple API as shown above. This will + be illustrated in the next two sections. +

    +
    +
    + + + diff --git a/docs/collections/tutorial/UsingCollectionsAPI.html b/docs/collections/tutorial/UsingCollectionsAPI.html new file mode 100644 index 0000000..20ea3b6 --- /dev/null +++ b/docs/collections/tutorial/UsingCollectionsAPI.html @@ -0,0 +1,358 @@ + + + + + + Using the JE JE Collections API + + + + + + + + + +
    +
    +
    +
    +

    + Using the JE JE Collections API +

    +
    +
    +
    + +

    + An + Environment + + + manages the resources for one or more data stores. A + Database + + + object + represents a single database and is created via a method on the + environment object. + SecondaryDatabase + + + objects represent an index associated with a primary database. + + + + Primary and secondary databases are then used to create stored + collection objects, as described in + + Using Stored Collections + . +

    +
    +
    +
    +
    +

    + Using Transactions +

    +
    +
    +
    +

    + Once you have an environment, one or more databases, and one or + more stored collections, you are ready to access (read and write) + stored data. For a transactional environment, a transaction must be + started before accessing data, and must be committed or aborted + after access is complete. The JE JE Collections API provides several + ways of managing transactions. +

    +

    + The recommended technique is to use the + TransactionRunner + + class along with your own implementation of the + TransactionWorker + + interface. + TransactionRunner + + will call your + TransactionWorker + + implementation class to perform the data access or work of the + transaction. This technique has the following benefits: +

    +
    +
      +
    • +

      + Transaction exceptions will be handled transparently and + retries will be performed when deadlocks are detected. +

      +
    • +
    • +

      + The transaction will automatically be committed if your + TransactionWorker.doWork() + + method returns normally, or will be + aborted if doWork() throws an exception. +

      +
    • +
    • +

      + TransactionRunner can be used for non-transactional + environments as well, allowing you to write your application + independently of the environment. +

      +
    • +
    +
    +

    + If you don't want to use + TransactionRunner, + the alternative is to use the + CurrentTransaction + + class. +

    +
    +
      +
    1. +

      + Obtain a CurrentTransaction instance by calling the + CurrentTransaction.getInstance + + method. The instance returned + can be used by all threads in a program. +

      +
    2. +
    3. +

      + Use + CurrentTransaction.beginTransaction(), + CurrentTransaction.commitTransaction() + + and + CurrentTransaction.abortTransaction() + + to directly begin, commit and abort transactions. +

      +
    4. +
    +
    +

    + If you choose to use CurrentTransaction directly you must handle + the + LockConflictException + + + + exception and perform retries yourself. Also note that + CurrentTransaction may only be used in a transactional + environment. +

    +

    + The JE JE Collections API supports transaction auto-commit. + If no transaction is active and a write operation is requested for + a transactional database, auto-commit is used automatically. +

    +

    + The JE JE Collections API also supports transaction + dirty-read via the + StoredCollections + + class. When dirty-read is enabled for a collection, data will be + read that has been modified by another transaction but not + committed. Using dirty-read can improve concurrency since reading + will not wait for other transactions to complete. For a + non-transactional container, dirty-read has no effect. See + StoredCollections + + for how to create a dirty-read collection. +

    +
    +
    +
    +
    +
    +

    + Transaction Rollback +

    +
    +
    +
    +

    + When a transaction is aborted (or rolled back) the application + is responsible for discarding references to any data objects that + were modified during the transaction. Since the JE JE Collections API + treats data by value, not by reference, neither the data + objects nor the JE JE Collections API objects contain status + information indicating whether the data objects are 1- in sync with + the database, 2- dirty (contain changes that have not been written + to the database), 3- stale (were read previously but have become + out of sync with changes made to the database), or 4- contain + changes that cannot be committed because of an aborted + transaction. +

    +

    + For example, a given data object will reflect the current state + of the database after reading it within a transaction. If the + object is then modified it will be out of sync with the database. + When the modified object is written to the database it will then be + in sync again. But if the transaction is aborted the object will + then be out of sync with the database. References to objects for aborted + transactions + should no longer be used. When these objects are needed later they + should be read fresh from the database. +

    +

    + When an existing stored object is to be updated, special care + should be taken to read the data, then modify it, and then write it + to the database, all within a single transaction. If a stale data + object (an object that was read previously but has since been + changed in the database) is modified and then written to the + database, database changes may be overwritten unintentionally. +

    +

    + When an application enforces rules about concurrent access to + specific data objects or all data objects, the rules described here + can be relaxed. For example, if the application knows that a + certain object is only modified in one place, it may be able to + reliably keep a current copy of that object. In that case, it is + not necessary to reread the object before updating it. That said, + if arbitrary concurrent access is to be supported, the safest + approach is to always read data before modifying it within a single + transaction. +

    +

    + Similar concerns apply to using data that may have become stale. + If the application depends on current data, it should be read fresh + from the database just before it is used. +

    +
    +
    +
    +
    +
    +

    + Access Method Restrictions +

    +
    +
    +
    +

    + The BTREE access method is always used for JE Databases. Sorted + duplicates — more then one record for a single key — are + optional. +

    +

    + The restrictions imposed by the access method on the database + model are: +

    +
    +
      +
    • +

      + If duplicates are allowed then more than one value may be + associated with the same key. This means that the data store cannot + be strictly considered a map — it is really a multi-map. See + + Using Stored Collections + + for implications on the use of the collection interfaces. +

      +
    • +
    • +

      + If duplicate keys are allowed for a data store then the data + store may not have secondary indices. +

      +
    • +
    • +

      + With sorted duplicates, all values for the same key must be + distinct. +

      +
    • +
    +
    +

    + See + + Using Stored Collections + + for more information on how access methods impact the use of stored + collections. +

    +
    +
    + + + diff --git a/docs/collections/tutorial/UsingSecondaries.html b/docs/collections/tutorial/UsingSecondaries.html new file mode 100644 index 0000000..55a9e3b --- /dev/null +++ b/docs/collections/tutorial/UsingSecondaries.html @@ -0,0 +1,447 @@ + + + + + + Chapter 3.  Using Secondary Indices and Foreign keys + + + + + + + + + +
    +
    +
    +
    +

    Chapter 3.  + Using Secondary Indices and Foreign keys +

    +
    +
    +
    + +

    + In the Basic example, each store has a single primary + key. The Index example extends the Basic example to add the use of + secondary keys and foreign keys. +

    +

    + The complete source of the final version of the example program + is included in the Berkeley DB distribution. +

    +
    +
    +
    +
    +

    + Opening Secondary Key Indices +

    +
    +
    +
    +

    + Secondary indices or secondary databases are used + to access a primary database by a key other than the primary key. + Recall that the Supplier Number field is the primary key of the + Supplier database. In this section, the Supplier City field will be + used as a secondary lookup key. Given a city value, we would like + to be able to find the Suppliers in that city. Note that more than + one Supplier may be in the same city. +

    +

    + Both primary and secondary databases contain key-value records. + The key of an index record is the secondary key, and its value is + the key of the associated record in the primary database. When lookups by + secondary key are performed, the associated record in the primary + database is transparently retrieved by its primary key and returned + to the caller. +

    +

    + Secondary indices are maintained automatically when index key + fields (the City field in this case) are added, modified or removed + in the records of the primary database. However, the application + must implement a + SecondaryKeyCreator + + + that extracts the index key from the database record. +

    +

    + It is useful to contrast opening an secondary index with opening + a primary database (as described earlier in + + Opening and Closing Databases + . +

    +
    +
      +
    • +

      + A primary database may be associated with one or more secondary + indices. A secondary index is always associated with exactly one + primary database. +

      +
    • +
    • +

      + For a secondary index, a + SecondaryKeyCreator + + + must be implemented by the application to extract the index key + from the record of its associated primary database. +

      +
    • +
    • +

      + A primary database is represented by a + Database + + + object and a secondary index is represented by a + SecondaryDatabase + + + object. The + SecondaryDatabase + + + class extends the + Database + + + class. +

      +
    • +
    • +

      + When a + SecondaryDatabase + + + is created it is associated with a primary + Database + + + object and a + + SecondaryKeyCreator. + + +

      +
    • +
    +
    +

    + The SampleDatabase class is extended to open the + Supplier-by-City secondary key index. +

    + +
    import com.sleepycat.bind.serial.SerialSerialKeyCreator;
    +import com.sleepycat.je.SecondaryConfig;
    +import com.sleepycat.je.SecondaryDatabase;
    +...
    +public class SampleDatabase
    +{
    +    ...
    +    private static final String SUPPLIER_CITY_INDEX = 
    +        "supplier_city_index";
    +    ...
    +    private SecondaryDatabase supplierByCityDb;
    +    ...
    +    public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        ...
    +        SecondaryConfig secConfig = new SecondaryConfig();
    +        secConfig.setTransactional(true);
    +        secConfig.setAllowCreate(true);
    +        secConfig.setSortedDuplicates(true);
    +
    +        secConfig.setKeyCreator(
    +            new SupplierByCityKeyCreator(javaCatalog,
    +                                         SupplierKey.class,
    +                                         SupplierData.class,
    +                                         String.class));
    +
    +        supplierByCityDb = env.openSecondaryDatabase(null, 
    +                                                     SUPPLIER_CITY_INDEX,
    +                                                     supplierDb,
    +                                                     secConfig);
    +    ...
    +    }
    +} 
    +

    + A + SecondaryConfig + + + object is used to configure the secondary database. The + SecondaryConfig + + + class extends the + DatabaseConfig + + + class, and most steps for configuring a secondary database are the + same as for configuring a primary database. The main difference in + the example above is that the + SecondaryConfig.setSortedDuplicates() method is called to + allow duplicate index keys. This is how more than one Supplier may + be in the same City. If this property is not specified, the default is + that the index keys of all records must be unique. +

    +

    + For a primary database, duplicate keys are not normally used + since a primary database with duplicate keys may not have any + associated secondary indices. If primary database keys are not + unique, there is no way for a secondary key to reference a specific + record in the primary database. +

    +

    + Opening a secondary key index requires creating a + + SecondaryKeyCreator. + + + The SupplierByCityKeyCreator class implements the + SecondaryKeyCreator + + + interface and will be defined below. +

    +

    + The + SecondaryDatabase + + + object is opened last. If you compare the + openSecondaryDatabase() and openDatabase() methods you'll + notice only two differences: +

    +
    +
      +
    • +

      + openSecondaryDatabase() has an extra parameter for + specifying the associated primary database. The primary database is + supplierDb in this case. +

      +
    • +
    • +

      + The last parameter of openSecondaryDatabase() is a + SecondaryConfig instead of a DatabaseConfig. +

      +
    • +
    +
    +

    + How to use the secondary index to access records will be shown + in a later section. +

    +

    + The application-defined SupplierByCityKeyCreator class is + shown below. It was used above to configure the secondary + database. +

    + +
    public class SampleDatabase
    +{
    +...
    +    private static class SupplierByCityKeyCreator
    +        extends SerialSerialKeyCreator
    +    {
    +        private SupplierByCityKeyCreator(ClassCatalog catalog,
    +                                      Class primaryKeyClass,
    +                                      Class valueClass,
    +                                      Class indexKeyClass)
    +        {
    +            super(catalog, primaryKeyClass, valueClass, indexKeyClass);
    +        }
    +
    +        public Object createSecondaryKey(Object primaryKeyInput,
    +                                         Object valueInput)
    +        {
    +            SupplierData supplierData = (SupplierData) valueInput;
    +            return supplierData.getCity();
    +        }
    +    }
    +...
    +} 
    +

    + In general, a key creator class must implement the + SecondaryKeyCreator + + + interface. This interface has methods that operate on the record + data as raw bytes. In practice, it is easiest to use an abstract + base class that performs the conversion of record data to and from + the format defined for the database's key and value. The base class + implements the + SecondaryKeyCreator + + + interface and has abstract methods that must be implemented in turn + by the application. +

    +

    + In this example the + SerialSerialKeyCreator + + base class is used because the database record uses the serial + format for both its key and its value. The abstract methods of this + class have key and value parameters of type + Object + + which are automatically converted to and from the raw record data + by the base class. +

    +

    + To perform the conversions properly, the key creator must be + aware of all three formats involved: the key format of the primary + database record, the value format of the primary database record, + and the key format of the index record. The + SerialSerialKeyCreator + + constructor is given the base classes for these three formats as + parameters. +

    +

    + The SerialSerialKeyCreator.createSecondaryKey method is + given the key and value of the primary database record as + parameters, and it returns the key of the index record. In this + example, the index key is a field in the primary database record + value. Since the record value is known to be a SupplierData + object, it is cast to that class and the city field is + returned. +

    +

    + Note that the primaryKeyInput parameter is not used in + the example. This parameter is needed only when an index key is + derived from the key of the primary database record. Normally an + index key is derived only from the primary database record value, + but it may be derived from the key, value or both. +

    +

    + The following getter methods return the secondary database + object for use by other classes in the example program. The + secondary database object is used to create Java collections for + accessing records via their secondary keys. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public final SecondaryDatabase getSupplierByCityDatabase()
    +    {
    +        return supplierByCityDb;
    +    }
    +    ...
    +} 
    +

    + The following statement closes the secondary database. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public void close()
    +        throws DatabaseException {
    +
    +        supplierByCityDb.close();
    +        partDb.close();
    +        supplierDb.close();
    +        shipmentDb.close();
    +        javaCatalog.close();
    +        env.close();
    +    }
    +    ...
    +} 
    +

    + Secondary databases must be closed before closing their + associated primary database. +

    +
    +
    + + + diff --git a/docs/collections/tutorial/UsingStoredCollections.html b/docs/collections/tutorial/UsingStoredCollections.html new file mode 100644 index 0000000..8d20fa1 --- /dev/null +++ b/docs/collections/tutorial/UsingStoredCollections.html @@ -0,0 +1,661 @@ + + + + + + Using Stored Collections + + + + + + + + + +
    +
    +
    +
    +

    + Using Stored Collections +

    +
    +
    +
    + +

    + When a stored collection is created it is based on either a + Database + + + or a + + SecondaryDatabase. + + + When a database is used, the primary key of the database is used as + the collection key. When a secondary database is used, the index + key is used as the collection key. Indexed collections can be used + for reading elements and removing elements but not for adding or + updating elements. +

    +
    +
    +
    +
    +

    + Stored Collection and Access Methods +

    +
    +
    +
    +

    + The use of stored collections is constrained in certain respects as + described below. + +

    +
    + +
    +
    +
    +
    +
    +
    +

    + Stored Collections Versus Standard Java Collections +

    +
    +
    +
    +

    + Stored collections have the following differences with the + standard Java collection interfaces. Some of these are interface + contract violations. +

    +

    + The Java collections interface does not support duplicate keys + (multi-maps or multi-sets). When the access method allows duplicate + keys, the collection interfaces are defined as follows. +

    +
    +
      +
    • +

      + Map.entrySet() + + may contain multiple + Map.Entry + + objects with the same key. +

      +
    • +
    • +

      + Map.keySet() + + always contains unique keys, it does not contain duplicates. +

      +
    • +
    • +

      + Map.values() + + contains all values including the values + associated with duplicate keys. +

      +
    • +
    • +

      + Map.put() + + appends a duplicate if the key already exists rather than replacing + the existing value, and always returns null. +

      +
    • +
    • +

      + Map.remove() + + removes all duplicates for the specified key. +

      +
    • +
    • +

      + Map.get() + + returns the first duplicate for the specified key. +

      +
    • +
    • +

      + StoredSortedMap.duplicates() + + is an additional method for returning the values for a given key as a + Collection. +

      +
    • +
    +
    +

    + Other differences are: +

    +
    +
      +
    • +

      + Collection.size() and Map.size() always throws + UnsupportedOperationException. + This is because the number of + records in a database cannot be determined reliably or + cheaply. +

      +
    • +
    • +

      + Because the size() method cannot be used, the bulk operation + methods of standard Java collections cannot be passed stored + collections as parameters, since the implementations rely on + size(). However, the bulk operation methods of stored collections + can be passed standard Java collections as parameters. + storedCollection.addAll(standardCollection) is allowed + while standardCollection.addAll(storedCollection) is + not allowed. This restriction applies to the standard + collection constructors that take a Collection parameter (copy + constructors), the Map.putAll() method, and the following + Collection methods: addAll(), containsAll(), removeAll() and + retainAll(). +

      +
    • +
    • +

      + Comparator + + objects cannot be used and the + SortedMap.comparator() + + and + SortedSet.comparator() + + methods always return null. The + Comparable + + interface is not supported. However, Comparators that operate on + byte arrays may be specified using + + DatabaseConfig.setBtreeComparator. + + +

      +
    • +
    • +

      + The + Object.equals() + + method is not used to determine whether a key + or value is contained in a collection, to locate a value by key, + etc. Instead the byte array representation of the keys and values + are used. However, the equals() method is called for each + key and value when comparing two collections for equality. It is + the responsibility of the application to make sure that the + equals() method returns true if and only if the byte array + representations of the two objects are equal. Normally this occurs + naturally since the byte array representation is derived from the + object's fields. +

      +
    • +
    +
    +
    +
    +
    +
    +
    +

    + Other Stored Collection Characteristics +

    +
    +
    +
    +

    + The following characteristics of stored collections are + extensions of the definitions in the + java.util + + package. These differences do not violate the Java + collections interface contract. +

    +
    +
      +
    • +

      + All stored collections are thread safe (can be used by multiple + threads concurrently). + + Locking is handled by the Berkeley DB Java Edition + environment. To access a collection from multiple threads, creation + of synchronized collections using the + Collections + + class is not necessary. + + Iterators, however, should always be used only by a single thread. +

      +
    • +
    • +

      + All stored collections may be read-only if desired by passing + false for the writeAllowed parameter of their constructor. Creation + of immutable collections using the + Collections + + class is not necessary. +

      +
    • +
    • +

      + A stored collection is partially read-only if a secondary + index is used. Specifically, values may be removed but may not be + added or updated. The following methods will throw + UnsupportedOperationException + + when an index is used: + Collection.add(), + + ListIterator.set() + + and + Map.Entry.setValue(). +

      +
    • +
    • +

      + SortedMap.entrySet() + + and + SortedMap.keySet() + + return a + SortedSet, + not just a + Set + + as specified in Java collections interface. This allows using the + SortedSet + + methods on the returned collection. +

      +
    • +
    • +

      + SortedMap.values() + + returns a + SortedSet, + not just a + Collection, + whenever the keys of the map can be derived from the values using + an entity binding. Note that the sorted set returned is not really + a set if duplicates are allowed, since it is technically a + collection; however, the + SortedSet + + methods (for example, subSet()), can still be used. +

      +
    • +
    • +

      + For + SortedSet + + and + SortedMap + + views, additional subSet() and subMap() methods are provided that + allow control over whether keys are treated as inclusive or + exclusive values in the key range. +

      +
    • +
    • +

      + Keys and values are stored by value, not by reference. This is + because objects that are added to collections are converted to byte + arrays (by bindings) and stored in the database. When they are + retrieved from the collection they are read from the database and + converted from byte arrays to objects. Therefore, the object + reference added to a collection will not be the same as the + reference later retrieved from the collection. +

      +
    • +
    • +

      + A runtime exception, + RuntimeExceptionWrapper, + is thrown whenever database exceptions occur which are not runtime + exceptions. The + RuntimeExceptionWrapper.getCause() + + method can be called to get the underlying exception. +

      +
    • +
    • +

      + All iterators for stored collections implement the + ListIterator + + interface as well as the + Iterator + + interface. This is to allow use of the + ListIterator.hasPrevious() + + and + ListIterator.previous() + + methods, which work for all collections + since Berkeley DB provides bidirectional cursors. +

      +
    • +
    • +

      + All stored collections have a + StoredCollection.iterator(boolean) + + method that allows creating + a read-only iterator for a writable collection. For the standard + Collection.iterator() + + method, the iterator is read-only only + when the collection is read-only. + + +

      +
    • +
    • +

      + Iterator stability for stored collections is greater than the + iterator stability defined by the Java collections interfaces. + Stored iterator stability is the same as the cursor stability + defined by Berkeley DB. +

      +
    • +
    • +

      + When an entity binding is used, updating (setting) a value is + not allowed if the key in the entity is not equal to the original + key. For example, calling + Map.put() + + is not allowed when the key parameter is not equal to the key of + the entity parameter. + Map.put(), + + ListIterator.set(), + and + Map.Entry.setValue() + + will throw + IllegalArgumentException + + in this situation. +

      +
    • +
    • +

      + The + + + + StoredSortedMap.append(java.lang.Object) + + extension method allows + adding a new record with an automatically assigned key. + + An application-defined + PrimaryKeyAssigner + + is used to assign the key value. +

      +
    • +
    +
    +
    +
    +
    +
    +
    +

    + Why Java Collections for Berkeley DB Java Edition +

    +
    +
    +
    +

    + The Java collections interface was chosen as the best Java API + for JE given these requirements: +

    +
    +
      +
    1. +

      + Provide the Java developer with an API that is as familiar and + easy to use as possible. +

      +
    2. +
    3. +

      + Provide access to all, or a large majority, of the features of + the underlying Berkeley DB Java Edition storage system. +

      +
    4. +
    5. +

      + Compared to the JE API, provide a higher-level API + that is oriented toward Java developers. +

      +
    6. +
    7. +

      + For ease of use, support object-to-data bindings, per-thread + transactions, and some traditional database features such as + foreign keys. +

      +
    8. +
    9. +

      + Provide a thin layer that can be thoroughly tested and which + does not significantly impact the reliability and performance of + JE. +

      +
    10. +
    +
    +

    + Admittedly there are several things about the Java Collections + API that don't quite fit with JE or with any transactional + database, and therefore there are some new rules for applying the + Java Collections API. However, these disadvantages are considered + to be smaller than the disadvantages of the alternatives: +

    +
    +
      +
    • +

      + A new API not based on the Java Collections API could have been + designed that maps well to JE but is higher-level. + However, this would require designing an entirely new model. The + exceptions for using the Java Collections API are considered easier + to learn than a whole new model. A new model would also require a + long design stabilization period before being as complete and + understandable as either the Java Collections API or the JE + API. +

      +
    • +
    • +

      + The ODMG API or another object persistence API could have been + implemented on top of JE. However, an object persistence + implementation would add much code and require a long stabilization + period. And while it may work well for applications that require + object persistence, it would probably never perform well enough for + many other applications. +

      +
    • +
    +
    +
    +
    + + + diff --git a/docs/collections/tutorial/addingdatabaseitems.html b/docs/collections/tutorial/addingdatabaseitems.html new file mode 100644 index 0000000..3b474a4 --- /dev/null +++ b/docs/collections/tutorial/addingdatabaseitems.html @@ -0,0 +1,229 @@ + + + + + + Adding Database Items + + + + + + + + + +
    +
    +
    +
    +

    + Adding Database Items +

    +
    +
    +
    +

    + Adding (as well as updating, removing, and deleting) information + in the database is accomplished via the standard Java collections + API. In the example, the + Map.put + + method is used to add objects. All standard Java methods for + modifying a collection may be used with the JE JE Collections API. +

    +

    + The PopulateDatabase.doWork() method calls private methods + for adding objects to each of the three database stores. It is + called via the + TransactionRunner + + class and was outlined in the previous section. +

    + +
    import java.util.Map;
    +import com.sleepycat.collections.TransactionWorker;
    +...
    +public class Sample
    +{
    +    ...
    +    private SampleViews views;
    +    ...
    +    private class PopulateDatabase implements TransactionWorker
    +    {
    +        public void doWork()
    +            throws Exception
    +        {
    +            addSuppliers();
    +            addParts();
    +            addShipments();
    +        }
    +    }
    +    ...
    +
    +    private void addSuppliers()
    +    {
    +    }
    +
    +    private void addParts()
    +    {
    +    }
    +
    +    private void addShipments()
    +    {
    +    }
    +} 
    +

    + The addSuppliers(), addParts() and addShipments() + methods add objects to the Suppliers, Parts and Shipments stores. + The + Map + + for each store is obtained from the SampleViews object. +

    + +
        private void addSuppliers()
    +    {
    +        Map suppliers = views.getSupplierMap();
    +        if (suppliers.isEmpty())
    +        {
    +            System.out.println("Adding Suppliers");
    +            suppliers.put(new SupplierKey("S1"),
    +                          new SupplierData("Smith", 20, "London"));
    +            suppliers.put(new SupplierKey("S2"),
    +                          new SupplierData("Jones", 10, "Paris"));
    +            suppliers.put(new SupplierKey("S3"),
    +                          new SupplierData("Blake", 30, "Paris"));
    +            suppliers.put(new SupplierKey("S4"),
    +                          new SupplierData("Clark", 20, "London"));
    +            suppliers.put(new SupplierKey("S5"),
    +                          new SupplierData("Adams", 30, "Athens"));
    +        }
    +    }
    +
    +    private void addParts()
    +    {
    +        Map parts = views.getPartMap();
    +        if (parts.isEmpty())
    +        {
    +            System.out.println("Adding Parts");
    +            parts.put(new PartKey("P1"),
    +                      new PartData("Nut", "Red",
    +                                    new Weight(12.0, Weight.GRAMS),
    +                                    "London"));
    +            parts.put(new PartKey("P2"),
    +                      new PartData("Bolt", "Green",
    +                                    new Weight(17.0, Weight.GRAMS),
    +                                    "Paris"));
    +            parts.put(new PartKey("P3"),
    +                      new PartData("Screw", "Blue",
    +                                    new Weight(17.0, Weight.GRAMS),
    +                                    "Rome"));
    +            parts.put(new PartKey("P4"),
    +                      new PartData("Screw", "Red",
    +                                    new Weight(14.0, Weight.GRAMS),
    +                                    "London"));
    +            parts.put(new PartKey("P5"),
    +                      new PartData("Cam", "Blue",
    +                                    new Weight(12.0, Weight.GRAMS),
    +                                    "Paris"));
    +            parts.put(new PartKey("P6"),
    +                      new PartData("Cog", "Red",
    +                                    new Weight(19.0, Weight.GRAMS),
    +                                    "London"));
    +        }
    +    }
    +
    +    private void addShipments()
    +    {
    +        Map shipments = views.getShipmentMap();
    +        if (shipments.isEmpty())
    +        {
    +            System.out.println("Adding Shipments");
    +            shipments.put(new ShipmentKey("P1", "S1"),
    +                          new ShipmentData(300));
    +            shipments.put(new ShipmentKey("P2", "S1"),
    +                          new ShipmentData(200));
    +            shipments.put(new ShipmentKey("P3", "S1"),
    +                          new ShipmentData(400));
    +            shipments.put(new ShipmentKey("P4", "S1"),
    +                          new ShipmentData(200));
    +            shipments.put(new ShipmentKey("P5", "S1"),
    +                          new ShipmentData(100));
    +            shipments.put(new ShipmentKey("P6", "S1"),
    +                          new ShipmentData(100));
    +            shipments.put(new ShipmentKey("P1", "S2"),
    +                          new ShipmentData(300));
    +            shipments.put(new ShipmentKey("P2", "S2"),
    +                          new ShipmentData(400));
    +            shipments.put(new ShipmentKey("P2", "S3"),
    +                          new ShipmentData(200));
    +            shipments.put(new ShipmentKey("P2", "S4"),
    +                          new ShipmentData(200));
    +            shipments.put(new ShipmentKey("P4", "S4"),
    +                          new ShipmentData(300));
    +            shipments.put(new ShipmentKey("P5", "S4"),
    +                          new ShipmentData(400));
    +        }
    +    } 
    +}
    +

    + The key and value classes used above were defined in the + + Defining Serialized Key and Value Classes + . +

    +

    + In each method above, objects are added only if the map is not + empty. This is a simple way of allowing the example program to be + run repeatedly. In real-life applications another technique — + checking the + Map.containsKey + + method, for example — might be used. +

    +
    + + + diff --git a/docs/collections/tutorial/collectionOverview.html b/docs/collections/tutorial/collectionOverview.html new file mode 100644 index 0000000..73026e6 --- /dev/null +++ b/docs/collections/tutorial/collectionOverview.html @@ -0,0 +1,451 @@ + + + + + + Appendix A.  API Notes and Details + + + + + + + + + +
    +
    +
    +
    +

    Appendix A.  + API Notes and Details +

    +
    +
    +
    +

    + This appendix contains information useful to the collections programmer + that is too detailed to easily fit into the format of a tutorial. + Specifically, this appendix contains the following information: +

    + +
    +
    +
    +
    +

    + Using Data Bindings +

    +
    +
    +
    + +

    + Data bindings determine how keys and values are represented as + stored data (byte arrays) in the database, and how stored data is + converted to and from Java objects. +

    +

    + The selection of data bindings is, in general, independent of + the selection of + + collection views. In other + words, any binding can be used with any + + collection. + +

    +
    +

    Note

    +

    + In this document, bindings are described in the + context of their use for stored data in a database. However, + bindings may also be used independently of a database to operate on + an arbitrary byte array. This allows using bindings when data is to + be written to a file or sent over a network, for example. +

    +
    +
    +
    +
    +
    +

    + Selecting Binding Formats +

    +
    +
    +
    +

    + For the key and value of each stored collection, you may select + one of the following types of bindings. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Binding FormatOrderedDescription
    + SerialBinding + + No + The data is stored using a compact form of Java serialization, + where the class descriptions are stored separately in a catalog + database. Arbitrary Java objects are supported. +
    + TupleBinding + + Yes + The data is stored using a series of fixed length primitive + values or zero terminated character arrays (strings). Class/type + evolution is not supported. +
    Custom binding formatUser-defined + The data storage format and ordering is determined by the + custom binding implementation. +
    +
    +

    + As shown in the table above, the tuple format supports built-in ordering + (without specifying a custom comparator), while the serial format does + not. This means that when a specific key order is needed, tuples should + be used instead of serial data. Alternatively, a custom Btree comparator should be + specified using + DatabaseConfig.setBtreeComparator(). Note that + a custom Btree comparator will usually execute more slowly than the + default byte-by-byte comparison. This makes using tuples an attractive + option, since they provide ordering along with optimal performance. +

    +

    + The tuple binding uses less space and executes faster than the + serial binding. But once a tuple is written to a database, the + order of fields in the tuple may not be changed and fields may not + be deleted. The only type evolution allowed is the addition of + fields at the end of the tuple, and this must be explicitly + supported by the custom binding implementation. +

    +

    + The serial binding supports the full generality of Java + serialization including type evolution. But serialized data can + only be accessed by Java applications, its size is larger, and its + bindings are slower to execute. +

    +
    +
    +
    +
    +
    +

    + Selecting Data Bindings +

    +
    +
    +
    +

    + There are two types of binding interfaces. Simple entry bindings + implement the + EntryBinding + + interface and can be used for key or value objects. Entity bindings + implement the + EntityBinding + + interface and are used for combined key and value objects called + entities. +

    +

    + Simple entry bindings map between the key or value data stored + by Berkeley DB and a key or value object. This is a simple + one-to-one mapping. +

    +

    + Simple entry bindings are easy to implement and in some cases + require no coding. For example, a + SerialBinding + + can be used for keys or values without writing any additional + code. A tuple binding for a single-item tuple can also be used without + writing any code; see the + TupleBinding.getPrimitiveBinding + + method. +

    +

    + Entity bindings must divide an entity object into its key and + value data, and then combine the key and value data to re-create + the entity object. This is a two-to-one mapping. +

    +

    + Entity bindings are useful when a stored application object + naturally has its primary key as a property, which is very common. + For example, an Employee object would naturally have an + EmployeeNumber property (its primary key) and an entity binding + would then be needed. Of course, entity bindings are more complex + to implement, especially if their key and data formats are + different. +

    +

    + Note that even when an entity binding is used a key binding is + also usually needed. For example, a key binding is used to create + key objects that are passed to the + Map.get() + + method. A key object is passed to this method even though it may + return an entity that also contains the key. +

    +
    +
    +
    +
    +
    +

    + Implementing Bindings +

    +
    +
    +
    +

    + There are two ways to implement bindings. The first way is to + create a binding class that implements one of the two binding + interfaces, + EntryBinding + + or + EntityBinding. + For tuple bindings and serial bindings there are a number of + abstract classes that make this easier. For example, you can extend + TupleBinding + + to implement a simple binding for a tuple key or value. Abstract + classes are also provided for entity bindings and are named after + the format names of the key and value. For example, you can extend + TupleSerialBinding + + to implement an entity binding with a tuple key and serial + value. +

    +

    + Another way to implement bindings is with marshalling + interfaces. These are interfaces which perform the binding + operations and are implemented by the key, value or entity classes + themselves. With marshalling you use a binding which calls the + marshalling interface and you implement the marshalling interface + for each key, value or entity class. For example, you can use + TupleMarshalledBinding + + along with key or value classes that implement the + MarshalledTupleEntry + + interface. +

    +
    +
    +
    +
    +
    +

    + Using Bindings +

    +
    +
    +
    +

    + Bindings are specified whenever a stored collection is created. + A key binding must be specified for map, key set and entry set + views. A value binding or entity binding must be specified for map, + value set and entry set views. +

    +

    + Any number of bindings may be created for the same stored data. + This allows multiple views over the same data. For example, a tuple + might be bound to an array of values or to a class with properties + for each object. +

    +

    + It is important to be careful of bindings that only use a subset + of the stored data. This can be useful to simplify a view or to + hide information that should not be accessible. However, if you + write records using these bindings you may create stored data that + is invalid from the application's point of view. It is up to the + application to guard against this by creating a read-only + collection when such bindings are used. +

    +
    +
    +
    +
    +
    +

    + Secondary Key Creators +

    +
    +
    +
    +

    + Secondary Key Creators are needed whenever database indices are + used. For each secondary index + + (SecondaryDatabase) + + + a key creator is used to derive index key data from key/value data. + Key creators are objects whose classes implement the + SecondaryKeyCreator + + + interface. +

    +

    + Like bindings, key creators may be implemented using a separate + key creator class or using a marshalling interface. Abstract key + creator classes and marshalling interfaces are provided in the + com.sleepycat.bind.tuple and com.sleepycat.bind.serial + packages. +

    +

    + Unlike bindings, key creators fundamentally operate on key and + value data, not necessarily on the objects derived from the data by + bindings. In this sense key creators are a part of a database + definition, and may be independent of the various bindings that may + be used to view data in a database. However, key creators are not + prohibited from using higher level objects produced by bindings, + and doing so may be convenient for some applications. For example, + marshalling interfaces, which are defined for objects produced by + bindings, are a convenient way to define key creators. +

    +
    +
    +
    + + + diff --git a/docs/collections/tutorial/collectionswithentities.html b/docs/collections/tutorial/collectionswithentities.html new file mode 100644 index 0000000..31c4238 --- /dev/null +++ b/docs/collections/tutorial/collectionswithentities.html @@ -0,0 +1,164 @@ + + + + + + Creating Collections with Entity Bindings + + + + + + + + + +
    +
    +
    +
    +

    + Creating Collections with Entity Bindings +

    +
    +
    +
    +

    + Stored map objects are created in this example in the same way + as in prior examples, but using entity bindings in place of value + bindings. All value objects passed and returned to the Java + collections API are then actually entity objects (Part, + Supplier and Shipment). The application no longer + deals directly with plain value objects (PartData, + SupplierData and ShipmentData). +

    +

    + Since the partDataBinding, supplierDataBinding + and shipmentDataBinding were defined as entity bindings in + the prior section, there are no source code changes necessary for + creating the stored map objects. +

    + +
    public class SampleViews
    +{
    +    ...
    +    public SampleViews(SampleDatabase db)
    +    {
    +        ...
    +        partMap =
    +            new StoredSortedMap(db.getPartDatabase(),
    +                          partKeyBinding, partDataBinding, true);
    +        supplierMap =
    +            new StoredSortedMap(db.getSupplierDatabase(),
    +                          supplierKeyBinding, supplierDataBinding, true);
    +        shipmentMap =
    +            new StoredSortedMap(db.getShipmentDatabase(),
    +                          shipmentKeyBinding, shipmentDataBinding, true);
    +      ...
    +    } 
    +

    + Specifying an + EntityBinding + + will select a different + StoredSortedMap + + constructor, but the syntax is the same. In general, an entity + binding may be used anywhere that a value binding is used. +

    +

    + The following getter methods are defined for use by other + classes in the example program. Instead of returning the map's + entry set + (Map.entrySet), + the map's value set + (Map.values) + is returned. The entry set was convenient in prior examples because + it allowed enumerating all key/value pairs in the collection. Since + an entity contains the key and the value, enumerating the value set + can now be used more conveniently for the same purpose. +

    + +
    import com.sleepycat.collections.StoredValueSet;
    +...
    +public class SampleViews
    +{
    +    ...
    +    public StoredValueSet getPartSet()
    +    {
    +        return (StoredValueSet) partMap.values();
    +    }
    +
    +    public StoredValueSet getSupplierSet()
    +    {
    +        return (StoredValueSet) supplierMap.values();
    +    }
    +
    +    public StoredValueSet getShipmentSet()
    +    {
    +        return (StoredValueSet) shipmentMap.values();
    +    }
    +    ...
    +} 
    +

    + Notice that the collection returned by the + StoredSortedMap.values + + method is actually a + StoredValueSet + + and not just a + Collection + + as defined by the + Map.values + + interface. As long as duplicate keys are not allowed, this + collection will behave as a true set and will disallow the addition + of duplicates, etc. +

    +
    + + + diff --git a/docs/collections/tutorial/createbindingscollections.html b/docs/collections/tutorial/createbindingscollections.html new file mode 100644 index 0000000..5224e83 --- /dev/null +++ b/docs/collections/tutorial/createbindingscollections.html @@ -0,0 +1,283 @@ + + + + + + Creating Bindings and Collections + + + + + + + + + +
    +
    +
    +
    +

    + Creating Bindings and Collections +

    +
    +
    +
    +

    + Bindings translate between stored records and Java objects. + In this example, Java serialization bindings are used. Serial + bindings are the simplest type of bindings because no mapping of + fields or type conversion is needed. Tuple bindings — which are + more difficult to create than serial bindings but have some + advantages — will be introduced later in the Tuple example + program. +

    +

    + Standard Java collections are used to access records in a + database. Stored collections use bindings transparently to convert + the records to objects when they are retrieved from the collection, + and to convert the objects to records when they are stored in the + collection. +

    +

    + An important characteristic of stored collections is that they + do not perform object caching. Every time an object is + accessed via a collection it will be added to or retrieved from the + database, and the bindings will be invoked to convert the data. + Objects are therefore always passed and returned by value, not by + reference. Because Berkeley DB is an embedded database, efficient + caching of stored raw record data is performed by the database library. +

    +

    + The SampleViews class is used to create the bindings and + collections. This class is separate from the SampleDatabase + class to illustrate the idea that a single set of stored data can + be accessed via multiple bindings and collections, or views. + The skeleton for the SampleViews class follows. +

    + +
    import com.sleepycat.bind.EntryBinding;
    +import com.sleepycat.bind.serial.ClassCatalog;
    +import com.sleepycat.bind.serial.SerialBinding;
    +import com.sleepycat.collections.StoredEntrySet;
    +import com.sleepycat.collections.StoredSortedMap;
    +...
    +
    +public class SampleViews
    +{
    +    private StoredSortedMap partMap;
    +    private StoredSortedMap supplierMap;
    +    private StoredSortedMap shipmentMap;
    +
    +    ...
    +    public SampleViews(SampleDatabase db)
    +    {
    +    }
    +} 
    +

    + A + StoredSortedMap + + field is used for each database. The StoredSortedMap class implements the + standard Java + Map + + interface, which has methods for obtaining a + Set + + of keys, a + Collection + + of values, or a + Set + + of + Map.Entry + + key/value pairs. Because databases contain key/value pairs, any + Berkeley DB database may be represented as a Java map. +

    +

    + The following statements create the key and data bindings using + the + SerialBinding + + class. +

    + +
        public SampleViews(SampleDatabase db)
    +    {
    +        ClassCatalog catalog = db.getClassCatalog();
    +        EntryBinding partKeyBinding =
    +            new SerialBinding(catalog, PartKey.class);
    +        EntryBinding partDataBinding =
    +            new SerialBinding(catalog, PartData.class);
    +        EntryBinding supplierKeyBinding =
    +            new SerialBinding(catalog, SupplierKey.class);
    +        EntryBinding supplierDataBinding =
    +            new SerialBinding(catalog, SupplierData.class);
    +        EntryBinding shipmentKeyBinding =
    +            new SerialBinding(catalog, ShipmentKey.class);
    +        EntryBinding shipmentDataBinding =
    +            new SerialBinding(catalog, ShipmentData.class);
    +        ...
    +    } 
    +

    + The first parameter of the + SerialBinding + + constructor is the class catalog, and is used to store the class + descriptions of the serialized objects. +

    +

    + The second parameter is the base class for the serialized + objects and is used for type checking of the stored objects. If + null or Object.class is specified, then any Java + class is allowed. Otherwise, all objects stored in that format must + be instances of the specified class or derived from the specified + class. In the example, specific classes are used to enable strong + type checking. +

    +

    + The following statements create standard Java maps using the + StoredSortedMap + + class. +

    + +
        public SampleViews(SampleDatabase db)
    +    {
    +        ...
    +        partMap =
    +            new StoredSortedMap(db.getPartDatabase(),
    +                          partKeyBinding, partDataBinding, true);
    +        supplierMap =
    +            new StoredSortedMap(db.getSupplierDatabase(),
    +                          supplierKeyBinding, partDataBinding, true);
    +        shipmentMap =
    +            new StoredSortedMap(db.getShipmentDatabase(),
    +                          shipmentKeyBinding, partDataBinding, true);
    +    ...
    +    } 
    +

    + The first parameter of the + StoredSortedMap + + constructor is the database. In a StoredSortedMap, the database keys (the primary + keys) are used as the map keys. The Index + example shows how to use secondary index keys as map keys. +

    +

    + The second and third parameters are the key and value bindings + to use when storing and retrieving objects via the map. +

    +

    + The fourth and last parameter specifies whether changes will be + allowed via the collection. If false is passed, the collection will + be read-only. +

    +

    + The following getter methods return the stored maps for use by + other classes in the example program. Convenience methods for + returning entry sets are also included. +

    + +
    public class SampleViews
    +{
    +    ...
    +    public final StoredSortedMap getPartMap()
    +    {
    +        return partMap;
    +    }
    +
    +    public final StoredSortedMap getSupplierMap()
    +    {
    +        return supplierMap;
    +    }
    +
    +    public final StoredSortedMap getShipmentMap()
    +    {
    +        return shipmentMap;
    +    }
    +
    +    public final StoredEntrySet getPartEntrySet()
    +    {
    +        return (StoredEntrySet) partMap.entrySet();
    +    }
    +
    +    public final StoredEntrySet getSupplierEntrySet()
    +    {
    +        return (StoredEntrySet) supplierMap.entrySet();
    +    }
    +
    +    public final StoredEntrySet getShipmentEntrySet()
    +    {
    +        return (StoredEntrySet) shipmentMap.entrySet();
    +    }
    +    ...
    +} 
    +

    + Note that StoredSortedMap and StoredEntrySet are returned rather than + just returning Map and Set. Since StoredSortedMap implements the Map + interface and StoredEntrySet implements the Set interface, you may + ask why Map and Set were not returned directly. +

    +

    + StoredSortedMap, StoredEntrySet, + and other stored collection classes + have a small number of extra methods beyond those in the Java + collection interfaces. The stored collection types are therefore + returned to avoid casting when using the extended methods. + Normally, however, only a Map or Set is needed, and may be used as + follows. +

    + +
        SampleDatabase sd = new SampleDatabase(new String("/home"));
    +    SampleViews views = new SampleViews(sd);
    +    Map partMap = views.getPartMap();
    +    Set supplierEntries = views.getSupplierEntrySet(); 
    +
    + + + diff --git a/docs/collections/tutorial/creatingentitybindings.html b/docs/collections/tutorial/creatingentitybindings.html new file mode 100644 index 0000000..77da81a --- /dev/null +++ b/docs/collections/tutorial/creatingentitybindings.html @@ -0,0 +1,271 @@ + + + + + + Creating Entity Bindings + + + + + + + + + +
    +
    +
    +
    +

    + Creating Entity Bindings +

    +
    +
    +
    +

    + Entity bindings are similar to ordinary bindings in that + they convert between Java objects and the stored data format of + keys and values. In addition, entity bindings map between key/value + pairs and entity objects. An ordinary binding is a one-to-one + mapping, while an entity binding is a two-to-one mapping. +

    +

    + The partDataBinding, supplierDataBinding and + shipmentDataBinding bindings are created below as entity + bindings rather than (in the prior examples) serial bindings. +

    + +
    import com.sleepycat.bind.EntryBinding;
    +import com.sleepycat.bind.EntityBinding;
    +import com.sleepycat.bind.serial.SerialBinding;
    +import com.sleepycat.bind.serial.SerialSerialBinding;
    +...
    +
    +public class SampleViews
    +{
    +    ...
    +    public SampleViews(SampleDatabase db)
    +    {
    +        ClassCatalog catalog = db.getClassCatalog();
    +        SerialBinding partKeyBinding =
    +            new SerialBinding(catalog, PartKey.class);
    +        EntityBinding partDataBinding =
    +            new PartBinding(catalog, PartKey.class, PartData.class);
    +        SerialBinding supplierKeyBinding =
    +            new SerialBinding(catalog, SupplierKey.class);
    +        EntityBinding supplierDataBinding =
    +            new SupplierBinding(catalog, SupplierKey.class,
    +                                SupplierData.class);
    +        SerialBinding shipmentKeyBinding =
    +            new SerialBinding(catalog, ShipmentKey.class);
    +        EntityBinding shipmentDataBinding =
    +            new ShipmentBinding(catalog, ShipmentKey.class,
    +                                ShipmentData.class);
    +        SerialBinding cityKeyBinding =
    +            new SerialBinding(catalog, String.class);
    +        ...
    +    }
    +} 
    +

    + The entity bindings will be used in the next section to + construct stored map objects. +

    +

    + The PartBinding class is defined below. +

    + +
    public class SampleViews
    +{
    +    ...
    +    private static class PartBinding extends SerialSerialBinding {
    +        private PartBinding(ClassCatalog classCatalog,
    +                            Class keyClass,
    +                            Class dataClass)
    +        {
    +            super(classCatalog, keyClass, dataClass);
    +        }
    +
    +        public Object entryToObject(Object keyInput, Object dataInput)
    +        {
    +            PartKey key = (PartKey) keyInput;
    +            PartData data = (PartData) dataInput;
    +            return new Part(key.getNumber(), data.getName(),
    +                            data.getColor(), data.getWeight(), 
    +                            data.getCity());
    +        }
    +
    +        public Object objectToKey(Object object)
    +        {
    +            Part part = (Part) object;
    +            return new PartKey(part.getNumber());
    +        }
    +
    +        public Object objectToData(Object object)
    +        {
    +            Part part = (Part) object;
    +            return new PartData(part.getName(), part.getColor(),
    +                                part.getWeight(), part.getCity());
    +        }
    +    }
    +    ...
    +} 
    +

    + In general, an entity binding is any class that implements the + EntityBinding + + interface, just as an ordinary binding is any class that implements + the + EntryBinding + + interface. In the prior examples the built-in + SerialBinding + + class (which implements + EntryBinding) + was used and no application-defined binding classes were needed. +

    +

    + In this example, application-defined binding classes are used + that extend the + SerialSerialBinding + + abstract base class. This base class implements + EntityBinding + + and provides the conversions between key/value bytes and key/value + objects, just as the + SerialBinding + + class does. The application-defined entity class implements the + abstract methods defined in the base class that map between + key/value objects and entity objects. +

    +

    + Three abstract methods are implemented for each entity binding. + The entryToObject() method takes as input the key and data + objects, which have been deserialized automatically by the base + class. As output, it returns the combined Part entity. +

    +

    + The objectToKey() and objectToData() methods take an + entity object as input. As output they return the part key or data + object that is extracted from the entity object. The key or data + will then be serialized automatically by the base class. +

    +

    + The SupplierBinding and ShipmentBinding classes + are very similar to the PartBinding class. +

    + +
    public class SampleViews
    +{
    +    ...
    +    private static class SupplierBinding extends SerialSerialBinding {
    +        private SupplierBinding(ClassCatalog classCatalog,
    +                                Class keyClass,
    +                                Class dataClass)
    +        {
    +            super(classCatalog, keyClass, dataClass);
    +        }
    +
    +        public Object entryToObject(Object keyInput, Object dataInput)
    +        {
    +            SupplierKey key = (SupplierKey) keyInput;
    +            SupplierData data = (SupplierData) dataInput;
    +            return new Supplier(key.getNumber(), data.getName(),
    +                                data.getStatus(), data.getCity());
    +        }
    +
    +        public Object objectToKey(Object object)
    +        {
    +            Supplier supplier = (Supplier) object;
    +            return new SupplierKey(supplier.getNumber());
    +        }
    +
    +        public Object objectToData(Object object)
    +        {
    +            Supplier supplier = (Supplier) object;
    +            return new SupplierData(supplier.getName(),
    +                                    supplier.getStatus(), 
    +                                    supplier.getCity());
    +        }
    +    }
    +
    +    private static class ShipmentBinding extends SerialSerialBinding {
    +        private ShipmentBinding(ClassCatalog classCatalog,
    +                                Class keyClass,
    +                                Class dataClass)
    +        {
    +            super(classCatalog, keyClass, dataClass);
    +        }
    +
    +        public Object entryToObject(Object keyInput, Object dataInput)
    +        {
    +            ShipmentKey key = (ShipmentKey) keyInput;
    +            ShipmentData data = (ShipmentData) dataInput;
    +            return new Shipment(key.getPartNumber(), 
    +                                key.getSupplierNumber(),
    +                                data.getQuantity());
    +        }
    +
    +        public Object objectToKey(Object object)
    +        {
    +            Shipment shipment = (Shipment) object;
    +            return new ShipmentKey(shipment.getPartNumber(),
    +                                   shipment.getSupplierNumber());
    +        }
    +
    +        public Object objectToData(Object object)
    +        {
    +            Shipment shipment = (Shipment) object;
    +            return new ShipmentData(shipment.getQuantity());
    +        }
    +    }
    +    ...
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/developing.html b/docs/collections/tutorial/developing.html new file mode 100644 index 0000000..28d9ddd --- /dev/null +++ b/docs/collections/tutorial/developing.html @@ -0,0 +1,186 @@ + + + + + + Developing a JE Collections Application + + + + + + + + + +
    +
    +
    +
    +

    Developing a JE Collections Application

    +
    +
    +
    +

    + There are several important choices to make when developing an + application using the JE JE Collections API. +

    +
    +
      +
    1. +

      + Choose the Format for Keys and Values +

      +

      + For each database you may choose a binding format for the keys + and values. For example, the tuple format is useful for keys + because it has a deterministic sort order. The serial format is + useful for values if you want to store arbitrary Java objects. In + some cases a custom format may be appropriate. For details on + choosing a binding format see + + Using Data Bindings + . +

      +
    2. +
    3. +

      + Choose the Binding for Keys and Values +

      +

      + With the serial data format you do not have to create a binding + for each Java class that is stored since Java serialization is + used. But for other formats a binding must be defined that + translates between stored byte arrays and Java objects. For details + see + + Using Data Bindings + . +

      +
    4. +
    5. +

      + Choose Secondary Indices and Foreign Key Indices +

      +

      + Any database that has unique keys may have any number of + secondary indices. A secondary index has keys that are derived from + data values in the primary database. This allows lookup and + iteration of objects in the database by its index keys. + + + A foreign key index is a special type of secondary index where the index keys + are also the primary keys of another primary database. + + + For each index you must define how the index keys are derived from the data + values using a + + SecondaryKeyCreator. + + + For details see the + + + SecondaryDatabase, + + + + SecondaryConfig + + + and + SecondaryKeyCreator + + + classes. +

      +
    6. +
    7. +

      + Choose the Collection Interface for each Database +

      +

      + The standard Java Collection interfaces are used for accessing + databases and secondary indices. The Map and Set interfaces may be + used for any type of database. The Iterator interface is used + through the Set interfaces. For more information on the collection + interfaces see + + Using Stored Collections + . +

      +
    8. +
    +
    +

    + Any number of bindings and collections may be created for the + same database. This allows multiple views of the same stored data. + For example, a data store may be viewed as a Map of keys to values, + a Set of keys, or a Collection of values. String values, for + example, may be used with the built-in binding to the String class, + or with a custom binding to another class that represents the + string values differently. +

    +

    + It is sometimes desirable to use a Java class that encapsulates + both a data key and a data value. For example, a Part object might + contain both the part number (key) and the part name (value). Using + the JE JE Collections API this type of object is called an + "entity". An entity binding is used to translate between the Java + object and the stored data key and value. Entity bindings may be + used with all Collection types. +

    +

    + Please be aware that the provided JE JE Collections API collection classes + do not conform completely to the interface contracts + defined in the java.util package. For example, all + iterators must be explicitly closed and the size() + method is not available. The differences between the JE JE Collections API + collections and the standard Java collections are + documented in + + Stored Collections Versus Standard Java Collections + . +

    +
    + + + diff --git a/docs/collections/tutorial/entitieswithcollections.html b/docs/collections/tutorial/entitieswithcollections.html new file mode 100644 index 0000000..b806b21 --- /dev/null +++ b/docs/collections/tutorial/entitieswithcollections.html @@ -0,0 +1,251 @@ + + + + + + Using Entities with Collections + + + + + + + + + +
    +
    +
    +
    +

    + Using Entities with Collections +

    +
    +
    +
    +

    + In this example entity objects, rather than key and value + objects, are used for adding and enumerating the records in a + collection. Because fewer classes and objects are involved, adding + and enumerating is done more conveniently and more simply than in + the prior examples. +

    +

    + For adding and iterating entities, the collection of entities + returned by + Map.values + + is used. In general, when using an entity binding, all Java + collection methods that are passed or returned a value object will + be passed or returned an entity object instead. +

    +

    + The Sample class has been changed in this example to add + objects using the + Set.add + + method rather than the + Map.put + + method that was used in the prior examples. Entity objects are + constructed and passed to + Set.add. +

    + +
    import java.util.Set;
    +...
    +public class Sample
    +{
    +    ...
    +    private void addSuppliers()
    +    {
    +        Set suppliers = views.getSupplierSet();
    +        if (suppliers.isEmpty())
    +        {
    +            System.out.println("Adding Suppliers");
    +            suppliers.add(new Supplier("S1", "Smith", 20, "London"));
    +            suppliers.add(new Supplier("S2", "Jones", 10, "Paris"));
    +            suppliers.add(new Supplier("S3", "Blake", 30, "Paris"));
    +            suppliers.add(new Supplier("S4", "Clark", 20, "London"));
    +            suppliers.add(new Supplier("S5", "Adams", 30, "Athens"));
    +        }
    +    }
    +
    +    private void addParts()
    +    {
    +        Set parts = views.getPartSet();
    +        if (parts.isEmpty())
    +        {
    +            System.out.println("Adding Parts");
    +            parts.add(new Part("P1", "Nut", "Red",
    +                      new Weight(12.0, Weight.GRAMS), "London"));
    +            parts.add(new Part("P2", "Bolt", "Green",
    +                      new Weight(17.0, Weight.GRAMS), "Paris"));
    +            parts.add(new Part("P3", "Screw", "Blue",
    +                      new Weight(17.0, Weight.GRAMS), "Rome"));
    +            parts.add(new Part("P4", "Screw", "Red",
    +                      new Weight(14.0, Weight.GRAMS), "London"));
    +            parts.add(new Part("P5", "Cam", "Blue",
    +                      new Weight(12.0, Weight.GRAMS), "Paris"));
    +            parts.add(new Part("P6", "Cog", "Red",
    +                      new Weight(19.0, Weight.GRAMS), "London"));
    +        }
    +    }
    +
    +    private void addShipments()
    +    {
    +        Set shipments = views.getShipmentSet();
    +        if (shipments.isEmpty())
    +        {
    +            System.out.println("Adding Shipments");
    +            shipments.add(new Shipment("P1", "S1", 300));
    +            shipments.add(new Shipment("P2", "S1", 200));
    +            shipments.add(new Shipment("P3", "S1", 400));
    +            shipments.add(new Shipment("P4", "S1", 200));
    +            shipments.add(new Shipment("P5", "S1", 100));
    +            shipments.add(new Shipment("P6", "S1", 100));
    +            shipments.add(new Shipment("P1", "S2", 300));
    +            shipments.add(new Shipment("P2", "S2", 400));
    +            shipments.add(new Shipment("P2", "S3", 200));
    +            shipments.add(new Shipment("P2", "S4", 200));
    +            shipments.add(new Shipment("P4", "S4", 300));
    +            shipments.add(new Shipment("P5", "S4", 400));
    +        }
    +    } 
    +

    + Instead of printing the key/value pairs by iterating over the + Map.entrySet + + as done in the prior example, this example + iterates over the entities in the + Map.values + + collection. +

    + +
    import java.util.Iterator;
    +import java.util.Set;
    +...
    +public class Sample
    +{
    +    ...
    +    private class PrintDatabase implements TransactionWorker
    +    {
    +        public void doWork()
    +            throws Exception
    +        {
    +            printValues("Parts",
    +                         views.getPartSet().iterator());
    +            printValues("Suppliers",
    +                         views.getSupplierSet().iterator());
    +            printValues("Suppliers for City Paris",
    +                         views.getSupplierByCityMap().duplicates(
    +                                            "Paris").iterator());
    +            printValues("Shipments",
    +                         views.getShipmentSet().iterator());
    +            printValues("Shipments for Part P1",
    +                         views.getShipmentByPartMap().duplicates(
    +                                            new PartKey("P1")).iterator());
    +            printValues("Shipments for Supplier S1",
    +                         views.getShipmentBySupplierMap().duplicates(
    +                                      new SupplierKey("S1")).iterator());
    +        }
    +    }
    +    ...
    +} 
    +

    + The output of the example program is shown below. +

    +
    Adding Suppliers
    +Adding Parts
    +Adding Shipments
    +
    +--- Parts ---
    +Part: number=P1 name=Nut color=Red weight=[12.0 grams] city=London
    +Part: number=P2 name=Bolt color=Green weight=[17.0 grams] city=Paris
    +Part: number=P3 name=Screw color=Blue weight=[17.0 grams] city=Rome
    +Part: number=P4 name=Screw color=Red weight=[14.0 grams] city=London
    +Part: number=P5 name=Cam color=Blue weight=[12.0 grams] city=Paris
    +Part: number=P6 name=Cog color=Red weight=[19.0 grams] city=London
    +
    +--- Suppliers ---
    +Supplier: number=S1 name=Smith status=20 city=London
    +Supplier: number=S2 name=Jones status=10 city=Paris
    +Supplier: number=S3 name=Blake status=30 city=Paris
    +Supplier: number=S4 name=Clark status=20 city=London
    +Supplier: number=S5 name=Adams status=30 city=Athens
    +
    +--- Suppliers for City Paris ---
    +Supplier: number=S2 name=Jones status=10 city=Paris
    +Supplier: number=S3 name=Blake status=30 city=Paris
    +
    +--- Shipments ---
    +Shipment: part=P1 supplier=S1 quantity=300
    +Shipment: part=P1 supplier=S2 quantity=300
    +Shipment: part=P2 supplier=S1 quantity=200
    +Shipment: part=P2 supplier=S2 quantity=400
    +Shipment: part=P2 supplier=S3 quantity=200
    +Shipment: part=P2 supplier=S4 quantity=200
    +Shipment: part=P3 supplier=S1 quantity=400
    +Shipment: part=P4 supplier=S1 quantity=200
    +Shipment: part=P4 supplier=S4 quantity=300
    +Shipment: part=P5 supplier=S1 quantity=100
    +Shipment: part=P5 supplier=S4 quantity=400
    +Shipment: part=P6 supplier=S1 quantity=100
    +
    +--- Shipments for Part P1 ---
    +Shipment: part=P1 supplier=S1 quantity=300
    +Shipment: part=P1 supplier=S2 quantity=300
    +
    +--- Shipments for Supplier S1 ---
    +Shipment: part=P1 supplier=S1 quantity=300
    +Shipment: part=P2 supplier=S1 quantity=200
    +Shipment: part=P3 supplier=S1 quantity=400
    +Shipment: part=P4 supplier=S1 quantity=200
    +Shipment: part=P5 supplier=S1 quantity=100
    +Shipment: part=P6 supplier=S1 quantity=100 
    +
    + + + diff --git a/docs/collections/tutorial/gettingStarted.css b/docs/collections/tutorial/gettingStarted.css new file mode 100644 index 0000000..6a2b24b --- /dev/null +++ b/docs/collections/tutorial/gettingStarted.css @@ -0,0 +1,50 @@ +body { width: 45em; + margin-left: 3em; + font-family: Arial, Helvetica, sans-serif; + font-size: 11pt; + } + +h2.title { margin-left: -1em; + font-family: Verdana, serif; + font-size: 16pt; + } + +h3.title { font-family: Verdana, serif; + font-size: 14pt; + } + +pre.programlisting { + font-family: monospace; + background-color: #eae8e9; +} + +div.navheader { font-size: 10pt; + width: 60em; + margin-left: -2em; + } + +div.navheader table tr td { font-size: 10pt; } + +div.navfooter { font-size: 10pt; + width: 60em; + margin-left: -2em; + } +div.navfooter table tr td { font-size: 10pt; } + +span.emphasis { font-style: italic;} + +div.appendix div.informaltable { font-size: 9pt; } +div.appendix div.informaltable td { vertical-align: top; } +div.appendix div.informaltable p { margin-top: .25em; } +div.appendix div.informaltable p { margin-bottom: .25em; } + +div.variablelist dl dt {margin-top: 1em; } + +div.libver p { + font-size: 8pt; + width: 30%; + margin-left: 2px; + margin-right: 2px; + padding-top: 3px; + padding-bottom: 3px; + } diff --git a/docs/collections/tutorial/handlingexceptions.html b/docs/collections/tutorial/handlingexceptions.html new file mode 100644 index 0000000..02e7dec --- /dev/null +++ b/docs/collections/tutorial/handlingexceptions.html @@ -0,0 +1,217 @@ + + + + + + Handling Exceptions + + + + + + + + + +
    +
    +
    +
    +

    + Handling Exceptions +

    +
    +
    +
    +

    + Exception handling was illustrated previously in + + Implementing the Main Program + + and + + Using Transactions + + exception handling in a JE JE Collections API application in + more detail. +

    +

    + There are two exceptions that must be treated specially: + RunRecoveryException + + + and + + LockConflictException. + + +

    +

    + RunRecoveryException + + + is thrown when the only solution is to shut down the application + and run recovery. All applications must catch this exception and + follow the recovery procedure. +

    +

    + When + LockConflictException + + + + is thrown, the application should normally retry the operation. If + a deadlock continues to occur for some maximum number of retries, + the application should give up and try again later or take other + corrective actions. The JE JE Collections API provides two APIs + for transaction execution. +

    +
    + +
    +

    + When using the + TransactionRunner + + class there are two other considerations. +

    +
    +
      +
    • +

      + First, if the application-defined + TransactionWorker.doWork + + method throws an exception the + transaction will automatically be aborted, and otherwise the + transaction will automatically be committed. Applications should + design their transaction processing with this in mind. +

      +
    • +
    • +

      + Second, please be aware that + TransactionRunner.run + + unwraps exceptions in order to discover whether a nested exception is a + + LockConflictException. + + + This is particularly important since all Berkeley DB exceptions + that occur while calling a stored collection method are wrapped + with a + RuntimeExceptionWrapper. + This wrapping is necessary because Berkeley DB exceptions are + checked exceptions, and the Java collections API does not allow + such exceptions to be thrown. +

      +
    • +
    +
    +

    + When calling + TransactionRunner.run, + the unwrapped (nested) exception will be unwrapped and thrown + automatically. If you are not using + TransactionRunner + + or if you are handling exceptions directly for some other reason, + use the + ExceptionUnwrapper.unwrap + + method to get the nested exception. For example, this can be used + to discover that an exception is a + RunRecoveryException + + + as shown below. +

    + +
    import com.sleepycat.je.RunRecoveryException;
    +import com.sleepycat.util.ExceptionUnwrapper;
    +...
    +    catch (Exception e)
    +    {
    +        e = ExceptionUnwrapper.unwrap(e);
    +        if (e instanceof RunRecoveryException)
    +        {
    +            // follow recovery procedure
    +        }
    +    } 
    +
    + + + diff --git a/docs/collections/tutorial/implementingmain.html b/docs/collections/tutorial/implementingmain.html new file mode 100644 index 0000000..8f33cfc --- /dev/null +++ b/docs/collections/tutorial/implementingmain.html @@ -0,0 +1,253 @@ + + + + + + Implementing the Main Program + + + + + + + + + +
    +
    +
    +
    +

    + Implementing the Main Program +

    +
    +
    +
    +

    + The main program opens the environment and databases, stores and retrieves + objects within a transaction, and finally closes the environment + databases. This section describes the main program shell, and the + next section describes how to run transactions for storing and + retrieving objects. +

    +

    + The Sample class contains the main program. The skeleton + for the Sample class follows. +

    + +
    import com.sleepycat.je.DatabaseException;
    +import java.io.FileNotFoundException;
    +
    +public class Sample
    +{
    +    private SampleDatabase db;
    +    private SampleViews views;
    +
    +    public static void main(String args)
    +    {
    +    }
    +
    +    private Sample(String homeDir)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +    }
    +
    +    private void close()
    +        throws DatabaseException
    +    {
    +    }
    +
    +    private void run()
    +        throws Exception
    +    {
    +    }
    +} 
    +

    + The main program uses the SampleDatabase and + SampleViews classes that were described in the preceding + sections. The main method will create an instance of the + Sample class, and call its run() and close() + methods. + +

    +

    + The following statements parse the program's command line + arguments. +

    + +
        public static void main(String[] args)
    +    {
    +        System.out.println("\nRunning sample: " + Sample.class);
    +        String homeDir = "./tmp";
    +        for (int i = 0; i < args.length; i += 1)
    +        {
    +            String arg = args[i];
    +            if (args[i].equals("-h") && i < args.length - 1)
    +            {
    +                i += 1;
    +                homeDir = args[i];
    +            }
    +            else
    +            {
    +                System.err.println("Usage:\n java " + 
    +                                   Sample.class.getName() +
    +                                  "\n  [-h <home-directory>]");
    +                System.exit(2);
    +            }
    +        }
    +        ...
    +    } 
    +

    + The usage command is: +

    +
    java com.sleepycat.examples.bdb.shipment.basic.Sample
    +     [-h <home-directory> ] 
    +

    + The -h command is used to set the homeDir + variable, which will later be passed to the SampleDatabase() + constructor. Normally all Berkeley DB programs should provide a way + to configure their database environment home directory. +

    +

    + The default for the home directory is ./tmp — the tmp + subdirectory of the current directory where the sample is run. The + home directory must exist before running the sample. To re-create + the sample database from scratch, delete all files in the home + directory before running the sample. +

    +

    + The home directory was described previously in + + Opening and Closing the Database Environment + . +

    +

    + Of course, the command line arguments shown are only examples + and a real-life application may use different techniques for + configuring these options. + +

    +

    + The following statements create an instance of the Sample + class and call its run() and close() methods. +

    + +
        public static void main(String args)
    +    {
    +        ...
    +        Sample sample = null;
    +        try
    +        {
    +            sample = new Sample(homeDir);
    +            sample.run();
    +        }
    +        catch (Exception e)
    +        {
    +            e.printStackTrace();
    +        }
    +        finally
    +        {
    +            if (sample != null)
    +            {
    +                try
    +                {
    +                    sample.close();
    +                }
    +                catch (Exception e)
    +                {
    +                    System.err.println("Exception during database close:");
    +                    e.printStackTrace();
    +                }
    +            }
    +        }
    +    } 
    +

    + The Sample() constructor will open the environment and + databases, and the run() method will run transactions for + storing and retrieving objects. If either of these throws an + exception, then the program was unable to run and should normally + terminate. (Transaction retries are handled at a lower level and + will be described later.) The first catch statement handles + such exceptions. +

    +

    + The finally statement is used to call the close() + method since an attempt should always be made to close the environment and + databases + cleanly. If an exception is thrown during close and a prior + exception occurred above, then the exception during close is likely + a side effect of the prior exception. +

    +

    + The Sample() constructor creates the SampleDatabase + and SampleViews objects. +

    + +
        private Sample(String homeDir)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        db = new SampleDatabase(homeDir);
    +        views = new SampleViews(db);
    +    } 
    +

    + Recall that creating the SampleDatabase object will open + the environment and all databases. +

    +

    + To close the database the Sample.close() method simply + calls SampleDatabase.close(). +

    + +
         private void close()
    +        throws DatabaseException
    +    {
    +        db.close();
    +    } 
    +

    + The run() method is described in the next section. +

    +
    + + + diff --git a/docs/collections/tutorial/index.html b/docs/collections/tutorial/index.html new file mode 100644 index 0000000..3d2f912 --- /dev/null +++ b/docs/collections/tutorial/index.html @@ -0,0 +1,597 @@ + + + + + + Berkeley DB Java Edition Collections Tutorial + + + + + + + +
    +
    +
    +
    +

    Berkeley DB Java Edition Collections Tutorial

    +
    +
    +
    + +

    + Legal Notice +

    +

    + Copyright © 2002 - 2017 Oracle and/or its affiliates. All rights + reserved. +

    +

    + This software and related documentation are provided under a + license agreement containing restrictions on use and disclosure + and are protected by intellectual property laws. Except as + expressly permitted in your license agreement or allowed by + law, you may not use, copy, reproduce, translate, broadcast, + modify, license, transmit, distribute, exhibit, perform, + publish, or display any part, in any form, or by any means. + Reverse engineering, disassembly, or decompilation of this + software, unless required by law for interoperability, is + prohibited. +

    +

    + The information contained herein is subject to change without + notice and is not warranted to be error-free. If you find any + errors, please report them to us in writing. +

    +

    + Berkeley DB, + + Berkeley DB Java Edition + and + Sleepycat are trademarks or registered trademarks of + Oracle. All rights to these marks are reserved. + No third-party use is permitted without the + express prior written consent of Oracle. +

    +

    + Other names may be trademarks of their respective owners. +

    +

    + If this is software or related documentation that is delivered + to the U.S. Government or anyone licensing it on behalf of the + U.S. Government, the following notice is applicable: +

    +

    + U.S. GOVERNMENT END USERS: Oracle programs, including any + operating system, integrated software, any programs installed + on the hardware, and/or documentation, delivered to U.S. + Government end users are "commercial computer software" + pursuant to the applicable Federal Acquisition Regulation and + agency-specific supplemental regulations. As such, use, + duplication, disclosure, modification, and adaptation of the + programs, including any operating system, integrated software, + any programs installed on the hardware, and/or documentation, + shall be subject to license terms and license restrictions + applicable to the programs. No other rights are granted to the + U.S. Government. +

    +

    + This software or hardware is developed for general use in a + variety of information management applications. It is not + developed or intended for use in any inherently dangerous + applications, including applications that may create a risk of + personal injury. If you use this software or hardware in + dangerous applications, then you shall be responsible to take + all appropriate fail-safe, backup, redundancy, and other + measures to ensure its safe use. Oracle Corporation and its + affiliates disclaim any liability for any damages caused by use + of this software or hardware in dangerous applications. +

    +

    + Oracle and Java are registered trademarks of Oracle and/or its + affiliates. Other names may be trademarks of their respective + owners. +

    +

    + Intel and Intel Xeon are trademarks or registered trademarks of + Intel Corporation. All SPARC trademarks are used under license + and are trademarks or registered trademarks of SPARC + International, Inc. AMD, Opteron, the AMD logo, and the AMD + Opteron logo are trademarks or registered trademarks of + Advanced Micro Devices. UNIX is a registered trademark of The + Open Group. +

    +

    + This software or hardware and documentation may provide access + to or information on content, products, and services from third + parties. Oracle Corporation and its affiliates are not + responsible for and expressly disclaim all warranties of any + kind with respect to third-party content, products, and + services. Oracle Corporation and its affiliates will not be + responsible for any loss, costs, or damages incurred due to + your access to or use of third-party content, products, or + services. +

    +
    +
    +
    +

    31-Oct-2017

    +
    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Preface + +
    +
    +
    +
    + + Conventions Used in this Book + +
    +
    + + For More Information + +
    +
    +
    +
    + + Contact Us + +
    +
    +
    +
    +
    +
    + + 1. + Introduction + + +
    +
    +
    +
    + + Features + +
    +
    + + Developing a JE Collections Application + +
    +
    + + Tutorial Introduction + +
    +
    +
    +
    + + 2. + The Basic Program + + +
    +
    +
    +
    + + + Defining Serialized Key and Value Classes + + +
    +
    + + + Opening and Closing the Database Environment + + +
    +
    + + + Opening and Closing the Class Catalog + + +
    +
    + + + Opening and Closing Databases + + +
    +
    + + + Creating Bindings and Collections + + +
    +
    + + + Implementing the Main Program + + +
    +
    + + + Using Transactions + + +
    +
    + + + Adding Database Items + + +
    +
    + + + Retrieving Database Items + + +
    +
    + + + Handling Exceptions + + +
    +
    +
    +
    + + 3. + Using Secondary Indices and Foreign keys + + +
    +
    +
    +
    + + + Opening Secondary Key Indices + + +
    +
    + + + Opening Foreign Key Indices + + + +
    +
    + + + Creating Indexed Collections + + +
    +
    + + + Retrieving Items by Index Key + + +
    +
    +
    +
    + + 4. + Using Entity Classes + + +
    +
    +
    +
    + + + Defining Entity Classes + + +
    +
    + + + Creating Entity Bindings + + +
    +
    + + + Creating Collections with Entity Bindings + + +
    +
    + + + Using Entities with Collections + + +
    +
    +
    +
    + + 5. + Using Tuples + + +
    +
    +
    +
    + + + Using the Tuple Format + + +
    +
    + + + Using Tuples with Key Creators + + +
    +
    + + + Creating Tuple Key Bindings + + +
    +
    + + +Creating Tuple-Serial Entity Bindings + + +
    +
    + + + Using Sorted Collections + + +
    +
    +
    +
    + + 6. + Using Serializable Entities + + +
    +
    +
    +
    + + + Using Transient Fields in an Entity Class + + +
    +
    + + + Using Transient Fields in an Entity Binding + + +
    +
    + + + Removing the Redundant Value Classes + + +
    +
    +
    +
    + + 7. + Summary + + +
    +
    + + A. + API Notes and Details + + +
    +
    +
    +
    + + + Using Data Bindings + + +
    +
    +
    +
    + + + Selecting Binding Formats + + +
    +
    + + + Selecting Data Bindings + + +
    +
    + + + Implementing Bindings + + +
    +
    + + + Using Bindings + + +
    +
    + + + Secondary Key Creators + + +
    +
    +
    +
    + + + Using the JE JE Collections API + + +
    +
    +
    +
    + + + Using Transactions + + +
    +
    + + + Transaction Rollback + + +
    +
    + + + Access Method Restrictions + + +
    +
    +
    +
    + + + Using Stored Collections + + +
    +
    +
    +
    + + + Stored Collection and Access Methods + + +
    +
    + + + Stored Collections Versus Standard Java Collections + + +
    +
    + + + Other Stored Collection Characteristics + + +
    +
    + + + Why Java Collections for Berkeley DB Java Edition + + +
    +
    +
    +
    + + + Serialized Object Storage + + +
    +
    +
    +
    +
    +
    + + + diff --git a/docs/collections/tutorial/indexedcollections.html b/docs/collections/tutorial/indexedcollections.html new file mode 100644 index 0000000..2641737 --- /dev/null +++ b/docs/collections/tutorial/indexedcollections.html @@ -0,0 +1,248 @@ + + + + + + Creating Indexed Collections + + + + + + + + + +
    +
    +
    +
    +

    + Creating Indexed Collections +

    +
    +
    +
    +

    + In the prior Basic example, bindings and Java collections were + created for accessing databases via their primary keys. In this + example, bindings and collections are added for accessing the same + databases via their index keys. As in the prior example, serial + bindings and the Java + Map + + class are used. +

    +

    + When a map is created from a + + SecondaryDatabase, + + + the keys of the map will be the index keys. However, the values of + the map will be the values of the primary database associated with + the index. This is how index keys can be used to access the values + in a primary database. +

    +

    + For example, the Supplier's City field is an index key that can + be used to access the Supplier database. When a map is created + using the supplierByCityDb() method, the key to the map will be the + City field, a + String + + object. When + Map.get + + is called passing the City as the key parameter, a + SupplierData + object will be returned. +

    +

    + The SampleViews class is extended to create an index key + binding for the Supplier's City field and three Java maps based on + the three indices created in the prior section. +

    + +
    import com.sleepycat.bind.EntryBinding;
    +import com.sleepycat.bind.serial.SerialBinding;
    +import com.sleepycat.collections.StoredEntrySet;
    +import com.sleepycat.collections.StoredSortedMap;
    +...
    +
    +public class SampleViews
    +{
    +    ...
    +    private StoredSortedMap supplierByCityMap;
    +    private StoredSortedMap shipmentByPartMap;
    +    private StoredSortedMap shipmentBySupplierMap;
    +    ...
    +
    +    public SampleViews(SampleDatabase db)
    +    {
    +        ClassCatalog catalog = db.getClassCatalog();
    +        ...
    +        EntryBinding cityKeyBinding =
    +            new SerialBinding(catalog, String.class);
    +        ...
    +        supplierByCityMap =
    +            new StoredSortedMap(db.getSupplierByCityDatabase(),
    +                          cityKeyBinding, supplierDataBinding, true);
    +        shipmentByPartMap =
    +            new StoredSortedMap(db.getShipmentByPartDatabase(),
    +                          partKeyBinding, supplierDataBinding, true);
    +        shipmentBySupplierMap =
    +            new StoredSortedMap(db.getShipmentBySupplierDatabase(),
    +                          supplierKeyBinding, supplierDataBinding, true); 
    +    ...
    +    }
    +} 
    +

    + In general, the indexed maps are created here in the same way as + the unindexed maps were created in the Basic example. The + differences are: +

    +
    +
      +
    • +

      + The first parameter of the + StoredSortedMap + + constructor is a + SecondaryDatabase + + + rather than a + + Database. + + +

      +
    • +
    • +

      + The second parameter is the index key binding rather than the + primary key binding. +

      +
    • +
    +
    +

    + For the supplierByCityMap, the cityKeyBinding must + first be created. This binding was not created in the Basic example + because the City field is not a primary key. +

    +

    + Like the bindings created earlier for keys and values, the + cityKeyBinding is a + SerialBinding. + Unlike the bindings created earlier, it is an example of creating a + binding for a built-in Java class, + String, + instead of an application-defined class. Any serializable class may + be used. +

    +

    + For the shipmentByPartMap and + shipmentBySupplierMap, the partKeyBinding and + supplierKeyBinding are used. These were created in the Basic + example and used as the primary key bindings for the partMap + and supplierMap. +

    +

    + The value bindings — supplierDataBinding and + shipmentDataBinding — were also created in the Basic + example. +

    +

    + This illustrates that bindings and formats may and should be + reused where appropriate for creating maps and other + collections. +

    +

    + The following getter methods return the stored maps for use by + other classes in the example program. Convenience methods for + returning entry sets are also included. +

    + +
    public class SampleViews
    +{
    +    ...
    +    public final StoredSortedMap getShipmentByPartMap()
    +    {
    +        return shipmentByPartMap;
    +    }
    +
    +    public final StoredSortedMap getShipmentBySupplierMap()
    +    {
    +        return shipmentBySupplierMap;
    +    }
    +
    +    public final StoredSortedMap getSupplierByCityMap()
    +    {
    +        return supplierByCityMap;
    +    }
    +
    +    public final StoredEntrySet getShipmentByPartEntrySet()
    +    {
    +        return (StoredEntrySet) shipmentByPartMap.entrySet();
    +    }
    +
    +    public final StoredEntrySet getShipmentBySupplierEntrySet()
    +    {
    +        return (StoredEntrySet) shipmentBySupplierMap.entrySet();
    +    }
    +
    +    public final StoredEntrySet getSupplierByCityEntrySet()
    +    {
    +        return (StoredEntrySet) supplierByCityMap.entrySet();
    +    }
    +    ...
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/intro.html b/docs/collections/tutorial/intro.html new file mode 100644 index 0000000..a04b369 --- /dev/null +++ b/docs/collections/tutorial/intro.html @@ -0,0 +1,205 @@ + + + + + + Chapter 1.  Introduction + + + + + + + + + +
    +
    +
    +
    +

    Chapter 1.  + Introduction +

    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Features + +
    +
    + + Developing a JE Collections Application + +
    +
    + + Tutorial Introduction + +
    +
    +
    +

    + The JE JE Collections API is a Java framework that extends + the well known + Java Collections + design pattern such that collections can now be + stored, updated and queried in a transactional manner. The + JE JE Collections API is a layer on top of JE. +

    +

    + Together the JE JE Collections API and Berkeley DB Java Edition provide an + embedded data management solution with all the benefits of a full + transactional storage and the simplicity of a well known Java API. + Java programmers who need fast, scalable, transactional data + management for their projects can quickly adopt and deploy the + JE JE Collections API with confidence. +

    +

    + This framework was first known as + Greybird DB + written by Mark Hayes. Mark collaborated with us to + permanently incorporate his excellent work into our distribution + and to support it as an ongoing part of Berkeley DB and Berkeley DB Java + Edition. The repository of source code that remains at SourceForge at version 0.9.0 is + considered the last version before incorporation and will remain + intact but will not be updated to reflect changes made as part of + Berkeley DB or Berkeley DB Java Edition. +

    +
    +
    +
    +
    +

    Features

    +
    +
    +
    +

    + + + JE provides a Java API that can be roughly + described as a map and cursor interface, where the keys and values + are represented as byte arrays. + + The JE JE Collections API is a layer on top of + + + + JE. + It adds significant new functionality in several ways. +

    +
    +
      +
    • +

      + An implementation of the Java Collections interfaces (Map, + SortedMap, Set, SortedSet, + + and Iterator) is provided. +

      +
    • +
    • +

      + Transactions are supported using the conventional Java + transaction-per-thread model, where the current transaction is + implicitly associated with the current thread. +

      +
    • +
    • +

      + Transaction runner utilities are provided that automatically + perform transaction retry and exception handling. +

      +
    • +
    • +

      + Keys and values are represented as Java objects rather than + byte arrays. Bindings are used to map between Java objects and the + stored byte arrays. +

      +
    • +
    • +

      + The tuple data format is provided as the simplest data + representation, and is useful for keys as well as simple compact + values. +

      +
    • +
    • +

      + The serial data format is provided for storing arbitrary Java + objects without writing custom binding code. Java serialization is + extended to store the class descriptions separately, making the + data records much more compact than with standard Java + serialization. +

      +
    • +
    • +

      + Custom data formats and bindings can be easily added. XML data + format and XML bindings could easily be created using this feature, + for example. +

      +
    • +
    +
    +

    + Note that the JE JE Collections API does not support caching + of programming language objects nor does it keep track of their stored + status. This is in contrast to "persistent object" approaches such + as those defined by + ODMG + and JDO + (JSR 12). + Such approaches have benefits but also require sophisticated object + caching. For simplicity the JE JE Collections API treats data + objects by value, not by reference, and does not perform object + caching of any kind. Since the JE JE Collections API is a thin + layer, its reliability and performance characteristics are roughly + equivalent to those of Berkeley DB, and database tuning is + accomplished in the same way as for any Berkeley DB database. +

    +
    +
    + + + diff --git a/docs/collections/tutorial/moreinfo.html b/docs/collections/tutorial/moreinfo.html new file mode 100644 index 0000000..580410a --- /dev/null +++ b/docs/collections/tutorial/moreinfo.html @@ -0,0 +1,155 @@ + + + + + + For More Information + + + + + + + + + +
    +
    +
    +
    +

    For More Information

    +
    +
    +
    +
    +
    +
    + + Contact Us + +
    +
    +
    +

    + Beyond this manual, you may also find the following sources of information useful when building a + JE application: +

    + + +

    + To download the latest + + Berkeley DB Java Edition + + documentation along with white papers and other collateral, + visit http://www.oracle.com/technetwork/indexes/documentation/index.html. +

    +

    + For the latest version of the Oracle + + Berkeley DB Java Edition + + downloads, visit + http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html. +

    +
    +
    +
    +
    +
    +

    Contact Us

    +
    +
    +
    +

    + You can post your comments and questions at the Oracle + Technology (OTN) forum for + + + + Oracle Berkeley DB Java Edition at: https://forums.oracle.com/forums/forum.jspa?forumID=273. + +

    +

    + For sales or support information, email to: + berkeleydb-info_us@oracle.com + You can subscribe to a low-volume email announcement list for + the Berkeley DB product family by sending email to: + bdb-join@oss.oracle.com +

    +
    +
    + + + diff --git a/docs/collections/tutorial/openclasscatalog.html b/docs/collections/tutorial/openclasscatalog.html new file mode 100644 index 0000000..e5c7273 --- /dev/null +++ b/docs/collections/tutorial/openclasscatalog.html @@ -0,0 +1,198 @@ + + + + + + Opening and Closing the Class Catalog + + + + + + + + + +
    +
    +
    +
    +

    + Opening and Closing the Class Catalog +

    +
    +
    +
    +

    + This section describes how to open and close the Java class + catalog. The class catalog is a specialized database store that + contains the Java class descriptions of the serialized objects that + are stored in the database. The class descriptions are stored in + the catalog rather than storing them redundantly in each database + record. A single class catalog per environment must be opened + whenever serialized objects will be stored in the database. +

    +

    + The SampleDatabase class is extended to open and close + the class catalog. The following additional imports and class + members are needed. +

    + +
    import com.sleepycat.bind.serial.StoredClassCatalog;
    +import com.sleepycat.je.Database;
    +import com.sleepycat.je.DatabaseConfig;
    +import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import java.io.File;
    +import java.io.FileNotFoundException;
    +
    +...
    +
    +public class SampleDatabase
    +{
    +    private Environment env;
    +    private static final String CLASS_CATALOG = "java_class_catalog";
    +    ...
    +    private StoredClassCatalog javaCatalog;
    +    ...
    +} 
    +

    + While the class catalog is itself a database, it contains + metadata for other databases and is therefore treated specially by + the JE JE Collections API. The + StoredClassCatalog + + class encapsulates the catalog store and implements this special + behavior. +

    +

    + The following statements open the class catalog by creating a + Database and a StoredClassCatalog object. The catalog + database is created if it does not already exist. +

    + +
        public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        ...
    +        DatabaseConfig dbConfig = new DatabaseConfig();
    +        dbConfig.setTransactional(true);
    +        dbConfig.setAllowCreate(true);
    +
    +        Database catalogDb = env.openDatabase(null, CLASS_CATALOG, 
    +                                              dbConfig);
    +
    +        javaCatalog = new StoredClassCatalog(catalogDb);
    +        ...
    +    }
    +    ...
    +    public final StoredClassCatalog getClassCatalog() {
    +        return javaCatalog;
    +    } 
    +

    + The + DatabaseConfig + + + class is used to specify configuration parameters when opening a + database. The first configuration option specified — + setTransactional() — is set to true to create a transactional + database. While non-transactional databases can also be created, + the examples in this tutorial use transactional databases. +

    +

    + setAllowCreate() is set to true to specify + that the database will be created if it does not already exist. If + this parameter is not specified, an exception will be thrown if the + database does not already exist. +

    +

    + The first parameter of the openDatabase() method is an + optional transaction that is used for creating a new database. If + null is passed, auto-commit is used when creating a database. +

    +

    + The second parameter of openDatabase() specifies the + database name and must not be a null. +

    +

    + The last parameter of openDatabase() specifies the database + configuration object. +

    +

    + Lastly, the StoredClassCatalog object is created to manage the + information in the class catalog database. The + StoredClassCatalog object will be used in the sections + following for creating serial bindings. +

    +

    + The getClassCatalog method returns the catalog object for + use by other classes in the example program. +

    +

    + When the environment is closed, the class catalog is closed + also. +

    + +
        public void close()
    +        throws DatabaseException
    +    {
    +        javaCatalog.close();
    +        env.close();
    +    } 
    +

    + The StoredClassCatalog.close() method simply closes the + underlying class catalog database and in fact the + Database.close() + + + method may be called instead, if desired. It is recommended that you close the catalog database and + all other databases, before closing the + environment. +

    +
    + + + diff --git a/docs/collections/tutorial/opendatabases.html b/docs/collections/tutorial/opendatabases.html new file mode 100644 index 0000000..643f2a6 --- /dev/null +++ b/docs/collections/tutorial/opendatabases.html @@ -0,0 +1,167 @@ + + + + + + Opening and Closing Databases + + + + + + + + + +
    +
    +
    +
    +

    + Opening and Closing Databases +

    +
    +
    +
    +

    + This section describes how to open and close the Part, Supplier + and Shipment databases. A database is a collection of + records, each of which has a key and a value. The keys and values + are stored in a selected format, which defines the syntax of the + stored data. Two examples of formats are Java serialization format + and tuple format. In a given database, all keys have the same + format and all values have the same format. +

    +

    + The SampleDatabase class is extended to open and close + the three databases. The following additional class members are + needed. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    private static final String SUPPLIER_STORE = "supplier_store";
    +    private static final String PART_STORE = "part_store";
    +    private static final String SHIPMENT_STORE = "shipment_store";
    +    ...
    +    private Database supplierDb;
    +    private Database partDb;
    +    private Database shipmentDb;
    +    ...
    +} 
    +

    + For each database there is a database name constant and a + Database object. +

    +

    + The following statements open the three databases by + constructing a Database object. +

    + +
        public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        ...
    +        DatabaseConfig dbConfig = new DatabaseConfig();
    +        dbConfig.setTransactional(true);
    +        dbConfig.setAllowCreate(true);
    +        ...
    +        partDb = env.openDatabase(null, PART_STORE, dbConfig);
    +        supplierDb = env.openDatabase(null, SUPPLIER_STORE, dbConfig);
    +        shipmentDb = env.openDatabase(null, SHIPMENT_STORE, dbConfig);
    +        ...
    +    } 
    +

    + The database configuration object that was used previously for + opening the catalog database is reused for opening the three + databases above. The databases are created if they don't already + exist. The parameters of the openDatabase() method were + described earlier when the class catalog database was opened. +

    +

    + The following statements close the three databases. +

    + +
        public void close()
    +        throws DatabaseException
    +    {
    +        partDb.close();
    +        supplierDb.close();
    +        shipmentDb.close();
    +        javaCatalog.close();
    +        env.close();
    +    } 
    +

    + It is recommended that all databases, including the catalog database, is closed + before closing the environment. +

    +

    + The following getter methods return the databases for use by + other classes in the example program. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public final Database getPartDatabase()
    +    {
    +        return partDb;
    +    }
    +
    +    public final Database getSupplierDatabase()
    +    {
    +        return supplierDb;
    +    }
    +
    +    public final Database getShipmentDatabase()
    +    {
    +        return shipmentDb;
    +    }
    +    ...
    +}
    +
    + + + diff --git a/docs/collections/tutorial/opendbenvironment.html b/docs/collections/tutorial/opendbenvironment.html new file mode 100644 index 0000000..290e723 --- /dev/null +++ b/docs/collections/tutorial/opendbenvironment.html @@ -0,0 +1,197 @@ + + + + + + Opening and Closing the Database Environment + + + + + + + + + +
    +
    +
    +
    +

    + Opening and Closing the Database Environment +

    +
    +
    +
    +

    + This section of the tutorial describes how to open and close the + database environment. The database environment manages resources + (for example, memory, locks and transactions) for any number of + databases. A single environment instance is normally used for all + databases. +

    +

    + The SampleDatabase class is used to open and close the + environment. It will also be used in following sections to open and + close the class catalog and other databases. Its constructor is + used to open the environment and its close() method is used + to close the environment. The skeleton for the + SampleDatabase class follows. +

    + +
    import com.sleepycat.je.DatabaseException;
    +import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import java.io.File;
    +import java.io.FileNotFoundException;
    +
    +public class SampleDatabase
    +{
    +    private Environment env;
    +
    +    public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +    }
    +
    +    public void close()
    +        throws DatabaseException
    +    {
    +    }
    +} 
    +

    + The first thing to notice is that the Environment class is in + the + com.sleepycat.je + + package, not the com.sleepycat.collections + package. The + com.sleepycat.je + + package contains all core Berkeley DB + functionality. The com.sleepycat.collections package contains + extended functionality that is based on the Java Collections API. + The collections package is layered on top of the + com.sleepycat.je + + package. Both packages are needed to create a complete application + based on the JE JE Collections API. +

    +

    + The following statements create an + Environment + + + object. +

    + +
    public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        System.out.println("Opening environment in: " + homeDirectory);
    +
    +        EnvironmentConfig envConfig = new EnvironmentConfig();
    +        envConfig.setTransactional(true);
    +        envConfig.setAllowCreate(true);
    +
    +        env = new Environment(new File(homeDirectory), envConfig);
    +    } 
    +

    + The + EnvironmentConfig + + + class is used to specify environment configuration parameters. The + first configuration option specified — setTransactional() — + is set to true to create an environment where transactional (and + non-transactional) databases may be opened. While non-transactional + environments can also be created, the examples in this tutorial use + a transactional environment. +

    +

    + setAllowCreate() is set to true to specify + that the environment's files will be created if they don't already + exist. If this parameter is not specified, an exception will be + thrown if the environment does not already exist. A similar + parameter will be used later to cause databases to be created if + they don't exist. +

    +

    + When an Environment object is constructed, a home + directory and the environment configuration object are specified. + The home directory is the location of the environment's log files + that store all database information. +

    +

    + The following statement closes the environment. The environment + must be closed when database work is completed to free + allocated resources and to avoid having to run recovery later. + It is recommended that databases are closed before closing the + environment. +

    + +
        public void close()
    +        throws DatabaseException
    +    {
    +        env.close();
    +    } 
    +

    + The following getter method returns the environment for use by + other classes in the example program. The environment is used for + opening databases and running transactions. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public final Environment getEnvironment()
    +    {
    +        return env;
    +    }
    +    ...
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/openingforeignkeys.html b/docs/collections/tutorial/openingforeignkeys.html new file mode 100644 index 0000000..4629998 --- /dev/null +++ b/docs/collections/tutorial/openingforeignkeys.html @@ -0,0 +1,339 @@ + + + + + + Opening Foreign Key Indices + + + + + + + + + +
    +
    +
    +
    +

    + Opening Foreign Key Indices + +

    +
    +
    +
    +

    + This section builds on the prior section describing secondary + key indices to show how to open foreign key indices. A foreign + key index is a secondary key index that also provides integrity + constraints. When the primary key of a record in one database is + embedded in the value of a record in another database, integrity + constraints ensure that the record in the first database exists, + i.e, that there are no "dangling pointers". In this example the + Shipment's PartNumber and SupplierNumber fields will be used as + foreign keys. +

    +

    + When a foreign key index is defined, an "delete action" + parameter is specified. This parameter determines what action is + taken by the + Berkeley DB Java Edition + + API when the record is deleted to + which a foreign key refers. For example, consider what happens to a + Shipment record when a Part or Supplier record that is referred to + by that Shipment is deleted. There are three possibilities. +

    +
    +
      +
    • +

      + ForeignKeyDeleteAction.ABORT + + specifies that the transaction should be aborted by throwing an + exception. The effect is that deleting a Part or Supplier that is + referred to by one or more Shipments will not be possible. The + Berkeley DB Java Edition + + will automatically throw a + DatabaseException, + which should normally cause the transaction to be aborted during + exception processing. This is the default delete action if none is + specified. +

      +
    • +
    • +

      + ForeignKeyDeleteAction.NULLIFY + + specifies that the Part or Supplier Number field in the Shipment + record should be cleared, or set to a null or empty value. The + effect is that the deleted Part or Supplier will no longer be + referenced by any Shipment record. This option applies when the + foreign key field is optional, i.e, when the application allows it + to be set to a null or empty value. When using this option, the + application must implement the nullifyForeignKey() + method of the + ForeignKeyNullifier + + interface. +

      +
    • +
    • +

      + ForeignKeyDeleteAction.CASCADE + + specifies that the Shipment record should be deleted also. The + effect is that deleting a Part or Supplier will delete all + Shipments for that Part or Supplier. This option applies when the + deleted record is considered the "parent" or "owner" of the record + containing the foreign key, and is used in this example. Since + deleting the Shipment record could cause other deletions if other + records contain the foreign key of the Shipment, and so on, the + term "cascade" is used to describe the effect. +

      +
    • +
    +
    +

    + The SampleDatabase class is extended to open the + Shipment-by-Part and Shipment-by-Supplier secondary key + indices. +

    + +
    import com.sleepycat.bind.serial.SerialSerialKeyCreator;
    +import com.sleepycat.je.ForeignKeyDeleteAction;
    +import com.sleepycat.je.SecondaryConfig;
    +import com.sleepycat.je.SecondaryDatabase;
    +...
    +public class SampleDatabase
    +{
    +    ...
    +    private static final String SHIPMENT_PART_INDEX = 
    +        "shipment_part_index";
    +    private static final String SHIPMENT_SUPPLIER_INDEX = 
    +        "shipment_supplier_index";
    +    ...
    +    private SecondaryDatabase shipmentByPartDb;
    +    private SecondaryDatabase shipmentBySupplierDb;
    +    ...
    +    public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        ...
    +        SecondaryConfig secConfig = new SecondaryConfig();
    +        secConfig.setTransactional(true);
    +        secConfig.setAllowCreate(true);
    +        secConfig.setSortedDuplicates(true);
    +        ...
    +        secConfig.setForeignKeyDatabase(partDb);
    +            secConfig.setForeignKeyDeleteAction(
    +                                         ForeignKeyDeleteAction.CASCADE);
    +        secConfig.setKeyCreator(
    +            new ShipmentByPartKeyCreator(javaCatalog,
    +                                         ShipmentKey.class,
    +                                         ShipmentData.class,
    +                                         PartKey.class));
    +        shipmentByPartDb = env.openSecondaryDatabase(null, 
    +                                                     SHIPMENT_PART_INDEX,
    +                                                     shipmentDb,
    +                                                     secConfig);
    +
    +        secConfig.setForeignKeyDatabase(supplierDb);
    +        secConfig.setForeignKeyDeleteAction(
    +                                         ForeignKeyDeleteAction.CASCADE);
    +        secConfig.setKeyCreator(
    +            new ShipmentBySupplierKeyCreator(javaCatalog,
    +                                             ShipmentKey.class,
    +                                             ShipmentData.class,
    +                                             SupplierKey.class));
    +        shipmentBySupplierDb = env.openSecondaryDatabase(null,
    +                                                SHIPMENT_SUPPLIER_INDEX,
    +                                                shipmentDb,
    +                                                secConfig);
    +    ...
    +    }
    +} 
    +

    + If you compare these statements for opening foreign key indices + to the statements used in the previous section for opening a + secondary index, you'll notice that the only significant difference + is that the setForeignKeyDatabase() + and + setForeignKeyDeleteAction() methods are called. + setForeignKeyDatabase() specifies the foreign database that + contains the records to which the foreign keys refer; this + configures the secondary database as a foreign key index. + setForeignKeyDeleteAction() specifies the delete action. +

    +

    + The application-defined ShipmentByPartKeyCreator + and ShipmentBySupplierKeyCreator classes are shown below. They + were used above to configure the secondary database objects. +

    + +
    public class SampleDatabase
    +{
    +...
    +    private static class ShipmentByPartKeyCreator
    +        extends SerialSerialKeyCreator
    +    {
    +        private ShipmentByPartKeyCreator(ClassCatalog catalog,
    +                                         Class primaryKeyClass,
    +                                         Class valueClass,
    +                                         Class indexKeyClass)
    +        {
    +            super(catalog, primaryKeyClass, valueClass, indexKeyClass);
    +        }
    +
    +        public Object createSecondaryKey(Object primaryKeyInput,
    +                                         Object valueInput)
    +        {
    +            ShipmentKey shipmentKey = (ShipmentKey) primaryKeyInput;
    +            return new PartKey(shipmentKey.getPartNumber());
    +        }
    +    }
    +
    +    private static class ShipmentBySupplierKeyCreator
    +        extends SerialSerialKeyCreator
    +    {
    +        private ShipmentBySupplierKeyCreator(ClassCatalog catalog,
    +                                             Class primaryKeyClass,
    +                                             Class valueClass,
    +                                             Class indexKeyClass)
    +        {
    +            super(catalog, primaryKeyClass, valueClass, indexKeyClass);
    +        }
    +
    +        public Object createSecondaryKey(Object primaryKeyInput,
    +                                         Object valueInput)
    +        {
    +            ShipmentKey shipmentKey = (ShipmentKey) primaryKeyInput;
    +            return new SupplierKey(shipmentKey.getSupplierNumber());
    +        }
    +    }
    +    ...
    +} 
    +

    + The key creator classes above are almost identical to the one + defined in the previous section for use with a secondary index. The + index key fields are different, of course, but the interesting + difference is that the index keys are extracted from the key, not + the value, of the Shipment record. This illustrates that an index + key may be derived from the primary database record key, value, or + both. +

    +

    + Note that the + SerialSerialKeyCreator.nullifyForeignKey + + method is not + overridden above. This is because + ForeignKeyDeleteAction.NULLIFY + + was not used when creating the + SecondaryDatabase + + objects. If it were used, implementing the nullifyForeignKey() + methods would be needed to set the part number and supplier number + to null in the Shipment key. But record keys cannot be changed! And + in fact, the primary key is not passed to the + SerialSerialKeyCreator.nullifyForeignKey() method, only the + primary value is passed. Therefore, if a foreign index key is + derived from the primary key, + ForeignKeyDeleteAction.NULLIFY + + may not be used. +

    +

    + The following getter methods return the secondary database + objects for use by other classes in the example program. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public final SecondaryDatabase getShipmentByPartDatabase()
    +    {
    +        return shipmentByPartDb;
    +    }
    +
    +    public final SecondaryDatabase getShipmentBySupplierDatabase()
    +    {
    +        return shipmentBySupplierDb;
    +    }
    +    ...
    +} 
    +

    + The following statements close the secondary databases. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public void close()
    +        throws DatabaseException {
    +
    +        supplierByCityDb.close();
    +        shipmentByPartDb.close();
    +        shipmentBySupplierDb.close();
    +        partDb.close();
    +        supplierDb.close();
    +        shipmentDb.close();
    +        javaCatalog.close();
    +        env.close();
    +    }
    +    ...
    +} 
    +

    + Secondary databases must be closed before closing their + associated primary database. +

    +
    + + + diff --git a/docs/collections/tutorial/preface.html b/docs/collections/tutorial/preface.html new file mode 100644 index 0000000..dbcdf6d --- /dev/null +++ b/docs/collections/tutorial/preface.html @@ -0,0 +1,142 @@ + + + + + + Preface + + + + + + + + + +
    +
    +
    +
    +

    Preface

    +
    +
    +
    +
    +

    + Table of Contents +

    +
    +
    + + Conventions Used in this Book + +
    +
    + + For More Information + +
    +
    +
    +
    + + Contact Us + +
    +
    +
    +
    +
    +

    + Welcome to the Berkeley DB Java Edition (JE) Collections API. This document + provides a tutorial that introduces the collections API. + The goal of this document is to provide you with an efficient mechanism + with which you can quickly become efficient with this API. As such, this document is + intended for Java developers and senior software architects who are + looking for transactionally-protected backing of their Java collections. + No prior experience with JE technologies is expected or required. +

    +
    +
    +
    +
    +

    Conventions Used in this Book

    +
    +
    +
    +

    + The following typographical conventions are used within in this manual: +

    +

    + Class names are represented in monospaced font, as are method + names. For example: "The Environment.openDatabase() method + returns a Database class object." +

    +

    + Variable or non-literal text is presented in italics. For example: "Go to your + JE_HOME directory." +

    +

    + Program examples are displayed in a monospaced font on a shaded background. For example: +

    +
    import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import java.io.File;
    +
    +...
    +
    +// Open the environment. Allow it to be created if it does not already 
    +// exist.
    +Environment myDbEnvironment;
    +

    + In situations in this book, programming examples are updated from one chapter to the next in this book. When + this occurs, the new code is presented in monospaced bold font. For example: +

    +
    import com.sleepycat.je.Environment;
    +import com.sleepycat.je.EnvironmentConfig;
    +import java.io.File;
    +
    +...
    +
    +// Open the environment. Allow it to be created if it does not already 
    +// exist.
    +Environment myDbEnv;
    +EnvironmentConfig envConfig = new EnvironmentConfig();
    +envConfig.setAllowCreate(true);
    +myDbEnv = new Environment(new File("/export/dbEnv"), envConfig); 
    +
    +
    + + + diff --git a/docs/collections/tutorial/removingredundantvalueclasses.html b/docs/collections/tutorial/removingredundantvalueclasses.html new file mode 100644 index 0000000..83922e2 --- /dev/null +++ b/docs/collections/tutorial/removingredundantvalueclasses.html @@ -0,0 +1,131 @@ + + + + + + Removing the Redundant Value Classes + + + + + + + + + +
    +
    +
    +
    +

    + Removing the Redundant Value Classes +

    +
    +
    +
    +

    + The PartData, SupplierData and ShipmentData + classes have been removed in this example, and the Part, + Supplier and Shipment entity classes are used in + their place. +

    +

    + The serial formats are created with the entity classes. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +    public SampleDatabase(String homeDirectory)
    +        throws DatabaseException, FileNotFoundException
    +    {
    +        ...
    +        secConfig.setKeyCreator(new SupplierByCityKeyCreator(javaCatalog,
    +                                                     Supplier.class));
    +        ...
    +        secConfig.setKeyCreator(new ShipmentByPartKeyCreator(javaCatalog,
    +                                                     Shipment.class));
    +        ...
    +        secConfig.setKeyCreator(new 
    +                                ShipmentBySupplierKeyCreator(javaCatalog,
    +                                                     Shipment.class));
    +        ...
    +    }
    +} 
    +

    + The index key creator uses the entity class as well. +

    + +
    public class SampleDatabase
    +{
    +    ...
    +
    +    private static class SupplierByCityKeyCreator
    +        extends TupleSerialKeyCreator
    +    {
    +        private SupplierByCityKeyCreator(ClassCatalog catalog,
    +                                         Class valueClass)
    +        {
    +            super(catalog, valueClass);
    +        }
    +
    +        public boolean createSecondaryKey(TupleInput primaryKeyInput,
    +                                          Object valueInput,
    +                                          TupleOutput indexKeyOutput)
    +        {
    +            Supplier supplier = (Supplier) valueInput;
    +            String city = supplier.getCity();
    +            if (city != null) {
    +                indexKeyOutput.writeString(supplier.getCity());
    +                return true;
    +            } else {
    +                return false;
    +            }
    +        }
    +    }
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/retrievingbyindexkey.html b/docs/collections/tutorial/retrievingbyindexkey.html new file mode 100644 index 0000000..fabd19b --- /dev/null +++ b/docs/collections/tutorial/retrievingbyindexkey.html @@ -0,0 +1,279 @@ + + + + + + Retrieving Items by Index Key + + + + + + + + + +
    +
    +
    +
    +

    + Retrieving Items by Index Key +

    +
    +
    +
    +

    + Retrieving information via database index keys can be + accomplished using the standard Java collections API, using a + collection created from a + SecondaryDatabase + + + rather than a + + Database. + + + However, the standard Java API does not support duplicate keys: more + than one element in a collection having the same key. All three + indices created in the prior section have duplicate keys because of + the nature of the city, part number and supplier number index keys. + More than one supplier may be in the same city, and more than one + shipment may have the same part number or supplier number. This + section describes how to use extended methods for stored + collections to return all values for a given key. +

    +

    + Using the standard Java collections API, the + Map.get + + method for a stored collection with duplicate keys will return only + the first value for a given key. To obtain all values for a given + key, the + StoredSortedMap.duplicates + + method may be called. This returns a + Collection + + of values for the given key. If duplicate keys are not allowed, the + returned collection will have at most one value. If the key is not + present in the map, an empty collection is returned. +

    +

    + The Sample class is extended to retrieve duplicates for + specific index keys that are present in the database. +

    + +
    import java.util.Iterator;
    +...
    +public class Sample
    +{
    +    ...
    +    private SampleViews views;
    +    ...
    +    private class PrintDatabase implements TransactionWorker
    +    {
    +        public void doWork()
    +            throws Exception
    +        {
    +            printEntries("Parts",
    +                          views.getPartEntrySet().iterator());
    +            printEntries("Suppliers",
    +                          views.getSupplierEntrySet().iterator());
    +            printValues("Suppliers for City Paris",
    +                         views.getSupplierByCityMap().duplicates(
    +                                            "Paris").iterator());
    +            printEntries("Shipments",
    +                          views.getShipmentEntrySet().iterator());
    +            printValues("Shipments for Part P1",
    +                         views.getShipmentByPartMap().duplicates(
    +                                            new PartKey("P1")).iterator());
    +            printValues("Shipments for Supplier S1",
    +                         views.getShipmentBySupplierMap().duplicates(
    +                                            new
    +                                            SupplierKey("S1")).iterator());
    +        }
    +    }
    +
    +    private void printValues(String label, Iterator iterator)
    +    {
    +        System.out.println("\n--- " + label + " ---");
    +        while (iterator.hasNext())
    +        {
    +                System.out.println(iterator.next().toString());
    +        }
    +     } 
    +    ...
    +} 
    +

    + The + StoredSortedMap.duplicates + + method is called passing the desired key. The returned value is a + standard Java + Collection + + containing the values for the specified key. A standard Java + Iterator + + is then obtained for this collection and all values returned by + that iterator are printed. +

    +

    + Another technique for retrieving duplicates is to use the + collection returned by + Map.entrySet. + When duplicate keys are present, a + Map.Entry + + object will be present in this collection for each duplicate. This + collection can then be iterated or a subset can be created from it, + all using the standard Java collection API. +

    +

    + Note that we did not discuss how duplicates keys can be + explicitly added or removed in a collection. For index keys, the + addition and deletion of duplicate keys happens automatically when + records containing the index key are added, updated, or + removed. +

    +

    + While not shown in the example program, it is also possible to + create a store with duplicate keys in the same way as an index with + duplicate keys — by calling + DatabaseConfig.setSortedDuplicates() method. In that case, + calling + Map.put + + will add duplicate keys. To remove all duplicate keys, call + Map.remove. + To remove a specific duplicate key, call + StoredSortedMap.duplicates + + and then call + Collection.remove + + using the returned collection. Duplicate + values may also be added to this collection using + Collection.add. +

    +

    + The output of the example program is shown below. +

    +
    Adding Suppliers
    +Adding Parts
    +Adding Shipments
    +
    +--- Parts ---
    +PartKey: number=P1
    +PartData: name=Nut color=Red weight=[12.0 grams] city=London
    +PartKey: number=P2
    +PartData: name=Bolt color=Green weight=[17.0 grams] city=Paris
    +PartKey: number=P3
    +PartData: name=Screw color=Blue weight=[17.0 grams] city=Rome
    +PartKey: number=P4
    +PartData: name=Screw color=Red weight=[14.0 grams] city=London
    +PartKey: number=P5
    +PartData: name=Cam color=Blue weight=[12.0 grams] city=Paris
    +PartKey: number=P6
    +PartData: name=Cog color=Red weight=[19.0 grams] city=London
    +
    +--- Suppliers ---
    +SupplierKey: number=S1
    +SupplierData: name=Smith status=20 city=London
    +SupplierKey: number=S2
    +SupplierData: name=Jones status=10 city=Paris
    +SupplierKey: number=S3
    +SupplierData: name=Blake status=30 city=Paris
    +SupplierKey: number=S4
    +SupplierData: name=Clark status=20 city=London
    +SupplierKey: number=S5
    +SupplierData: name=Adams status=30 city=Athens
    +
    +--- Suppliers for City Paris ---
    +SupplierData: name=Jones status=10 city=Paris
    +SupplierData: name=Blake status=30 city=Paris
    +
    +--- Shipments ---
    +ShipmentKey: supplier=S1 part=P1
    +ShipmentData: quantity=300
    +ShipmentKey: supplier=S2 part=P1
    +ShipmentData: quantity=300
    +ShipmentKey: supplier=S1 part=P2
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S2 part=P2
    +ShipmentData: quantity=400
    +ShipmentKey: supplier=S3 part=P2
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S4 part=P2
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S1 part=P3
    +ShipmentData: quantity=400
    +ShipmentKey: supplier=S1 part=P4
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S4 part=P4
    +ShipmentData: quantity=300
    +ShipmentKey: supplier=S1 part=P5
    +ShipmentData: quantity=100
    +ShipmentKey: supplier=S4 part=P5
    +ShipmentData: quantity=400
    +ShipmentKey: supplier=S1 part=P6
    +ShipmentData: quantity=100 
    +
    +--- Shipments for Part P1 ---
    +ShipmentData: quantity=300
    +ShipmentData: quantity=300
    +
    +--- Shipments for Supplier S1 ---
    +ShipmentData: quantity=300
    +ShipmentData: quantity=200
    +ShipmentData: quantity=400
    +ShipmentData: quantity=200
    +ShipmentData: quantity=100
    +ShipmentData: quantity=100 
    +
    + + + diff --git a/docs/collections/tutorial/retrievingdatabaseitems.html b/docs/collections/tutorial/retrievingdatabaseitems.html new file mode 100644 index 0000000..4044d99 --- /dev/null +++ b/docs/collections/tutorial/retrievingdatabaseitems.html @@ -0,0 +1,216 @@ + + + + + + Retrieving Database Items + + + + + + + + + +
    +
    +
    +
    +

    + Retrieving Database Items +

    +
    +
    +
    +

    + Retrieving information from the database is accomplished via the + standard Java collections API. In the example, the + Set.iterator + + method is used to iterate all + Map.Entry + + objects for each store. All standard Java methods for retrieving + objects from a collection may be used with the JE JE Collections API. +

    +

    + The PrintDatabase.doWork() method calls + printEntries() + to print the map entries for each database store. It is called via + the + TransactionRunner + + class and was outlined in the previous section. +

    + +
    import java.util.Iterator;
    +...
    +public class Sample
    +{
    +    ...
    +    private SampleViews views;
    +    ...
    +    private class PrintDatabase implements TransactionWorker
    +    {
    +        public void doWork()
    +            throws Exception
    +        {
    +            printEntries("Parts",
    +                          views.getPartEntrySet().iterator());
    +            printEntries("Suppliers",
    +                          views.getSupplierEntrySet().iterator());
    +            printEntries("Shipments",
    +                          views.getShipmentEntrySet().iterator());
    +        }
    +    }
    +    ...
    +
    +    private void printEntries(String label, Iterator iterator)
    +    {
    +    }
    +    ...
    +} 
    +

    + The + Set + + of + Map.Entry + + objects for each store is obtained from the SampleViews + object. This set can also be obtained by calling the + Map.entrySet + + method of a stored map. +

    +

    + The printEntries() prints the map entries for any stored + map. The + Object.toString + + method of each key and value is called to + obtain a printable representation of each object. +

    + +
        private void printEntries(String label, Iterator iterator)
    +    {
    +        System.out.println("\n--- " + label + " ---");
    +        while (iterator.hasNext())
    +        {
    +            Map.Entry entry = (Map.Entry) iterator.next();
    +            System.out.println(entry.getKey().toString());
    +            System.out.println(entry.getValue().toString());
    +        }
    +    } 
    +

    + This is one of a small number of behavioral differences between + standard Java collections and stored collections. For a complete + list see + + Using Stored Collections + . +

    +

    + The output of the example program is shown below. +

    +
    Adding Suppliers
    +Adding Parts
    +Adding Shipments
    +
    +--- Parts ---
    +PartKey: number=P1
    +PartData: name=Nut color=Red weight=[12.0 grams] city=London
    +PartKey: number=P2
    +PartData: name=Bolt color=Green weight=[17.0 grams] city=Paris
    +PartKey: number=P3
    +PartData: name=Screw color=Blue weight=[17.0 grams] city=Rome
    +PartKey: number=P4
    +PartData: name=Screw color=Red weight=[14.0 grams] city=London
    +PartKey: number=P5
    +PartData: name=Cam color=Blue weight=[12.0 grams] city=Paris
    +PartKey: number=P6
    +PartData: name=Cog color=Red weight=[19.0 grams] city=London
    +
    +--- Suppliers ---
    +SupplierKey: number=S1
    +SupplierData: name=Smith status=20 city=London
    +SupplierKey: number=S2
    +SupplierData: name=Jones status=10 city=Paris
    +SupplierKey: number=S3
    +SupplierData: name=Blake status=30 city=Paris
    +SupplierKey: number=S4
    +SupplierData: name=Clark status=20 city=London
    +SupplierKey: number=S5
    +SupplierData: name=Adams status=30 city=Athens
    +
    +--- Shipments ---
    +ShipmentKey: supplier=S1 part=P1
    +ShipmentData: quantity=300
    +ShipmentKey: supplier=S2 part=P1
    +ShipmentData: quantity=300
    +ShipmentKey: supplier=S1 part=P2
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S2 part=P2
    +ShipmentData: quantity=400
    +ShipmentKey: supplier=S3 part=P2
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S4 part=P2
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S1 part=P3
    +ShipmentData: quantity=400
    +ShipmentKey: supplier=S1 part=P4
    +ShipmentData: quantity=200
    +ShipmentKey: supplier=S4 part=P4
    +ShipmentData: quantity=300
    +ShipmentKey: supplier=S1 part=P5
    +ShipmentData: quantity=100
    +ShipmentKey: supplier=S4 part=P5
    +ShipmentData: quantity=400
    +ShipmentKey: supplier=S1 part=P6
    +ShipmentData: quantity=100 
    +
    + + + diff --git a/docs/collections/tutorial/sortedcollections.html b/docs/collections/tutorial/sortedcollections.html new file mode 100644 index 0000000..90c17ff --- /dev/null +++ b/docs/collections/tutorial/sortedcollections.html @@ -0,0 +1,137 @@ + + + + + + Using Sorted Collections + + + + + + + + + +
    +
    +
    +
    +

    + Using Sorted Collections +

    +
    +
    +
    +

    + In general, no changes to the prior example are necessary to use + collections having tuple keys. Iteration of elements in a stored + collection will be ordered by the sort order of the tuples. +

    +

    + Although not shown in the example, all methods of the + SortedMap + + and + SortedSet + + interfaces may be used with sorted collections. For example, + submaps and subsets may be created. +

    +

    + The output of the example program shows that records are sorted + by key value. +

    +
    Adding Suppliers
    +Adding Parts
    +Adding Shipments
    +
    +--- Parts ---
    +Part: number=P1 name=Nut color=Red weight=[12.0 grams] city=London
    +Part: number=P2 name=Bolt color=Green weight=[17.0 grams] city=Paris
    +Part: number=P3 name=Screw color=Blue weight=[17.0 grams] city=Rome
    +Part: number=P4 name=Screw color=Red weight=[14.0 grams] city=London
    +Part: number=P5 name=Cam color=Blue weight=[12.0 grams] city=Paris
    +Part: number=P6 name=Cog color=Red weight=[19.0 grams] city=London
    +
    +--- Suppliers ---
    +Supplier: number=S1 name=Smith status=20 city=London
    +Supplier: number=S2 name=Jones status=10 city=Paris
    +Supplier: number=S3 name=Blake status=30 city=Paris
    +Supplier: number=S4 name=Clark status=20 city=London
    +Supplier: number=S5 name=Adams status=30 city=Athens
    +
    +--- Suppliers for City Paris ---
    +Supplier: number=S2 name=Jones status=10 city=Paris
    +Supplier: number=S3 name=Blake status=30 city=Paris
    +
    +--- Shipments ---
    +Shipment: part=P1 supplier=S1 quantity=300
    +Shipment: part=P1 supplier=S2 quantity=300
    +Shipment: part=P2 supplier=S1 quantity=200
    +Shipment: part=P2 supplier=S2 quantity=400
    +Shipment: part=P2 supplier=S3 quantity=200
    +Shipment: part=P2 supplier=S4 quantity=200
    +Shipment: part=P3 supplier=S1 quantity=400
    +Shipment: part=P4 supplier=S1 quantity=200
    +Shipment: part=P4 supplier=S4 quantity=300
    +Shipment: part=P5 supplier=S1 quantity=100
    +Shipment: part=P5 supplier=S4 quantity=400
    +Shipment: part=P6 supplier=S1 quantity=100
    +
    +--- Shipments for Part P1 ---
    +Shipment: part=P1 supplier=S1 quantity=300
    +Shipment: part=P1 supplier=S2 quantity=300
    +
    +--- Shipments for Supplier S1 ---
    +Shipment: part=P1 supplier=S1 quantity=300
    +Shipment: part=P2 supplier=S1 quantity=200
    +Shipment: part=P3 supplier=S1 quantity=400
    +Shipment: part=P4 supplier=S1 quantity=200
    +Shipment: part=P5 supplier=S1 quantity=100
    +Shipment: part=P6 supplier=S1 quantity=100 
    +
    + + + diff --git a/docs/collections/tutorial/transientfieldsinbinding.html b/docs/collections/tutorial/transientfieldsinbinding.html new file mode 100644 index 0000000..0f93c94 --- /dev/null +++ b/docs/collections/tutorial/transientfieldsinbinding.html @@ -0,0 +1,177 @@ + + + + + + Using Transient Fields in an Entity Binding + + + + + + + + + +
    +
    +
    +
    +

    + Using Transient Fields in an Entity Binding +

    +
    +
    +
    +

    + The entity bindings from the prior example have been changed in + this example to use the entity object both as a value object and an + entity object. +

    +

    + Before, the entryToObject() method combined the + deserialized value object with the key fields to create a new + entity object. Now, this method uses the deserialized object + directly as an entity, and initializes its key using the fields + read from the key tuple. +

    +

    + Before, the objectToData() method constructed a new value + object using information in the entity. Now it simply returns the + entity. Nothing needs to be changed in the entity, since the + transient key fields won't be serialized. +

    + +
    import com.sleepycat.bind.serial.ClassCatalog;
    +...
    +public class SampleViews
    +{
    +    ...
    +    private static class PartBinding extends TupleSerialBinding
    +    {
    +        private PartBinding(ClassCatalog classCatalog, Class dataClass)
    +        {
    +            super(classCatalog, dataClass);
    +        }
    +
    +        public Object entryToObject(TupleInput keyInput, Object dataInput)
    +        {
    +            String number = keyInput.readString();
    +            Part part = (Part) dataInput;
    +            part.setKey(number);
    +            return part;
    +        }
    +
    +        public void objectToKey(Object object, TupleOutput output)
    +        {
    +            Supplier supplier = (Supplier) object;
    +            output.writeString(supplier.getNumber());
    +        }
    +
    +        public Object objectToData(Object object)
    +        {
    +            return object;
    +        }
    +    }
    +
    +    private static class SupplierBinding extends TupleSerialBinding
    +    {
    +        private SupplierBinding(ClassCatalog classCatalog, Class dataClass)
    +        {
    +            super(classCatalog, dataClass);
    +        }
    +
    +        public Object entryToObject(TupleInput keyInput, Object dataInput)
    +        {
    +            String number = keyInput.readString();
    +            Supplier supplier = (Supplier) dataInput;
    +            supplier.setKey(number);
    +            return supplier;
    +        }
    +
    +        public void objectToKey(Object object, TupleOutput output)
    +        {
    +            Supplier supplier = (Supplier) object;
    +            output.writeString(supplier.getNumber());
    +        }
    +
    +        public Object objectToData(Object object)
    +        {
    +            return object;
    +        }
    +    }
    +
    +    private static class ShipmentBinding extends TupleSerialBinding
    +    {
    +        private ShipmentBinding(ClassCatalog classCatalog, Class dataClass)
    +        {
    +            super(classCatalog, dataClass);
    +        }
    +
    +        public Object entryToObject(TupleInput keyInput, Object dataInput)
    +        {
    +            String partNumber = keyInput.readString();
    +            String supplierNumber = keyInput.readString();
    +            Shipment shipment = (Shipment) dataInput;
    +            shipment.setKey(partNumber, supplierNumber);
    +            return shipment;
    +        }
    +
    +        public void objectToKey(Object object, TupleOutput output)
    +        {
    +            Shipment shipment = (Shipment) object;
    +            output.writeString(shipment.getPartNumber());
    +            output.writeString(shipment.getSupplierNumber());
    +        }
    +
    +        public Object objectToData(Object object)
    +        {
    +            return object;
    +        }
    +    }
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/tuple-serialentitybindings.html b/docs/collections/tutorial/tuple-serialentitybindings.html new file mode 100644 index 0000000..ad19835 --- /dev/null +++ b/docs/collections/tutorial/tuple-serialentitybindings.html @@ -0,0 +1,198 @@ + + + + + + Creating Tuple-Serial Entity Bindings + + + + + + + + + +
    +
    +
    +
    +

    +Creating Tuple-Serial Entity Bindings +

    +
    +
    +
    +

    +In the prior example serial keys and serial values were used, +and the +SerialSerialBinding + +base class was used for entity bindings. In this example, tuple +keys and serial values are used and therefore the +TupleSerialBinding + +base class is used for entity bindings. +

    +

    +As with any entity binding, a key and value is converted to an +entity in the +TupleSerialBinding.entryToObject + +method, and from an entity to +a key and value in the +TupleSerialBinding.objectToKey + +and +TupleSerialBinding.objectToData + +methods. But since keys are +stored as tuples, not as serialized objects, key fields are read +and written using the +TupleInput + +and +TupleOutput + +parameters. +

    +

    +The SampleViews class contains the modified entity +binding classes that were defined in the prior example: +PartBinding, SupplierBinding and +ShipmentBinding. +

    + +
    import com.sleepycat.bind.serial.TupleSerialBinding;
    +import com.sleepycat.bind.tuple.TupleInput;
    +import com.sleepycat.bind.tuple.TupleOutput;
    +...
    +public class SampleViews
    +{
    +    ...
    +    private static class PartBinding extends TupleSerialBinding 
    +    {
    +        private PartBinding(ClassCatalog classCatalog, Class dataClass)
    +        {
    +            super(classCatalog, dataClass);
    +        }
    +        public Object entryToObject(TupleInput keyInput, Object dataInput)
    +        {
    +            String number = keyInput.readString();
    +            PartData data = (PartData) dataInput;
    +            return new Part(number, data.getName(), data.getColor(),
    +                            data.getWeight(), data.getCity());
    +        }
    +        public void objectToKey(Object object, TupleOutput output)
    +        {
    +            Part part = (Part) object;
    +            output.writeString(part.getNumber());
    +        }
    +        public Object objectToData(Object object)
    +        {
    +            Part part = (Part) object;
    +            return new PartData(part.getName(), part.getColor(),
    +                                 part.getWeight(), part.getCity());
    +        }
    +    }
    +    ...
    +    private static class SupplierBinding extends TupleSerialBinding
    +    {
    +        private SupplierBinding(ClassCatalog classCatalog, Class dataClass)
    +        {
    +            super(classCatalog, dataClass);
    +        }
    +        public Object entryToObject(TupleInput keyInput, Object dataInput)
    +        {
    +            String number = keyInput.readString();
    +            SupplierData data = (SupplierData) dataInput;
    +            return new Supplier(number, data.getName(),
    +                                data.getStatus(), data.getCity());
    +        }
    +        public void objectToKey(Object object, TupleOutput output)
    +        {
    +            Supplier supplier = (Supplier) object;
    +            output.writeString(supplier.getNumber());
    +        }
    +        public Object objectToData(Object object)
    +        {
    +            Supplier supplier = (Supplier) object;
    +            return new SupplierData(supplier.getName(), 
    +                                    supplier.getStatus(),
    +                                    supplier.getCity());
    +        }
    +    }
    +    ...
    +    private static class ShipmentBinding extends TupleSerialBinding
    +    {
    +        private ShipmentBinding(ClassCatalog classCatalog, Class dataClass)
    +        {
    +            super(classCatalog, dataClass);
    +        }
    +        public Object entryToObject(TupleInput keyInput, Object dataInput)
    +        {
    +            String partNumber = keyInput.readString();
    +            String supplierNumber = keyInput.readString();
    +            ShipmentData data = (ShipmentData) dataInput;
    +            return new Shipment(partNumber, supplierNumber,
    +                                data.getQuantity());
    +        }
    +        public void objectToKey(Object object, TupleOutput output)
    +        {
    +            Shipment shipment = (Shipment) object;
    +            output.writeString(shipment.getPartNumber());
    +            output.writeString(shipment.getSupplierNumber());
    +        }
    +        public Object objectToData(Object object)
    +        {
    +            Shipment shipment = (Shipment) object;
    +            return new ShipmentData(shipment.getQuantity());
    +        }
    +    }
    +    ...
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/tuplekeybindings.html b/docs/collections/tutorial/tuplekeybindings.html new file mode 100644 index 0000000..363e81a --- /dev/null +++ b/docs/collections/tutorial/tuplekeybindings.html @@ -0,0 +1,219 @@ + + + + + + Creating Tuple Key Bindings + + + + + + + + + +
    +
    +
    +
    +

    + Creating Tuple Key Bindings +

    +
    +
    +
    +

    + Serial bindings were used in prior examples as key bindings, and + keys were stored as serialized objects. In this example, a tuple + binding is used for each key since keys will be stored as tuples. + Because keys are no longer stored as serialized objects, the + PartKey, SupplierKey and ShipmentKey classes + no longer implement the + Serializable + + interface (this is the only change to these classes and is not + shown below). +

    +

    + For the Part key, Supplier key, + and Shipment key, the + SampleViews class was changed in this example to create a + custom + TupleBinding + + instead of a + SerialBinding. + The custom tuple key binding classes are defined further below. +

    + +
    import com.sleepycat.bind.tuple.TupleBinding;
    +...
    +public class SampleViews
    +{
    +    ...
    +    public SampleViews(SampleDatabase db)
    +    {
    +        ...
    +        ClassCatalog catalog = db.getClassCatalog();
    +        EntryBinding partKeyBinding =
    +            new PartKeyBinding();
    +        EntityBinding partDataBinding =
    +            new PartBinding(catalog, PartData.class);
    +        EntryBinding supplierKeyBinding =
    +            new SupplierKeyBinding();
    +        EntityBinding supplierDataBinding =
    +            new SupplierBinding(catalog, SupplierData.class);
    +        EntryBinding shipmentKeyBinding =
    +            new ShipmentKeyBinding();
    +        EntityBinding shipmentDataBinding =
    +            new ShipmentBinding(catalog, ShipmentData.class);
    +        EntryBinding cityKeyBinding =
    +            TupleBinding.getPrimitiveBinding(String.class);
    +        ...
    +    }
    +} 
    +

    + For the City key, however, a custom binding class is not needed + because the key class is a primitive Java type, + String. + For any primitive Java type, a tuple binding may be created using the + TupleBinding.getPrimitiveBinding + + static method. +

    +

    + The custom key binding classes, PartKeyBinding, + SupplierKeyBinding and ShipmentKeyBinding, are + defined by extending the + TupleBinding + + class. The + TupleBinding + + abstract class implements the + EntryBinding + + interface, and is used for one-to-one bindings between tuples and + objects. Each binding class implements two methods for converting + between tuples and objects. Tuple fields are read using the + TupleInput + + parameter and written using the + TupleOutput + + parameter. +

    + +
    import com.sleepycat.bind.tuple.TupleBinding;
    +import com.sleepycat.bind.tuple.TupleInput;
    +import com.sleepycat.bind.tuple.TupleOutput;
    +...
    +public class SampleViews
    +{
    +...
    +
    +    private static class PartKeyBinding extends TupleBinding
    +    {
    +        private PartKeyBinding()
    +        {
    +        }
    +
    +        public Object entryToObject(TupleInput input)
    +        {
    +            String number = input.readString();
    +            return new PartKey(number);
    +        }
    +
    +        public void objectToEntry(Object object, TupleOutput output)
    +        {
    +            PartKey key = (PartKey) object;
    +            output.writeString(key.getNumber());
    +        }
    +    }
    +    ...
    +    private static class SupplierKeyBinding extends TupleBinding
    +    {
    +        private SupplierKeyBinding()
    +        {
    +        }
    +
    +        public Object entryToObject(TupleInput input)
    +        {
    +            String number = input.readString();
    +            return new SupplierKey(number);
    +        }
    +
    +        public void objectToEntry(Object object, TupleOutput output)
    +        {
    +            SupplierKey key = (SupplierKey) object;
    +            output.writeString(key.getNumber());
    +        }
    +    }
    +    ...
    +    private static class ShipmentKeyBinding extends TupleBinding
    +    {
    +        private ShipmentKeyBinding()
    +        {
    +        }
    +
    +        public Object entryToObject(TupleInput input) 
    +        {
    +             String partNumber = input.readString();
    +             String supplierNumber = input.readString();
    +             return new ShipmentKey(partNumber, supplierNumber);
    +        }
    +        public void objectToEntry(Object object, TupleOutput output)
    +        {
    +            ShipmentKey key = (ShipmentKey) object;
    +            output.writeString(key.getPartNumber());
    +            output.writeString(key.getSupplierNumber());
    +        }
    +    }
    +    ...
    +} 
    +
    + + + diff --git a/docs/collections/tutorial/tupleswithkeycreators.html b/docs/collections/tutorial/tupleswithkeycreators.html new file mode 100644 index 0000000..f24c8e6 --- /dev/null +++ b/docs/collections/tutorial/tupleswithkeycreators.html @@ -0,0 +1,206 @@ + + + + + + Using Tuples with Key Creators + + + + + + + + + +
    +
    +
    +
    +

    + Using Tuples with Key Creators +

    +
    +
    +
    +

    + Key creators were used in prior examples to extract index keys + from value objects. The keys were returned as deserialized key + objects, since the serial format was used for keys. In this + example, the tuple format is used for keys and the key creators + return keys by writing information to a tuple. The differences + between this example and the prior example are: +

    +
    + +
    +

    + In addition to writing key tuples, the + ShipmentByPartKeyCreator and + ShipmentBySupplierKeyCreator classes also read the key tuple + of the primary key. This is because they extract the index key from + fields in the Shipment's primary key. Instead of calling getter + methods on the ShipmentKey object, as in prior examples, + these methods call + TupleInput.readString. + The ShipmentKey consists of two string fields that are read + in sequence. +

    +

    + The modified key creators are shown below: + SupplierByCityKeyCreator, + ShipmentByPartKeyCreator + and ShipmentBySupplierKeyCreator. +

    + +
    import com.sleepycat.bind.serial.TupleSerialKeyCreator;
    +import com.sleepycat.bind.tuple.TupleInput;
    +import com.sleepycat.bind.tuple.TupleOutput;
    +...
    +public class SampleDatabase
    +{
    +    ...
    +    private static class SupplierByCityKeyCreator
    +        extends TupleSerialKeyCreator
    +    {
    +        private SupplierByCityKeyCreator(ClassCatalog catalog,
    +                                         Class valueClass)
    +        {
    +            super(catalog, valueClass);
    +        }
    +
    +        public boolean createSecondaryKey(TupleInput primaryKeyInput,
    +                                          Object valueInput,
    +                                          TupleOutput indexKeyOutput)
    +        {
    +            SupplierData supplierData = (SupplierData) valueInput;
    +            String city = supplierData.getCity();
    +            if (city != null) {
    +                indexKeyOutput.writeString(supplierData.getCity());
    +                return true;
    +            } else {
    +                return false;
    +            }
    +        }
    +    }
    +
    +    private static class ShipmentByPartKeyCreator
    +        extends TupleSerialKeyCreator
    +    {
    +        private ShipmentByPartKeyCreator(ClassCatalog catalog,
    +                                         Class valueClass)
    +        {
    +            super(catalog, valueClass);
    +        }
    +
    +        public boolean createSecondaryKey(TupleInput primaryKeyInput,
    +                                          Object valueInput,
    +                                          TupleOutput indexKeyOutput)
    +        {
    +            String partNumber = primaryKeyInput.readString();
    +            // don't bother reading the supplierNumber
    +            indexKeyOutput.writeString(partNumber);
    +            return true;
    +        }
    +    }
    +
    +    private static class ShipmentBySupplierKeyCreator
    +        extends TupleSerialKeyCreator
    +    {
    +        private ShipmentBySupplierKeyCreator(ClassCatalog catalog,
    +                                             Class valueClass)
    +        {
    +            super(catalog, valueClass);
    +        }
    +
    +        public boolean createSecondaryKey(TupleInput primaryKeyInput,
    +                                          Object valueInput,
    +                                          TupleOutput indexKeyOutput)
    +        {
    +            primaryKeyInput.readString(); // skip the partNumber
    +            String supplierNumber = primaryKeyInput.readString();
    +            indexKeyOutput.writeString(supplierNumber);
    +            return true;
    +        }
    +    }
    +    ...
    +}
    +	
    +
    + + + diff --git a/docs/collections/tutorial/tutorialintroduction.html b/docs/collections/tutorial/tutorialintroduction.html new file mode 100644 index 0000000..4c68371 --- /dev/null +++ b/docs/collections/tutorial/tutorialintroduction.html @@ -0,0 +1,411 @@ + + + + + + Tutorial Introduction + + + + + + + + + +
    +
    +
    +
    +

    Tutorial Introduction

    +
    +
    +
    +

    + Most of the remainder of this document illustrates the use of the + JE JE Collections API by presenting a tutorial that describes usage of the API. + This tutorial builds a shipment database, a familiar example from classic + database texts. +

    +

    + The examples illustrate the following concepts of the JE JE Collections API: +

    +
    +
      +
    • +

      + Object-to-data bindings +

      +
    • +
    • +

      + The database environment +

      +
    • +
    • +

      + Databases that contain key/value records +

      +
    • +
    • +

      + Secondary index databases that contain index keys +

      +
    • +
    • +

      + Java collections for accessing databases and + indices +

      +
    • +
    • +

      + Transactions used to commit or undo database + changes +

      +
    • +
    +
    +

    + The examples build on each other, but at the same time the + source code for each example stands alone. +

    + +

    + The shipment database consists of three database stores: the + part store, the supplier store, and the shipment store. Each store + contains a number of records, and each record consists of a key and + a value. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StoreKeyValue
    PartPart NumberName, Color, Weight, City
    SupplierSupplier NumberName, Status, City
    ShipmentPart Number, Supplier NumberQuantity
    +
    +

    + In the example programs, Java classes containing the fields + above are defined for the key and value of each store: + PartKey, + PartData, + SupplierKey, + SupplierData, + ShipmentKey and ShipmentData. In + addition, because the Part's Weight field is itself composed of two + fields — the weight value and the unit of measure — it is + represented by a separate Weight class. These classes will + be defined in the first example program. +

    +

    + In general the JE JE Collections API uses bindings to + describe how Java objects are stored. A binding defines the stored + data syntax and the mapping between a Java object and the stored + data. The example programs show how to create different types of + bindings, and explains the characteristics of each type. +

    +

    + The following tables show the record values that are used in + all the example programs in the tutorial. + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NumberNameColorWeightCity
    P1NutRed12.0 gramsLondon
    P2BoltGreen17.0 gramsParis
    P3ScrewBlue17.0 gramsRome
    P4ScrewRed14.0 gramsLondon
    P5CamBlue12.0 gramsParis
    P6CogRed19.0 gramsLondon
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NumberNameStatusCity
    S1Smith20London
    S2Jones10Paris
    S3Blake30Paris
    S4Clark20London
    S5Adams30Athens
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Part NumberSupplier NumberQuantity
    P1S1300
    P1S2300
    P2S1200
    P2S2400
    P2S3200
    P2S4200
    P3S1400
    P4S1200
    P4S4300
    P5S1100
    P5S4400
    P6S1100
    +
    +
    + + + diff --git a/docs/collections/tutorial/usingtransactions.html b/docs/collections/tutorial/usingtransactions.html new file mode 100644 index 0000000..f443615 --- /dev/null +++ b/docs/collections/tutorial/usingtransactions.html @@ -0,0 +1,222 @@ + + + + + + Using Transactions + + + + + + + + + +
    +
    +
    +
    +

    + Using Transactions +

    +
    +
    +
    +

    + JE transactional applications have standard + transactional characteristics: recoverability, atomicity and + integrity (this is sometimes also referred to generically as ACID + properties). The JE JE Collections API provides these + transactional capabilities using a transaction-per-thread + model. Once a transaction is begun, it is implicitly associated + with the current thread until it is committed or aborted. This + model is used for the following reasons. +

    +
    +
      +
    • +

      + The transaction-per-thread model is commonly used in other Java + APIs such as J2EE. +

      +
    • +
    • +

      + Since the Java collections API is used for data access, there + is no way to pass a transaction object to methods such + as + Map.put. +

      +
    • +
    +
    +

    + The JE JE Collections API provides two transaction APIs. The + lower-level API is the + CurrentTransaction + + class. It provides a way to get the transaction for the current + thread, and to begin, commit and abort transactions. It also + provides access to the Berkeley DB core API + Transaction + + + object. With + CurrentTransaction, + just as in the + com.sleepycat.je + + API, the application is responsible + for beginning, committing and aborting transactions, and for + handling deadlock exceptions and retrying operations. This API may + be needed for some applications, but it is not used in the + example. +

    +

    + The example uses the higher-level + TransactionRunner + + and + TransactionWorker + + APIs, which are build on top of + CurrentTransaction. + TransactionRunner.run() automatically begins a transaction and + then calls the TransactionWorker.doWork() method, which is + implemented by the application. +

    +

    + The TransactionRunner.run() method automatically detects + deadlock exceptions and performs retries by repeatedly calling the + TransactionWorker.doWork() method until the operation succeeds + or the maximum retry count is reached. If the maximum retry count + is reached or if another exception (other than + + LockConflictException) + + + is thrown by TransactionWorker.doWork(), then the transaction + will be automatically aborted. Otherwise, the transaction will be + automatically committed. +

    +

    + Using this high-level API, if TransactionRunner.run() + throws an exception, the application can assume that the operation + failed and the transaction was aborted; otherwise, when an + exception is not thrown, the application can assume the operation + succeeded and the transaction was committed. +

    +

    + The Sample.run() method creates a TransactionRunner + object and calls its run() method. +

    + +
    import com.sleepycat.collections.TransactionRunner;
    +import com.sleepycat.collections.TransactionWorker;
    +...
    +public class Sample
    +{
    +    private SampleDatabase db;
    +    ...
    +    private void run()
    +        throws Exception
    +    {
    +        TransactionRunner runner = 
    +            new TransactionRunner(db.getEnvironment());
    +        runner.run(new PopulateDatabase());
    +        runner.run(new PrintDatabase());
    +    }
    +    ...
    +    private class PopulateDatabase implements TransactionWorker
    +    {
    +        public void doWork()
    +            throws Exception
    +        {
    +        }
    +    }
    +
    +    private class PrintDatabase implements TransactionWorker
    +    {
    +        public void doWork()
    +            throws Exception
    +        {
    +        }
    +    }
    +} 
    +

    + The run() method is called by main() and was outlined + in the previous section. It first creates a + TransactionRunner, passing the database environment to its + constructor. +

    +

    + It then calls TransactionRunner.run() to execute two + transactions, passing instances of the application-defined + PopulateDatabase and + PrintDatabase nested classes. + These classes implement the TransactionWorker.doWork() method + and will be fully described in the next two sections. +

    +

    + For each call to TransactionRunner.run(), a separate + transaction will be performed. The use of two transactions in the + example — one for populating the database and another for printing + its contents — is arbitrary. A real-life application should be + designed to create transactions for each group of operations that + should have ACID properties, while also + taking into account the impact of transactions on performance. +

    +

    + The advantage of using TransactionRunner is that deadlock + retries and transaction begin, commit and abort are handled + automatically. However, a TransactionWorker class must be + implemented for each type of transaction. If desired, anonymous + inner classes can be used to implement the TransactionWorker + interface. +

    +
    + + + diff --git a/docs/doclet/Debug.java b/docs/doclet/Debug.java new file mode 100644 index 0000000..97620be --- /dev/null +++ b/docs/doclet/Debug.java @@ -0,0 +1,58 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2014 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.io.PrintStream; + +final class Debug { + /** + * Set this value to true to enable debugging. + */ + public static final boolean DEBUG = true; + + /** + * Set this value to control where debug messages appear. + */ + public static PrintStream pstrmError = System.out; + + public static void println(Object objMessage) { + if (DEBUG) { + pstrmError.println(objMessage); + } + } + + private static void _printAssert() { + println("Assertion failed at :"); + + (new Throwable()).printStackTrace(); + } + + public static void _assert(boolean fExp) { + if (DEBUG) { + if (!fExp) { + _printAssert(); + } + } + } + + public static void _assert(boolean fExp, String szMessage) { + if (DEBUG) { + if (!fExp) { + println(szMessage); + _printAssert(); + } + } + } + + public static void printStackTrace(Throwable t) { + t.printStackTrace(pstrmError); + } + + public static void printException(Exception e) { + pstrmError.println(e); + printStackTrace(e); + } +} diff --git a/docs/doclet/HidingAnnotatedTypeWrapper.java b/docs/doclet/HidingAnnotatedTypeWrapper.java new file mode 100644 index 0000000..27bdee7 --- /dev/null +++ b/docs/doclet/HidingAnnotatedTypeWrapper.java @@ -0,0 +1,35 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotatedType; +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.Type; + +class HidingAnnotatedTypeWrapper extends HidingTypeWrapper + implements AnnotatedType { + + public HidingAnnotatedTypeWrapper(AnnotatedType type, Map mapWrappers) { + super(type, mapWrappers); + } + + private AnnotatedType _getAnnotatedType() { + return (AnnotatedType) getWrappedObject(); + } + + @Override + public AnnotationDesc[] annotations() { + return (AnnotationDesc[]) wrapOrHide( + _getAnnotatedType().annotations()); + } + + @Override + public Type underlyingType() { + return (Type) wrapOrHide(_getAnnotatedType().underlyingType()); + } +} diff --git a/docs/doclet/HidingAnnotationDescWrapper.java b/docs/doclet/HidingAnnotationDescWrapper.java new file mode 100644 index 0000000..4c65305 --- /dev/null +++ b/docs/doclet/HidingAnnotationDescWrapper.java @@ -0,0 +1,40 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.AnnotationTypeDoc; + +class HidingAnnotationDescWrapper extends HidingWrapper + implements AnnotationDesc { + + public HidingAnnotationDescWrapper(AnnotationDesc type, + Map mapWrappers) { + super(type, mapWrappers); + } + + private AnnotationDesc _getAnnotationDesc() { + return (AnnotationDesc)getWrappedObject(); + } + + @Override + public AnnotationTypeDoc annotationType() { + return (AnnotationTypeDoc) + wrapOrHide(_getAnnotationDesc().annotationType()); + } + + @Override + public AnnotationDesc.ElementValuePair[] elementValues() { + return _getAnnotationDesc().elementValues(); + } + + @Override + public boolean isSynthesized() { + return _getAnnotationDesc().isSynthesized(); + } +} diff --git a/docs/doclet/HidingAnnotationTypeDocWrapper.java b/docs/doclet/HidingAnnotationTypeDocWrapper.java new file mode 100644 index 0000000..a0ac9ee --- /dev/null +++ b/docs/doclet/HidingAnnotationTypeDocWrapper.java @@ -0,0 +1,29 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationTypeDoc; +import com.sun.javadoc.AnnotationTypeElementDoc; + +class HidingAnnotationTypeDocWrapper extends HidingClassDocWrapper + implements AnnotationTypeDoc { + public HidingAnnotationTypeDocWrapper(AnnotationTypeDoc type, + Map mapWrappers) { + super(type, mapWrappers); + } + + private AnnotationTypeDoc _getAnnotationTypeDoc() { + return (AnnotationTypeDoc)getWrappedObject(); + } + + @Override + public AnnotationTypeElementDoc[] elements() { + return (AnnotationTypeElementDoc[]) + wrapOrHide(_getAnnotationTypeDoc().elements()); + } +} diff --git a/docs/doclet/HidingAnnotationTypeElementDocWrapper.java b/docs/doclet/HidingAnnotationTypeElementDocWrapper.java new file mode 100644 index 0000000..647719a --- /dev/null +++ b/docs/doclet/HidingAnnotationTypeElementDocWrapper.java @@ -0,0 +1,30 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationTypeElementDoc; +import com.sun.javadoc.AnnotationValue; + +class HidingAnnotationTypeElementDocWrapper extends HidingMethodDocWrapper + implements AnnotationTypeElementDoc { + + public HidingAnnotationTypeElementDocWrapper( + AnnotationTypeElementDoc memdoc, Map mapWrappers) { + super(memdoc, mapWrappers); + } + + private AnnotationTypeElementDoc _getAnnotationTypeElementDoc() { + return (AnnotationTypeElementDoc)getWrappedObject(); + } + + @Override + public AnnotationValue defaultValue() { + return (AnnotationValue) + wrapOrHide(_getAnnotationTypeElementDoc().defaultValue()); + } +} diff --git a/docs/doclet/HidingAnnotationValueWrapper.java b/docs/doclet/HidingAnnotationValueWrapper.java new file mode 100644 index 0000000..12df9f8 --- /dev/null +++ b/docs/doclet/HidingAnnotationValueWrapper.java @@ -0,0 +1,32 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationValue; + +class HidingAnnotationValueWrapper extends HidingWrapper + implements AnnotationValue { + public HidingAnnotationValueWrapper(AnnotationValue value, + Map mapWrappers) { + super(value, mapWrappers); + } + + private AnnotationValue _getAnnotationValue() { + return (AnnotationValue)getWrappedObject(); + } + + @Override + public Object value() { + return _getAnnotationValue().value(); + } + + @Override + public String toString() { + return _getAnnotationValue().toString(); + } +} diff --git a/docs/doclet/HidingClassDocWrapper.java b/docs/doclet/HidingClassDocWrapper.java new file mode 100644 index 0000000..3956206 --- /dev/null +++ b/docs/doclet/HidingClassDocWrapper.java @@ -0,0 +1,241 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotatedType; +import com.sun.javadoc.AnnotationTypeDoc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ConstructorDoc; +import com.sun.javadoc.FieldDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.PackageDoc; +import com.sun.javadoc.ParamTag; +import com.sun.javadoc.ParameterizedType; +import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; +import com.sun.javadoc.WildcardType; + +class HidingClassDocWrapper extends HidingProgramElementDocWrapper + implements ClassDoc { + + public HidingClassDocWrapper(ClassDoc classdoc, Map mapWrappers) { + super(classdoc, mapWrappers); + } + + private ClassDoc _getClassDoc() { + return (ClassDoc)getWrappedObject(); + } + + /* ClassDoc */ + + @Override + public boolean isAbstract() { + return _getClassDoc().isAbstract(); + } + + @Override + public boolean isSerializable() { + return _getClassDoc().isSerializable(); + } + + @Override + public boolean isExternalizable() { + return _getClassDoc().isExternalizable(); + } + + @Override + public MethodDoc[] serializationMethods() { + return (MethodDoc[])wrapOrHide(_getClassDoc().serializationMethods()); + } + + @Override + public FieldDoc[] serializableFields() { + return (FieldDoc[])wrapOrHide(_getClassDoc().serializableFields()); + } + + @Override + public boolean definesSerializableFields() { + return _getClassDoc().definesSerializableFields(); + } + + @Override + public ClassDoc superclass() { + return (ClassDoc)wrapOrHide(_getClassDoc().superclass()); + } + + @Override + public Type superclassType() { + return (Type) wrapOrHide(_getClassDoc().superclassType()); + } + + @Override + public boolean subclassOf(ClassDoc classdoc) { + if (classdoc instanceof HidingClassDocWrapper) { + classdoc = (ClassDoc) + ((HidingClassDocWrapper)classdoc).getWrappedObject(); + } + + return _getClassDoc().subclassOf(classdoc); + } + + @Override + public ClassDoc[] interfaces() { + return (ClassDoc[])wrapOrHide(_getClassDoc().interfaces()); + } + + @Override + public Type[] interfaceTypes() { + return (Type[]) wrapOrHide(_getClassDoc().interfaceTypes()); + } + + @Override + public TypeVariable[] typeParameters() { + return (TypeVariable[]) wrapOrHide(_getClassDoc().typeParameters()); + } + + @Override + public ParamTag[] typeParamTags() { + return (ParamTag[]) wrapOrHide(_getClassDoc().typeParamTags()); + } + + @Override + public FieldDoc[] fields() { + return (FieldDoc[])wrapOrHide(_getClassDoc().fields()); + } + + @Override + public FieldDoc[] fields(boolean filter) { + return (FieldDoc[])wrapOrHide(_getClassDoc().fields(filter)); + } + + @Override + public FieldDoc[] enumConstants() { + return (FieldDoc[])wrapOrHide(_getClassDoc().enumConstants()); + } + + @Override + public MethodDoc[] methods() { + return (MethodDoc[])wrapOrHide(_getClassDoc().methods()); + } + + @Override + public MethodDoc[] methods(boolean filter) { + return (MethodDoc[])wrapOrHide(_getClassDoc().methods(filter)); + } + + @Override + public ConstructorDoc[] constructors() { + return (ConstructorDoc[])wrapOrHide(_getClassDoc().constructors()); + } + + @Override + public ConstructorDoc[] constructors(boolean filter) { + return (ConstructorDoc[]) + wrapOrHide(_getClassDoc().constructors(filter)); + } + + @Override + public ClassDoc[] innerClasses() { + return (ClassDoc[])wrapOrHide(_getClassDoc().innerClasses()); + } + + @Override + public ClassDoc[] innerClasses(boolean filter) { + return (ClassDoc[])wrapOrHide(_getClassDoc().innerClasses(filter)); + } + + @Override + public ClassDoc findClass(String szClassName) { + return (ClassDoc)wrapOrHide(_getClassDoc().findClass(szClassName)); + } + + /** + * @deprecated as of 11.0 + */ + @Override + public ClassDoc[] importedClasses() { + return (ClassDoc[])wrapOrHide(_getClassDoc().importedClasses()); + } + + /** + * @deprecated as of 11.0 + */ + @Override + public PackageDoc[] importedPackages() { + return (PackageDoc[])wrapOrHide(_getClassDoc().importedPackages()); + } + + /* Type */ + + @Override + public String typeName() { + return _getClassDoc().typeName(); + } + + @Override + public String qualifiedTypeName() { + return _getClassDoc().qualifiedTypeName(); + } + + @Override + public String simpleTypeName() { + return _getClassDoc().simpleTypeName(); + } + + @Override + public String dimension() { + return _getClassDoc().dimension(); + } + + @Override + public String toString() { + return _getClassDoc().toString(); + } + + @Override + public boolean isPrimitive() { + return _getClassDoc().isPrimitive(); + } + + @Override + public ClassDoc asClassDoc() { + return this; + } + + @Override + public ParameterizedType asParameterizedType() { + return (ParameterizedType)wrapOrHide( + _getClassDoc().asParameterizedType()); + } + + @Override + public TypeVariable asTypeVariable() { + return (TypeVariable)wrapOrHide(_getClassDoc().asTypeVariable()); + } + + @Override + public WildcardType asWildcardType() { + return (WildcardType)wrapOrHide(_getClassDoc().asWildcardType()); + } + + @Override + public AnnotatedType asAnnotatedType() { + return (AnnotatedType)wrapOrHide(_getClassDoc().asAnnotatedType()); + } + + @Override + public AnnotationTypeDoc asAnnotationTypeDoc() { + return (AnnotationTypeDoc)wrapOrHide( + _getClassDoc().asAnnotationTypeDoc()); + } + + @Override + public Type getElementType() { + return (Type)wrapOrHide(_getClassDoc().getElementType()); + } +} diff --git a/docs/doclet/HidingConstructorDocWrapper.java b/docs/doclet/HidingConstructorDocWrapper.java new file mode 100644 index 0000000..8eb3bd0 --- /dev/null +++ b/docs/doclet/HidingConstructorDocWrapper.java @@ -0,0 +1,22 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ConstructorDoc; + +class HidingConstructorDocWrapper extends HidingExecutableMemberDocWrapper + implements ConstructorDoc { + public HidingConstructorDocWrapper(ConstructorDoc constrdoc, + Map mapWrappers) { + super(constrdoc, mapWrappers); + } + + private ConstructorDoc _getConstructorDoc() { + return (ConstructorDoc)getWrappedObject(); + } +} diff --git a/docs/doclet/HidingDocWrapper.java b/docs/doclet/HidingDocWrapper.java new file mode 100644 index 0000000..8bd70e7 --- /dev/null +++ b/docs/doclet/HidingDocWrapper.java @@ -0,0 +1,149 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.Doc; +import com.sun.javadoc.SeeTag; +import com.sun.javadoc.SourcePosition; +import com.sun.javadoc.Tag; + +class HidingDocWrapper extends HidingWrapper implements Doc { + + public HidingDocWrapper(Doc doc, Map mapWrappers) { + super(doc, mapWrappers); + } + + private Doc _getDoc() { + return (Doc)getWrappedObject(); + } + + @Override + public String commentText() { + return _getDoc().commentText(); + } + + @Override + public Tag[] tags() { + return (Tag[])wrapOrHide(_getDoc().tags()); + } + + @Override + public Tag[] tags(String szTagName) { + return (Tag[])wrapOrHide(_getDoc().tags(szTagName)); + } + + @Override + public SeeTag[] seeTags() { + return (SeeTag[])wrapOrHide(_getDoc().seeTags()); + } + + @Override + public Tag[] inlineTags() { + return (Tag[])wrapOrHide(_getDoc().inlineTags()); + } + + @Override + public Tag[] firstSentenceTags() { + return (Tag[])wrapOrHide(_getDoc().firstSentenceTags()); + } + + @Override + public String getRawCommentText() { + return _getDoc().getRawCommentText(); + } + + @Override + public void setRawCommentText(String szText) { + _getDoc().setRawCommentText(szText); + } + + @Override + public String name() { + return _getDoc().name(); + } + + @Override + public int compareTo(Object obj) { + if (obj instanceof HidingWrapper) { + return _getDoc(). + compareTo(((HidingWrapper)obj).getWrappedObject()); + } else { + return _getDoc().compareTo(obj); + } + } + + @Override + public boolean isField() { + return _getDoc().isField(); + } + + @Override + public boolean isEnumConstant() { + return _getDoc().isEnumConstant(); + } + + @Override + public boolean isConstructor() { + return _getDoc().isConstructor(); + } + + @Override + public boolean isMethod() { + return _getDoc().isMethod(); + } + + @Override + public boolean isAnnotationTypeElement() { + return _getDoc().isAnnotationTypeElement(); + } + + @Override + public boolean isInterface() { + return _getDoc().isInterface(); + } + + @Override + public boolean isException() { + return _getDoc().isException(); + } + + @Override + public boolean isError() { + return _getDoc().isError(); + } + + @Override + public boolean isEnum() { + return _getDoc().isEnum(); + } + + @Override + public boolean isAnnotationType() { + return _getDoc().isAnnotationType(); + } + + @Override + public boolean isOrdinaryClass() { + return _getDoc().isOrdinaryClass(); + } + + @Override + public boolean isClass() { + return _getDoc().isClass(); + } + + @Override + public boolean isIncluded() { + return _getDoc().isIncluded(); + } + + @Override + public SourcePosition position() { + return _getDoc().position(); + } +} diff --git a/docs/doclet/HidingDoclet.java b/docs/doclet/HidingDoclet.java new file mode 100644 index 0000000..891f00b --- /dev/null +++ b/docs/doclet/HidingDoclet.java @@ -0,0 +1,64 @@ +/*- + * See the files LICENSE for redistribution information. + * + * Copyright (c) 2002, 2014 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.HashMap; + +import com.sun.javadoc.DocErrorReporter; +import com.sun.javadoc.LanguageVersion; +import com.sun.javadoc.RootDoc; +import com.sun.tools.doclets.standard.Standard; + +/** + * A doclet that allows developers to hide documentation for java elements. + * + * @see oracle.olapi.hidingDoclet + */ +public class HidingDoclet extends Standard { + + private static Class s_classBaseDoclet; + + /** + * javadoc calls this method to generate documentation + */ + public static boolean start(RootDoc root) { + return Standard.start(new HidingRootDocWrapper(root, new HashMap())); + } + + /** + * javadoc calls this method to check the validity of doclet-specific + * command-line arguments. + *

    + * Any arguments accepted by the standard doclet will be accepted by + * HidingDoclet. + */ + public static boolean validOptions(String options[][], + DocErrorReporter reporter) { + return Standard.validOptions(options, reporter); + } + + /** + * javadoc calls this method to check the number of non-flag command-line + * arguments that should follow the given command-line flag. + *

    + * Any arguments accepted by the standard doclet will be accepted by + * HidingDoclet. + */ + public static int optionLength(String option) { + return Standard.optionLength(option); + } + + /** + * javadoc calls this method to check whether the doclet supports the + * Java 5 extensions (generic types, annotations, enums, and varArgs) + *

    + * Any arguments accepted by the standard doclet will be accepted by + * HidingDoclet. + */ + public static LanguageVersion languageVersion() { + return LanguageVersion.JAVA_1_5; //dgm code change + } +} diff --git a/docs/doclet/HidingExecutableMemberDocWrapper.java b/docs/doclet/HidingExecutableMemberDocWrapper.java new file mode 100644 index 0000000..dc4da8b --- /dev/null +++ b/docs/doclet/HidingExecutableMemberDocWrapper.java @@ -0,0 +1,100 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ExecutableMemberDoc; +import com.sun.javadoc.ParamTag; +import com.sun.javadoc.Parameter; +import com.sun.javadoc.ThrowsTag; +import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; + +class HidingExecutableMemberDocWrapper extends HidingMemberDocWrapper + implements ExecutableMemberDoc { + + public HidingExecutableMemberDocWrapper(ExecutableMemberDoc execmemdoc, + Map mapWrappers) { + super(execmemdoc, mapWrappers); + } + + private ExecutableMemberDoc _getExecutableMemberDoc() { + return (ExecutableMemberDoc)getWrappedObject(); + } + + @Override + public ClassDoc[] thrownExceptions() { + return (ClassDoc[]) + wrapOrHide(_getExecutableMemberDoc().thrownExceptions()); + } + + @Override + public Type[] thrownExceptionTypes() { + return (Type[]) + wrapOrHide(_getExecutableMemberDoc().thrownExceptionTypes()); + } + + @Override + public boolean isNative() { + return _getExecutableMemberDoc().isNative(); + } + + @Override + public boolean isSynchronized() { + return _getExecutableMemberDoc().isSynchronized(); + } + + @Override + public boolean isVarArgs() { + return _getExecutableMemberDoc().isVarArgs(); + } + + @Override + public Parameter[] parameters() { + return (Parameter[])wrapOrHide(_getExecutableMemberDoc().parameters()); + } + + @Override + public Type receiverType() { + return (Type)wrapOrHide(_getExecutableMemberDoc().receiverType()); + } + + @Override + public ThrowsTag[] throwsTags() { + return (ThrowsTag[]) + wrapOrHide(_getExecutableMemberDoc().throwsTags()); + } + + @Override + public ParamTag[] paramTags() { + return (ParamTag[]) + wrapOrHide(_getExecutableMemberDoc().paramTags()); + } + + @Override + public ParamTag[] typeParamTags() { + return (ParamTag[]) + wrapOrHide(_getExecutableMemberDoc().typeParamTags()); + } + + @Override + public String signature() { + return _getExecutableMemberDoc().signature(); + } + + @Override + public String flatSignature() { + return _getExecutableMemberDoc().flatSignature(); + } + + @Override + public TypeVariable[] typeParameters() { + return (TypeVariable[]) + wrapOrHide(_getExecutableMemberDoc().typeParameters()); + } +} diff --git a/docs/doclet/HidingFieldDocWrapper.java b/docs/doclet/HidingFieldDocWrapper.java new file mode 100644 index 0000000..5667834 --- /dev/null +++ b/docs/doclet/HidingFieldDocWrapper.java @@ -0,0 +1,54 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.FieldDoc; +import com.sun.javadoc.SerialFieldTag; +import com.sun.javadoc.Type; + +class HidingFieldDocWrapper extends HidingMemberDocWrapper + implements FieldDoc { + + public HidingFieldDocWrapper(FieldDoc fielddoc, Map mapWrappers) { + super(fielddoc, mapWrappers); + } + + private FieldDoc _getFieldDoc() { + return (FieldDoc)getWrappedObject(); + } + + @Override + public Type type() { + return (Type)wrapOrHide(_getFieldDoc().type()); + } + + @Override + public boolean isTransient() { + return _getFieldDoc().isTransient(); + } + + @Override + public boolean isVolatile() { + return _getFieldDoc().isVolatile(); + } + + @Override + public SerialFieldTag[] serialFieldTags() { + return (SerialFieldTag[])wrapOrHide(_getFieldDoc().serialFieldTags()); + } + + @Override + public Object constantValue() { + return _getFieldDoc().constantValue(); + } + + @Override + public String constantValueExpression() { + return _getFieldDoc().constantValueExpression(); + } +} diff --git a/docs/doclet/HidingMemberDocWrapper.java b/docs/doclet/HidingMemberDocWrapper.java new file mode 100644 index 0000000..7919178 --- /dev/null +++ b/docs/doclet/HidingMemberDocWrapper.java @@ -0,0 +1,27 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.MemberDoc; + +class HidingMemberDocWrapper extends HidingProgramElementDocWrapper + implements MemberDoc { + + public HidingMemberDocWrapper(MemberDoc memdoc, Map mapWrappers) { + super(memdoc, mapWrappers); + } + + private MemberDoc _getMemberDoc() { + return (MemberDoc)getWrappedObject(); + } + + @Override + public boolean isSynthetic() { + return _getMemberDoc().isSynthetic(); + } +} diff --git a/docs/doclet/HidingMethodDocWrapper.java b/docs/doclet/HidingMethodDocWrapper.java new file mode 100644 index 0000000..5039f21 --- /dev/null +++ b/docs/doclet/HidingMethodDocWrapper.java @@ -0,0 +1,68 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.Type; +import com.sun.javadoc.AnnotationTypeElementDoc; + +class HidingMethodDocWrapper extends HidingExecutableMemberDocWrapper + implements MethodDoc { + public HidingMethodDocWrapper(MethodDoc methdoc, Map mapWrappers) { + super(methdoc, mapWrappers); + } + + private MethodDoc _getMethodDoc() { + return (MethodDoc)getWrappedObject(); + } + + @Override + public boolean isAbstract() { + return _getMethodDoc().isAbstract(); + } + + @Override + public boolean isDefault() { + return _getMethodDoc().isDefault(); + } + + @Override + public Type returnType() { + return (Type)wrapOrHide(_getMethodDoc().returnType()); + } + + @Override + public ClassDoc overriddenClass() { + return (ClassDoc)wrapOrHide(_getMethodDoc().overriddenClass()); + } + + @Override + public Type overriddenType() { + return (Type)wrapOrHide(_getMethodDoc().overriddenType()); + } + + @Override + public MethodDoc overriddenMethod() { + return (MethodDoc)wrapOrHide(_getMethodDoc().overriddenMethod()); + } + + @Override + public boolean overrides(MethodDoc meth) { + if (meth instanceof HidingAnnotationTypeElementDocWrapper) { + meth = (AnnotationTypeElementDoc) + ((HidingAnnotationTypeElementDocWrapper)meth). + getWrappedObject(); + } else if (meth instanceof HidingMethodDocWrapper) { + meth = (MethodDoc) + ((HidingMethodDocWrapper)meth).getWrappedObject(); + } + + return _getMethodDoc().overrides((MethodDoc) meth); + } +} diff --git a/docs/doclet/HidingPackageDocWrapper.java b/docs/doclet/HidingPackageDocWrapper.java new file mode 100644 index 0000000..44f8175 --- /dev/null +++ b/docs/doclet/HidingPackageDocWrapper.java @@ -0,0 +1,73 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.AnnotationTypeDoc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.PackageDoc; + +class HidingPackageDocWrapper extends HidingDocWrapper implements PackageDoc { + public HidingPackageDocWrapper(PackageDoc packdoc, Map mapWrappers) { + super(packdoc, mapWrappers); + } + + private PackageDoc _getPackageDoc() { + return (PackageDoc)getWrappedObject(); + } + + @Override + public ClassDoc[] allClasses(boolean filter) { + return (ClassDoc[])wrapOrHide(_getPackageDoc().allClasses(filter)); + } + + @Override + public ClassDoc[] allClasses() { + return (ClassDoc[])wrapOrHide(_getPackageDoc().allClasses()); + } + + @Override + public ClassDoc[] ordinaryClasses() { + return (ClassDoc[])wrapOrHide(_getPackageDoc().ordinaryClasses()); + } + + @Override + public ClassDoc[] exceptions() { + return (ClassDoc[])wrapOrHide(_getPackageDoc().exceptions()); + } + + @Override + public ClassDoc[] errors() { + return (ClassDoc[])wrapOrHide(_getPackageDoc().errors()); + } + + @Override + public ClassDoc[] enums() { + return (ClassDoc[])wrapOrHide(_getPackageDoc().enums()); + } + + @Override + public ClassDoc[] interfaces() { + return (ClassDoc[])wrapOrHide(_getPackageDoc().interfaces()); + } + + @Override + public AnnotationTypeDoc[] annotationTypes() { + return _getPackageDoc().annotationTypes(); + } + + @Override + public AnnotationDesc[] annotations() { + return _getPackageDoc().annotations(); + } + + @Override + public ClassDoc findClass(String szClassName) { + return (ClassDoc)wrapOrHide(_getPackageDoc().findClass(szClassName)); + } +} diff --git a/docs/doclet/HidingParamTagWrapper.java b/docs/doclet/HidingParamTagWrapper.java new file mode 100644 index 0000000..55a1b6a --- /dev/null +++ b/docs/doclet/HidingParamTagWrapper.java @@ -0,0 +1,35 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ParamTag; + +class HidingParamTagWrapper extends HidingTagWrapper implements ParamTag { + public HidingParamTagWrapper(ParamTag paramtag, Map mapWrappers) { + super(paramtag, mapWrappers); + } + + private ParamTag _getParamTag() { + return (ParamTag)getWrappedObject(); + } + + @Override + public String parameterName() { + return _getParamTag().parameterName(); + } + + @Override + public String parameterComment() { + return _getParamTag().parameterComment(); + } + + @Override + public boolean isTypeParameter() { + return _getParamTag().isTypeParameter(); + } +} diff --git a/docs/doclet/HidingParameterWrapper.java b/docs/doclet/HidingParameterWrapper.java new file mode 100644 index 0000000..d45cc7e --- /dev/null +++ b/docs/doclet/HidingParameterWrapper.java @@ -0,0 +1,47 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.Parameter; +import com.sun.javadoc.Type; + +class HidingParameterWrapper extends HidingWrapper implements Parameter { + public HidingParameterWrapper(Parameter param, Map mapWrappers) { + super(param, mapWrappers); + } + + private Parameter _getParameter() { + return (Parameter)getWrappedObject(); + } + + @Override + public Type type() { + return (Type)wrapOrHide(_getParameter().type()); + } + + @Override + public String name() { + return _getParameter().name(); + } + + @Override + public String typeName() { + return _getParameter().typeName(); + } + + @Override + public String toString() { + return _getParameter().toString(); + } + + @Override + public AnnotationDesc[] annotations() { + return (AnnotationDesc[])wrapOrHide(_getParameter().annotations()); + } +} diff --git a/docs/doclet/HidingParameterizedTypeWrapper.java b/docs/doclet/HidingParameterizedTypeWrapper.java new file mode 100644 index 0000000..aa42f9c --- /dev/null +++ b/docs/doclet/HidingParameterizedTypeWrapper.java @@ -0,0 +1,49 @@ +/*- + * See the file LICENSE for redistributiion information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ParameterizedType; +import com.sun.javadoc.Type; + +class HidingParameterizedTypeWrapper extends HidingTypeWrapper + implements ParameterizedType { + public HidingParameterizedTypeWrapper(ParameterizedType type, + Map mapWrappers) { + super(type, mapWrappers); + } + + private ParameterizedType _getParameterizedType() { + return (ParameterizedType)getWrappedObject(); + } + + @Override + public ClassDoc asClassDoc() { + return (ClassDoc) wrapOrHide(_getParameterizedType().asClassDoc()); + } + + @Override + public Type[] typeArguments() { + return (Type[])wrapOrHide(_getParameterizedType().typeArguments()); + } + + @Override + public Type superclassType() { + return (Type)wrapOrHide(_getParameterizedType().superclassType()); + } + + @Override + public Type[] interfaceTypes() { + return (Type[])wrapOrHide(_getParameterizedType().interfaceTypes()); + } + + @Override + public Type containingType() { + return (Type)wrapOrHide(_getParameterizedType().containingType()); + } +} diff --git a/docs/doclet/HidingProgramElementDocWrapper.java b/docs/doclet/HidingProgramElementDocWrapper.java new file mode 100644 index 0000000..cb3a896 --- /dev/null +++ b/docs/doclet/HidingProgramElementDocWrapper.java @@ -0,0 +1,87 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.PackageDoc; +import com.sun.javadoc.ProgramElementDoc; + +class HidingProgramElementDocWrapper extends HidingDocWrapper + implements ProgramElementDoc { + public HidingProgramElementDocWrapper(ProgramElementDoc progelemdoc, + Map mapWrappers) { + super(progelemdoc, mapWrappers); + } + + private ProgramElementDoc _getProgramElementDoc() { + return (ProgramElementDoc)getWrappedObject(); + } + + @Override + public ClassDoc containingClass() { + return (ClassDoc)wrapOrHide(_getProgramElementDoc().containingClass()); + } + + @Override + public PackageDoc containingPackage() { + return (PackageDoc) + wrapOrHide(_getProgramElementDoc().containingPackage()); + } + + @Override + public String qualifiedName() { + return _getProgramElementDoc().qualifiedName(); + } + + @Override + public int modifierSpecifier() { + return _getProgramElementDoc().modifierSpecifier(); + } + + @Override + public String modifiers() { + return _getProgramElementDoc().modifiers(); + } + + @Override + public AnnotationDesc[] annotations() { + return (AnnotationDesc[]) + wrapOrHide(_getProgramElementDoc().annotations()); + } + + @Override + public boolean isPublic() { + return _getProgramElementDoc().isPublic(); + } + + @Override + public boolean isProtected() { + return _getProgramElementDoc().isProtected(); + } + + @Override + public boolean isPrivate() { + return _getProgramElementDoc().isPrivate(); + } + + @Override + public boolean isPackagePrivate() { + return _getProgramElementDoc().isPackagePrivate(); + } + + @Override + public boolean isStatic() { + return _getProgramElementDoc().isStatic(); + } + + @Override + public boolean isFinal() { + return _getProgramElementDoc().isFinal(); + } +} diff --git a/docs/doclet/HidingRootDocWrapper.java b/docs/doclet/HidingRootDocWrapper.java new file mode 100644 index 0000000..bce0b90 --- /dev/null +++ b/docs/doclet/HidingRootDocWrapper.java @@ -0,0 +1,87 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.PackageDoc; +import com.sun.javadoc.RootDoc; +import com.sun.javadoc.SourcePosition; + +class HidingRootDocWrapper extends HidingDocWrapper implements RootDoc { + public HidingRootDocWrapper(RootDoc rootdoc, Map mapWrappers) { + super(rootdoc, mapWrappers); + } + + private RootDoc _getRootDoc() { + return (RootDoc)getWrappedObject(); + } + + /* RootDoc */ + + @Override + public String[][] options() { + return _getRootDoc().options(); + } + + @Override + public PackageDoc[] specifiedPackages() { + return (PackageDoc[])wrapOrHide(_getRootDoc().specifiedPackages()); + } + + @Override + public ClassDoc[] specifiedClasses() { + return (ClassDoc[])wrapOrHide(_getRootDoc().specifiedClasses()); + } + + @Override + public ClassDoc[] classes() { + return (ClassDoc[])wrapOrHide(_getRootDoc().classes()); + } + + @Override + public PackageDoc packageNamed(String szName) { + return (PackageDoc)wrapOrHide(_getRootDoc().packageNamed(szName)); + } + + @Override + public ClassDoc classNamed(String szName) { + return (ClassDoc)wrapOrHide(_getRootDoc().classNamed(szName)); + } + + /* DocErrorReporter */ + + @Override + public void printError(String szError) { + _getRootDoc().printError(szError); + } + + @Override + public void printError(SourcePosition pos, String szError) { + _getRootDoc().printError(pos, szError); + } + + @Override + public void printWarning(String szWarning) { + _getRootDoc().printWarning(szWarning); + } + + @Override + public void printWarning(SourcePosition pos, String szWarning) { + _getRootDoc().printWarning(pos, szWarning); + } + + @Override + public void printNotice(String szNotice) { + _getRootDoc().printNotice(szNotice); + } + + @Override + public void printNotice(SourcePosition pos, String szNotice) { + _getRootDoc().printNotice(pos, szNotice); + } +} diff --git a/docs/doclet/HidingSeeTagWrapper.java b/docs/doclet/HidingSeeTagWrapper.java new file mode 100644 index 0000000..a0b1b2b --- /dev/null +++ b/docs/doclet/HidingSeeTagWrapper.java @@ -0,0 +1,53 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.MemberDoc; +import com.sun.javadoc.PackageDoc; +import com.sun.javadoc.SeeTag; + +class HidingSeeTagWrapper extends HidingTagWrapper implements SeeTag { + public HidingSeeTagWrapper(SeeTag seetag, Map mapWrappers) { + super(seetag, mapWrappers); + } + + private SeeTag _getSeeTag() { + return (SeeTag)getWrappedObject(); + } + + @Override + public String label() { + return _getSeeTag().label(); + } + + @Override + public PackageDoc referencedPackage() { + return (PackageDoc)wrapOrHide(_getSeeTag().referencedPackage()); + } + + @Override + public String referencedClassName() { + return _getSeeTag().referencedClassName(); + } + + @Override + public ClassDoc referencedClass() { + return (ClassDoc)wrapOrHide(_getSeeTag().referencedClass()); + } + + @Override + public String referencedMemberName() { + return _getSeeTag().referencedMemberName(); + } + + @Override + public MemberDoc referencedMember() { + return (MemberDoc)wrapOrHide(_getSeeTag().referencedMember()); + } +} diff --git a/docs/doclet/HidingSerialFieldTagWrapper.java b/docs/doclet/HidingSerialFieldTagWrapper.java new file mode 100644 index 0000000..0db3727 --- /dev/null +++ b/docs/doclet/HidingSerialFieldTagWrapper.java @@ -0,0 +1,59 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.SerialFieldTag; + +class HidingSerialFieldTagWrapper extends HidingTagWrapper + implements SerialFieldTag { + public HidingSerialFieldTagWrapper(SerialFieldTag serfldtag, + Map mapWrappers) { + super(serfldtag, mapWrappers); + } + + private SerialFieldTag _getSerialFieldTag() { + return (SerialFieldTag)getWrappedObject(); + } + + /* SerialFieldTag */ + + @Override + public String fieldName() { + return _getSerialFieldTag().fieldName(); + } + + @Override + public String fieldType() { + return _getSerialFieldTag().fieldType(); + } + + @Override + public ClassDoc fieldTypeDoc() { + return (ClassDoc)wrapOrHide(_getSerialFieldTag().fieldTypeDoc()); + } + + @Override + public String description() { + return _getSerialFieldTag().description(); + } + + /* Comparable */ + + @Override + public int compareTo(Object obj) { + if (obj instanceof HidingWrapper) { + return _getSerialFieldTag(). + compareTo(((HidingWrapper)obj).getWrappedObject()); + } else { + return _getSerialFieldTag().compareTo(obj); + } + } + + +} diff --git a/docs/doclet/HidingSourcePositionWrapper.java b/docs/doclet/HidingSourcePositionWrapper.java new file mode 100644 index 0000000..cf3a147 --- /dev/null +++ b/docs/doclet/HidingSourcePositionWrapper.java @@ -0,0 +1,42 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2014 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.io.File; +import java.util.Map; + +import com.sun.javadoc.SourcePosition; + +class HidingSourcePositionWrapper extends HidingWrapper + implements SourcePosition { + public HidingSourcePositionWrapper(SourcePosition type, Map mapWrappers) { + super(type, mapWrappers); + } + + private SourcePosition _getSourcePosition() { + return (SourcePosition)getWrappedObject(); + } + + @Override + public File file() { + return _getSourcePosition().file(); + } + + @Override + public int line() { + return _getSourcePosition().line(); + } + + @Override + public int column() { + return _getSourcePosition().column(); + } + + @Override + public String toString() { + return _getSourcePosition().toString(); + } +} diff --git a/docs/doclet/HidingTagWrapper.java b/docs/doclet/HidingTagWrapper.java new file mode 100644 index 0000000..6fcc466 --- /dev/null +++ b/docs/doclet/HidingTagWrapper.java @@ -0,0 +1,62 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.Doc; +import com.sun.javadoc.SourcePosition; +import com.sun.javadoc.Tag; + +class HidingTagWrapper extends HidingWrapper implements Tag { + public HidingTagWrapper(Tag tag, Map mapWrappers) { + super(tag, mapWrappers); + } + + private Tag _getTag() { + return (Tag)getWrappedObject(); + } + + @Override + public String name() { + return _getTag().name(); + } + + @Override + public Doc holder() { + return (Doc) wrapOrHide(_getTag().holder()); + } + + @Override + public String kind() { + return _getTag().kind(); + } + + @Override + public String text() { + return _getTag().text(); + } + + @Override + public String toString() { + return _getTag().toString(); + } + + @Override + public Tag[] inlineTags() { + return (Tag[])wrapOrHide(_getTag().inlineTags()); + } + + @Override + public Tag[] firstSentenceTags() { + return (Tag[])wrapOrHide(_getTag().firstSentenceTags()); + } + + @Override + public SourcePosition position() { + return (SourcePosition) wrapOrHide(_getTag().position()); + } +} diff --git a/docs/doclet/HidingThrowsTagWrapper.java b/docs/doclet/HidingThrowsTagWrapper.java new file mode 100644 index 0000000..3145c93 --- /dev/null +++ b/docs/doclet/HidingThrowsTagWrapper.java @@ -0,0 +1,42 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ThrowsTag; +import com.sun.javadoc.Type; + +class HidingThrowsTagWrapper extends HidingTagWrapper implements ThrowsTag { + public HidingThrowsTagWrapper(ThrowsTag thrtag, Map mapWrappers) { + super(thrtag, mapWrappers); + } + + private ThrowsTag _getThrowsTag() { + return (ThrowsTag)getWrappedObject(); + } + + @Override + public String exceptionName() { + return _getThrowsTag().exceptionName(); + } + + @Override + public String exceptionComment() { + return _getThrowsTag().exceptionComment(); + } + + @Override + public ClassDoc exception() { + return (ClassDoc)wrapOrHide(_getThrowsTag().exception()); + } + + @Override + public Type exceptionType() { + return (Type)wrapOrHide(_getThrowsTag().exceptionType()); + } +} diff --git a/docs/doclet/HidingTypeVariableWrapper.java b/docs/doclet/HidingTypeVariableWrapper.java new file mode 100644 index 0000000..3879de6 --- /dev/null +++ b/docs/doclet/HidingTypeVariableWrapper.java @@ -0,0 +1,39 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.ProgramElementDoc; +import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; + +class HidingTypeVariableWrapper extends HidingTypeWrapper + implements TypeVariable { + public HidingTypeVariableWrapper(TypeVariable type, Map mapWrappers) { + super(type, mapWrappers); + } + + private TypeVariable _getTypeVariable() { + return (TypeVariable)getWrappedObject(); + } + + @Override + public Type[] bounds() { + return (Type[]) wrapOrHide(_getTypeVariable().bounds()); + } + + @Override + public ProgramElementDoc owner() { + return (ProgramElementDoc) wrapOrHide(_getTypeVariable().owner()); + } + + @Override + public AnnotationDesc[] annotations() { + return (AnnotationDesc[]) wrapOrHide(_getTypeVariable().annotations()); + } +} diff --git a/docs/doclet/HidingTypeWrapper.java b/docs/doclet/HidingTypeWrapper.java new file mode 100644 index 0000000..e3354d0 --- /dev/null +++ b/docs/doclet/HidingTypeWrapper.java @@ -0,0 +1,91 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotatedType; +import com.sun.javadoc.AnnotationTypeDoc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ParameterizedType; +import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; +import com.sun.javadoc.WildcardType; + +class HidingTypeWrapper extends HidingWrapper implements Type { + public HidingTypeWrapper(Type type, Map mapWrappers) { + super(type, mapWrappers); + } + + private Type _getType() { + return (Type)getWrappedObject(); + } + + @Override + public String typeName() { + return _getType().typeName(); + } + + @Override + public String qualifiedTypeName() { + return _getType().qualifiedTypeName(); + } + + @Override + public String simpleTypeName() { + return _getType().simpleTypeName(); + } + + @Override + public String dimension() { + return _getType().dimension(); + } + + @Override + public String toString() { + return _getType().toString(); + } + + @Override + public boolean isPrimitive() { + return _getType().isPrimitive(); + } + + @Override + public ClassDoc asClassDoc() { + return (ClassDoc)wrapOrHide(_getType().asClassDoc()); + } + + @Override + public ParameterizedType asParameterizedType() { + return (ParameterizedType)wrapOrHide(_getType().asParameterizedType()); + } + + @Override + public TypeVariable asTypeVariable() { + return (TypeVariable)wrapOrHide(_getType().asTypeVariable()); + } + + @Override + public WildcardType asWildcardType() { + return (WildcardType)wrapOrHide(_getType().asWildcardType()); + } + + @Override + public AnnotatedType asAnnotatedType() { + return (AnnotatedType)wrapOrHide(_getType().asAnnotatedType()); + } + + @Override + public AnnotationTypeDoc asAnnotationTypeDoc() { + return (AnnotationTypeDoc)wrapOrHide(_getType().asAnnotationTypeDoc()); + } + + @Override + public Type getElementType() { + return (Type)wrapOrHide(_getType().getElementType()); + } +} diff --git a/docs/doclet/HidingWildcardTypeWrapper.java b/docs/doclet/HidingWildcardTypeWrapper.java new file mode 100644 index 0000000..669d068 --- /dev/null +++ b/docs/doclet/HidingWildcardTypeWrapper.java @@ -0,0 +1,32 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.Type; +import com.sun.javadoc.WildcardType; + +class HidingWildcardTypeWrapper extends HidingTypeWrapper + implements WildcardType { + public HidingWildcardTypeWrapper(WildcardType type, Map mapWrappers) { + super(type, mapWrappers); + } + + private WildcardType _getWildcardType() { + return (WildcardType)getWrappedObject(); + } + + @Override + public Type[] extendsBounds() { + return (Type[])wrapOrHide(_getWildcardType().extendsBounds()); + } + + @Override + public Type[] superBounds() { + return (Type[])wrapOrHide(_getWildcardType().superBounds()); + } +} diff --git a/docs/doclet/HidingWrapper.java b/docs/doclet/HidingWrapper.java new file mode 100644 index 0000000..c05ec51 --- /dev/null +++ b/docs/doclet/HidingWrapper.java @@ -0,0 +1,309 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +import java.util.Map; + +import com.sun.javadoc.AnnotatedType; +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.AnnotationTypeDoc; +import com.sun.javadoc.AnnotationTypeElementDoc; +import com.sun.javadoc.AnnotationValue; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ConstructorDoc; +import com.sun.javadoc.Doc; +import com.sun.javadoc.ExecutableMemberDoc; +import com.sun.javadoc.FieldDoc; +import com.sun.javadoc.MemberDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.PackageDoc; +import com.sun.javadoc.ParamTag; +import com.sun.javadoc.Parameter; +import com.sun.javadoc.ParameterizedType; +import com.sun.javadoc.ProgramElementDoc; +import com.sun.javadoc.RootDoc; +import com.sun.javadoc.SeeTag; +import com.sun.javadoc.SerialFieldTag; +import com.sun.javadoc.SourcePosition; +import com.sun.javadoc.Tag; +import com.sun.javadoc.ThrowsTag; +import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; +import com.sun.javadoc.WildcardType; + +class HidingWrapper { + private Object _objWrapped; + private Map _mapWrappers; + + public HidingWrapper(Object objWrapped, Map mapWrappers) { + _objWrapped = objWrapped; + _mapWrappers = mapWrappers; + } + + public Object getWrappedObject() { + return _objWrapped; + } + + public Map getWrapperMap() { + return _mapWrappers; + } + + public String toString() { + return getWrappedObject().toString(); + } + + public HidingWrapper wrapOrHide(Object object) { + if ((object == null) || (object instanceof HidingWrapper)) { + return (HidingWrapper)object; + } else if (getWrapperMap().containsKey(object)) { + return (HidingWrapper)getWrapperMap().get(object); + } else { + HidingWrapper wrapper = _wrapOrHide(object); + getWrapperMap().put(object, wrapper); + return wrapper; + } + } + + public Object[] wrapOrHide(Object[] objects) { + HidingWrapper[] wrappers = new HidingWrapper[objects.length]; + int iFilteredCount = 0; + + for (int i = 0; i < objects.length; i++) { + HidingWrapper wrapper = wrapOrHide(objects[i]); + + if (wrapper != null) { + wrappers[iFilteredCount] = wrapper; + iFilteredCount++; + } + } + + Object[] wrappersTrimmedAndTyped = + _createHidingWrapperArray(objects, iFilteredCount); + System.arraycopy(wrappers, 0, + wrappersTrimmedAndTyped, 0, iFilteredCount); + + return wrappersTrimmedAndTyped; + } + + private boolean _isHidden(Doc doc) { + if (doc == null) { + return false; + } else { + return (doc.tags("hidden").length > 0); + } + } + + /** + * This is the method that actually instantiates objects. Update it if + * the Doclet API changes. One hack here: ClassDoc must be handled before + * Type because ClassDocs are also Type. If we instantiate a + * HidingTypeWrapper to hold a ClassDoc, + * we'll have problems. We should only + * instantiate HidingTypeWrapper for otherwise unknown Types. + */ + private HidingWrapper _wrapOrHide(Object object) { + if (object == null) { + return null; + } else if (object instanceof Doc) { + if (_isHidden((Doc)object)) { + return null; + } else if (object instanceof PackageDoc) { + return new HidingPackageDocWrapper((PackageDoc)object, + getWrapperMap()); + } else if (object instanceof ProgramElementDoc) { + if ((_isHidden(((ProgramElementDoc)object). + containingClass())) || (_isHidden(((ProgramElementDoc) + object).containingPackage()))) { + return null; + } + + if (object instanceof ClassDoc) { + if (object instanceof AnnotationTypeDoc) { + return new HidingAnnotationTypeDocWrapper( + (AnnotationTypeDoc)object, getWrapperMap()); + } else { + return new HidingClassDocWrapper((ClassDoc)object, + getWrapperMap()); + } + } else if (object instanceof MemberDoc) { + if (object instanceof ExecutableMemberDoc) + { + if (object instanceof ConstructorDoc) { + return new HidingConstructorDocWrapper( + (ConstructorDoc)object, + getWrapperMap()); + } else if (object instanceof MethodDoc) { + // Added new classes for 1.5. + if (object instanceof AnnotationTypeElementDoc) { + return + new HidingAnnotationTypeElementDocWrapper( + (AnnotationTypeElementDoc)object, + getWrapperMap()); + } else { + return new HidingMethodDocWrapper( + (MethodDoc)object, getWrapperMap()); + } + } else if (object instanceof + AnnotationTypeElementDoc) { + return new HidingAnnotationTypeElementDocWrapper( + (AnnotationTypeElementDoc)object, + getWrapperMap()); + } else { + return new HidingExecutableMemberDocWrapper( + (ExecutableMemberDoc)object, + getWrapperMap()); + } + } else if (object instanceof FieldDoc) { + return new HidingFieldDocWrapper((FieldDoc)object, + getWrapperMap()); + } else { + return new HidingMemberDocWrapper((MemberDoc)object, + getWrapperMap()); + } + } else { + return new HidingProgramElementDocWrapper( + (ProgramElementDoc)object, getWrapperMap()); + } + } else if (object instanceof RootDoc) { + return new HidingRootDocWrapper((RootDoc)object, + getWrapperMap()); + } else { + return new HidingDocWrapper((Doc)object, getWrapperMap()); + } + } else if (object instanceof Parameter) { + return new HidingParameterWrapper((Parameter)object, + getWrapperMap()); + } else if (object instanceof Tag) { + if (object instanceof ParamTag) { + return new HidingParamTagWrapper((ParamTag)object, + getWrapperMap()); + } else if (object instanceof SeeTag) { + return new HidingSeeTagWrapper((SeeTag)object, getWrapperMap()); + } else if (object instanceof SerialFieldTag) { + return new HidingSerialFieldTagWrapper((SerialFieldTag)object, + getWrapperMap()); + } else if (object instanceof ThrowsTag) { + return new HidingThrowsTagWrapper((ThrowsTag)object, + getWrapperMap()); + } else { + return new HidingTagWrapper((Tag)object, getWrapperMap()); + } + } else if (object instanceof Type) { + if (object instanceof AnnotatedType) { + return new HidingAnnotatedTypeWrapper( + (AnnotatedType) object, getWrapperMap()); + } else if (object instanceof AnnotationTypeDoc) { + return new HidingAnnotationTypeDocWrapper( + (AnnotationTypeDoc)object, getWrapperMap()); + } else if (object instanceof ParameterizedType) { + return new HidingParameterizedTypeWrapper( + (ParameterizedType)object, getWrapperMap()); + } else if (object instanceof TypeVariable) { + return new HidingTypeVariableWrapper((TypeVariable)object, + getWrapperMap()); + } else if (object instanceof WildcardType) { + return new HidingWildcardTypeWrapper((WildcardType)object, + getWrapperMap()); + } else { + return new HidingTypeWrapper((Type)object, getWrapperMap()); + } + } else if (object instanceof AnnotationDesc) { + return new HidingAnnotationDescWrapper((AnnotationDesc)object, + getWrapperMap()); + } else if (object instanceof AnnotationValue) { + return new HidingAnnotationValueWrapper((AnnotationValue)object, + getWrapperMap()); + } else if (object instanceof SourcePosition) { + return new HidingSourcePositionWrapper((SourcePosition)object, + getWrapperMap()); + } else { + return new HidingWrapper(object, getWrapperMap()); + } + } + + /** + * This is the method that instantiates types arrays. + * @see _wrapOrHide(Object) + */ + private static Object[] _createHidingWrapperArray(Object[] objects, + int size) { + if (objects instanceof Doc[]) { + if (objects instanceof PackageDoc[]) { + return new PackageDoc[size]; + } else if (objects instanceof ProgramElementDoc[]) { + if (objects instanceof ClassDoc[]) { + if (objects instanceof AnnotationTypeDoc[]) { + return new AnnotationTypeDoc[size]; + } else { + return new ClassDoc[size]; + } + } else if (objects instanceof MemberDoc[]) { + if (objects instanceof ExecutableMemberDoc[]) { + if (objects instanceof ConstructorDoc[]) { + return new ConstructorDoc[size]; + } else if (objects instanceof MethodDoc[]) { + if (objects instanceof + AnnotationTypeElementDoc[]) { + return new AnnotationTypeElementDoc[size]; + } else { + return new MethodDoc[size]; + } + } else if (objects instanceof + AnnotationTypeElementDoc[]) { + return new AnnotationTypeElementDoc[size]; + } else { + return new ExecutableMemberDoc[size]; + } + } else if (objects instanceof FieldDoc[]) { + return new FieldDoc[size]; + } else { + return new MemberDoc[size]; + } + } else { + return new ProgramElementDoc[size]; + } + } else if (objects instanceof RootDoc[]) { + return new RootDoc[size]; + } else { + return new Doc[size]; + } + } else if (objects instanceof Parameter[]) { + return new Parameter[size]; + } else if (objects instanceof Tag[]) { + if (objects instanceof ParamTag[]) { + return new ParamTag[size]; + } else if (objects instanceof SeeTag[]) { + return new SeeTag[size]; + } else if (objects instanceof SerialFieldTag[]) { + return new SerialFieldTag[size]; + } else if (objects instanceof ThrowsTag[]) { + return new ThrowsTag[size]; + } else { + return new Tag[size]; + } + } else if (objects instanceof Type[]) { + if (objects instanceof AnnotationTypeDoc[]) { + return new AnnotationTypeDoc[size]; + } else if (objects instanceof ParameterizedType[]) { + return new ParameterizedType[size]; + } else if (objects instanceof TypeVariable[]) { + return new TypeVariable[size]; + } else if (objects instanceof WildcardType[]) { + return new WildcardType[size]; + } else { + return new Type[size]; + } + } else if (objects instanceof AnnotationDesc[]) { + return new AnnotationDesc[size]; + } else if (objects instanceof AnnotationValue[]) { + return new AnnotationValue[size]; + } else if (objects instanceof SourcePosition[]) { + return new SourcePosition[size]; + } else { + return new Object[size]; + } + } +} diff --git a/docs/examples.html b/docs/examples.html new file mode 100644 index 0000000..214e67d --- /dev/null +++ b/docs/examples.html @@ -0,0 +1,353 @@ + + + + + Berkeley DB Java Edition Examples + + + +

    +Oracle +

    + +

    Berkeley DB Java Edition
    Examples

    + +

    The JE distribution comes with examples that illustrate:

    +
      +
    • using the JE programming interfaces to perform basic database +operations
    • +
    • scenarios from the Getting Started Guide and Writing Transactional +Applications
    • +
    • using the Direct Persistence Layer to implement common SQL +queries
    • +
    • using JE High Availability
    • +
    +
    +Building and running JE examples
    +Basic Example
    +Getting Started Examples
    +Writing Transactional Applications Examples
    +Translating SQL Queries
    +Examples List
    + +

    Building and Running a Basic Example

    + +

    Compiling and running a simple example can serve as a sanity check of the +installation. Follow the instructions below to compile and run the +PersonExample.

    + +

    You can find the source for this example at:

    + +
    +
    JE_HOME/examples/persist/PersonExample.java
    +
    + +

    Assuming you have installed the JavaSE JDK and have verified that you +have a working Java compiler, you can build PersonExample +as follows.

    + +
      +
    1. Change to the +
      JE_HOME/examples
      directory.
    2. +
      +
    3. Set your CLASSPATH to include both
      JE_HOME/lib/je-M.N.P.jar
      + and the
      JE_HOME/examples
      directory.
    4. +
      +
    5. Compile PersonExample.java with the following command: +
      javac persist/PersonExample.java
      or on Windows: +
      javac persist\PersonExample.java
      +
    6. +
    + +

    To run PersonExample , use the following command, specifying an +environment directory for the data generated by the example:

    + +
    +
    java persist.PersonExample -h <environment directory>
    +
    + +

    For example, using "." for the second parameter will write +the database files into the current directory. You'll notice that a +00000000.jdb file and and je.lck file are +created. This is the first log file in the environment and a lock +file. If you need to delete the environment for running a different +example, simply delete these two files.

    + +

    When you run the program you'll see the following output. While this is not +a very entertaining program, it is enough to test that you have installed JE +correctly.

    + +
    222-22-2222 Jack Smith
    +333-33-3333 Mary Smith
    + +

    The other JE examples are compiled and run similarly. How to run +the examples from the Getting Started Guide and Writing Transactional +Applications is described in the sections below, as well as how to run +the Translating SQL Queries examples. Instructions for running other +examples are contained in the example's source file.

    + +

    Running the Getting Started Examples

    + +

    As described in the Berkeley DB Java Edition Getting Started +Guide, the final examples in every chapter exist in the JE +package. You can build and run these examples as follows:

    + +
      +
    • Change to the +
      JE_HOME/examples
      +directory.
    • +
      +
    • Set your CLASSPATH to include both +
      JE_HOME/lib/je-M.N.P.jar
      +and the +
      JE_HOME/examples
      +directories.
    • +
      +
    • Compile the Getting Started examples with the following commands: +
      javac je/gettingStarted/*.java
      +or on Windows: +
      javac je\gettingStarted\*.java
      +
    • +
    • Make a directory to contain your database environment: +
      mkdir gsgEnv
      +
    • +
    • Load your sample database: +
      java je.gettingStarted.ExampleDatabasePut -h gsgEnv -i je/gettingStarted/inventory.txt  -v je/gettingStarted/vendors.txt
      +
    • +
    • Perform queries against your database. To see everything in the +database, use: +
      java je.gettingStarted.ExampleInventoryRead -h gsgEnv
      +To perform a query based on an inventory item's name, use: +
      java je.gettingStarted.ExampleInventoryRead -h gsgEnv -s Upo
      +
    • +
    + +

    Running the Writing Transactional Applications +Examples

    + +

    The examples in Writing Transactional Applications with +Berkeley DB, Java Edition guide exist in the JE package. You +can build and run these examples as follows:

    +
      +
    • Change to the +
      JE_HOME/examples
      +directory.
    • +
      +
    • Set your CLASSPATH to include both +
      JE_HOME/lib/je-M.N.P.jar
      +and the +
      JE_HOME/examples
      +directories.
    • +
      +
    • Compile the Transactional Applications examples with the following commands: +
      javac je/txn/*.java
      +or on Windows: +
      javac je\txn\*.java
      +
    • +
    • Make a directory to contain your database environment: +
      mkdir txnEx
      +
    • +
    • Run the transactional example. +
      java je.txn.TxnGuide -h txnEx
      +
    • +
    + +

    Running the Translating SQL Query Examples

    + +

    This example shows how some common SQL queries can be implemented +using the Direct Persistence Layer. It's meant to help users who are +more familiar with SQL translate those approaches to the DPL. These +queries include:

    +
    +
    Basic data retrieval:

    +
    SELECT * FROM tab ORDER BY col ASC;

    + +
    A prefix query:

    +
    SELECT * FROM tab WHERE col LIKE 'prefix%';

    + +
    A range query, where the data type of A (as well as B) may be an +int, a float, a String, etc:

    +
    SELECT * FROM tab WHERE col gt;= A AND col <= B;

    + +
    An equi-join on a single primary database:

    +
    SELECT * FROM tab WHERE col1 = A AND col2 =B;

    + +
    An equi-join on two primary databases combined +with a filtering on "t2.col2". Note that if "t2.col2" is a secondary key, the +filtering does a index lookup. Otherwise the filtering is done through +database scanning:

    +
    SELECT t1.* FROM table1 t1, table2 t2 WHERE t1.col1 = t2.col1 +AND t2.col2 = A;
    +
    +

    You can build and run these examples as follows:

    +
      +
    • Change to the +
      JE_HOME/examples
      +directory.
    • +
      +
    • Set your CLASSPATH to include both +
      JE_HOME/lib/je-M.N.P.jar
      +and the +
      JE_HOME/examples
      +directories.
    • +
      +
    • Compile the SQL query examples with the following commands: +
      javac persist/sqlapp/*.java
      +or on Windows: +
      javac persist\sqlapp\*.java
      +
    • +
    • Make a directory to contain your database environment: +
      mkdir sqlEnv
      +
    • +
    • Run the SQL query examples: +
      java persist.sqlapp.SQLApp -h sqlEnv
      +To delete database files after the example exits, do: +
      java persist.sqlapp.SQLApp -h sqlEnv -d
      +
    • +
    +

    List of Examples

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ExampleLocationAPIDescription
    Getting Started Guideexamples/persist/ gettingStartedDPLscenarios using the Direct Persistence Layer from the Getting Started + Guide
    Writing Transactional Applicationsexamples/persist/txnDPLscenarios using the Direct Persistence Layer from Writing Transactional + Applications
    Writing Transactional Applicationsexamples/je/txnBasescenarios using the Base API from Writing Transactional + Applications
    Translating SQL Queriesexamples/persist/sqlAppDPLshows how some common SQL queries can be implemented using the Direct + Persistence Layer
    PersonExampleexamples/persistDPLdemonstrates basic use of the Direct Persistence Layer
    ScalaPersonExampleexamples/persistDPLdemonstrates using JE with the Scala programming language
    EventExample EventExampleDPLexamples/persistDPLcontrasts the Base API and the Direct Persistence Layer with an + example of storing event objects
    CustomKeyOrderExampleexamples/persistDPLshows how to use a Comparable to specify key order
    DplDumpexamples/persistDPLdumps objects stored using the Direct Persistence Layer in XML + format
    HelloDatabaseWorldexamples/collections/helloCollectionstrivial example using the Collections API
    AccessExampleexamples/collections/accessCollectionsreimplementation of the Base API AccessExample using the Collections + API
    Shipmentsexamples/collections/shipCollectionsseries of examples based on a shipment database
    SimpleExampleexamples/jeBasedoes basic data insertion and retrieval
    BindingExampleexamples/jeBaseshows how to use com.sleepycat.bind to convert between Java objects and + JE data records
    SecondaryExampleexamples/jeBaseillustrates the use of secondary indices
    SequenceExampleexamples/jeBasedemonstrates the use of Sequence objects
    ToManyExampleexamples/jeBaseshows how to use multi-key secondary indices to support many-many and + one-many primary/secondary key relationships
    MeasureInsertSizeexamples/jeBaseinserts a given set of key/value pairs in order to measure the disk + space consumed by a given data set
    JCAexamples/jcaBaseshows how to use the J2EE Connector Architecture with JE
    StockQuotesexamples/je/rep/quoteHigh Availability/Replicationshows how to use BDB JE High Availability
    + +
    +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. +All rights reserved.

    + + + diff --git a/docs/examples/allclasses-frame.html b/docs/examples/allclasses-frame.html new file mode 100644 index 0000000..204ca76 --- /dev/null +++ b/docs/examples/allclasses-frame.html @@ -0,0 +1,26 @@ + + + + + +All Classes (Oracle - Berkeley DB Java Edition Examples) + + + + + +

    All Classes

    + + + diff --git a/docs/examples/allclasses-noframe.html b/docs/examples/allclasses-noframe.html new file mode 100644 index 0000000..59b7583 --- /dev/null +++ b/docs/examples/allclasses-noframe.html @@ -0,0 +1,26 @@ + + + + + +All Classes (Oracle - Berkeley DB Java Edition Examples) + + + + + +

    All Classes

    + + + diff --git a/docs/examples/constant-values.html b/docs/examples/constant-values.html new file mode 100644 index 0000000..6390929 --- /dev/null +++ b/docs/examples/constant-values.html @@ -0,0 +1,154 @@ + + + + + +Constant Field Values (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    +

    Constant Field Values

    +

    Contents

    + +
    +
    + + +

    je.rep.*

    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/deprecated-list.html b/docs/examples/deprecated-list.html new file mode 100644 index 0000000..e6add35 --- /dev/null +++ b/docs/examples/deprecated-list.html @@ -0,0 +1,125 @@ + + + + + +Deprecated List (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    +

    Deprecated API

    +

    Contents

    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/help-doc.html b/docs/examples/help-doc.html new file mode 100644 index 0000000..6578c67 --- /dev/null +++ b/docs/examples/help-doc.html @@ -0,0 +1,222 @@ + + + + + +API Help (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    +

    How This API Document Is Organized

    +
    This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
    +
    +
    +
      +
    • +

      Package

      +

      Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

      +
        +
      • Interfaces (italic)
      • +
      • Classes
      • +
      • Enums
      • +
      • Exceptions
      • +
      • Errors
      • +
      • Annotation Types
      • +
      +
    • +
    • +

      Class/Interface

      +

      Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

      +
        +
      • Class inheritance diagram
      • +
      • Direct Subclasses
      • +
      • All Known Subinterfaces
      • +
      • All Known Implementing Classes
      • +
      • Class/interface declaration
      • +
      • Class/interface description
      • +
      +
        +
      • Nested Class Summary
      • +
      • Field Summary
      • +
      • Constructor Summary
      • +
      • Method Summary
      • +
      +
        +
      • Field Detail
      • +
      • Constructor Detail
      • +
      • Method Detail
      • +
      +

      Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

      +
    • +
    • +

      Annotation Type

      +

      Each annotation type has its own separate page with the following sections:

      +
        +
      • Annotation Type declaration
      • +
      • Annotation Type description
      • +
      • Required Element Summary
      • +
      • Optional Element Summary
      • +
      • Element Detail
      • +
      +
    • +
    • +

      Enum

      +

      Each enum has its own separate page with the following sections:

      +
        +
      • Enum declaration
      • +
      • Enum description
      • +
      • Enum Constant Summary
      • +
      • Enum Constant Detail
      • +
      +
    • +
    • +

      Tree (Class Hierarchy)

      +

      There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

      +
        +
      • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
      • +
      • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
      • +
      +
    • +
    • +

      Deprecated API

      +

      The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

      +
    • +
    • +

      Index

      +

      The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

      +
    • +
    • +

      Prev/Next

      +

      These links take you to the next or previous class, interface, package, or related page.

      +
    • +
    • +

      Frames/No Frames

      +

      These links show and hide the HTML frames. All pages are available with or without frames.

      +
    • +
    • +

      All Classes

      +

      The All Classes link shows all classes and interfaces except non-static nested types.

      +
    • +
    • +

      Serialized Form

      +

      Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

      +
    • +
    • +

      Constant Field Values

      +

      The Constant Field Values page lists the static final fields and their values.

      +
    • +
    +This help file applies to API documentation generated using the standard doclet.
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/index-all.html b/docs/examples/index-all.html new file mode 100644 index 0000000..de847d4 --- /dev/null +++ b/docs/examples/index-all.html @@ -0,0 +1,283 @@ + + + + + +Index (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    D H J M O Q R S U W  + + +

    D

    +
    +
    doTransactionWork(Transaction) - Method in class je.rep.quote.RunTransaction
    +
    +
    Must be implemented to perform operations using the given Transaction.
    +
    +
    + + + +

    H

    +
    +
    HARouter - Class in je.rep.quote
    +
    +
    This example illustrates use of an HA aware Router used to forward high + level requests to replication nodes implemented by + RouterDrivenStockQuotes.
    +
    +
    + + + +

    J

    +
    +
    je.rep.quote - package je.rep.quote
    +
    +
    JE Replication Stock Quote example.
    +
    +
    + + + +

    M

    +
    +
    main(String[]) - Static method in class je.rep.quote.HARouter
    +
     
    +
    main(String[]) - Static method in class je.rep.quote.RouterDrivenStockQuotes
    +
     
    +
    main(String[]) - Static method in class je.rep.quote.SimpleRouter
    +
     
    +
    main(String[]) - Static method in class je.rep.quote.StockQuotes
    +
     
    +
    main(String[]) - Static method in class je.rep.quote.StockQuotesRMIForwarding
    +
     
    +
    main(String[]) - Static method in class je.rep.quote.UpdateForwardingStockQuotes
    +
     
    +
    + + + +

    O

    +
    +
    onReplicaWrite(ReplicaWriteException) - Method in class je.rep.quote.RunTransaction
    +
    +
    May be optionally overridden to handle a ReplicaWriteException.
    +
    +
    onRetryFailure(OperationFailureException) - Method in class je.rep.quote.RunTransaction
    +
    +
    May be optionally overridden to handle a failure after the + TRANSACTION_RETRY_MAX has been exceeded.
    +
    +
    + + + +

    Q

    +
    +
    quit(PrintStream) - Method in class je.rep.quote.StockQuotes
    +
    +
    Implements the "quit" command.
    +
    +
    quit(PrintStream) - Method in class je.rep.quote.StockQuotesRMIForwarding
    +
    +
    Performs the RMI associated cleanup so that the RMI serve can be + shutdown cleanly.
    +
    +
    + + + +

    R

    +
    +
    RMI_NAME - Static variable in class je.rep.quote.StockQuotesRMIForwarding
    +
     
    +
    RouterDrivenStockQuotes - Class in je.rep.quote
    +
    +
    This class is based on StockQuotes and illustrates use of an + HA-aware router (implemented by HARouter), in conjunction with the + Monitor class, to direct + application requests, based upon the type of request (read or write) and the + state (Master or Replica) of a node in the replication group.
    +
    +
    run(boolean) - Method in class je.rep.quote.RunTransaction
    +
    +
    Runs a transaction, calls the doTransactionWork method, and retries as + needed.
    +
    +
    RunTransaction - Class in je.rep.quote
    +
    +
    Utility class to begin and commit/abort a transaction and handle exceptions + according to this application's policies.
    +
    +
    + + + +

    S

    +
    +
    SimpleRouter - Class in je.rep.quote
    +
    +
    This example illustrates the use of a simple HA-unaware router that is used + in conjunction with UpdateForwardingStockQuotes.
    +
    +
    StockQuotes - Class in je.rep.quote
    +
    +
    The most basic demonstration of a replicated application.
    +
    +
    StockQuotesRMIForwarding - Class in je.rep.quote
    +
    +
    This example is a small variation on the basic StockQuotes example.
    +
    +
    StockQuotesRMIForwarding.WriteServices - Interface in je.rep.quote
    +
     
    +
    StockQuotesRMIForwarding.WriteServicesImpl - Class in je.rep.quote
    +
    +
    The class supplies the RMI implementation of the write methods.
    +
    +
    + + + +

    U

    +
    +
    update(Quote) - Method in interface je.rep.quote.StockQuotesRMIForwarding.WriteServices
    +
    +
    The "write" operation which will update the price associated with + the Stock.
    +
    +
    update(Quote) - Method in class je.rep.quote.StockQuotesRMIForwarding.WriteServicesImpl
    +
    +
    The update operation invoked by a Replica on this Master.
    +
    +
    UpdateForwardingStockQuotes - Class in je.rep.quote
    +
    +
    This class is based on RouterDrivenStockQuotes and illustrates use + of an HA unaware router (implemented by SimpleRouter), that load + balances requests (both read and write) across all the nodes in a + replication group.
    +
    +
    + + + +

    W

    +
    +
    WriteServicesImpl(PrintStream) - Constructor for class je.rep.quote.StockQuotesRMIForwarding.WriteServicesImpl
    +
     
    +
    +D H J M O Q R S U W 
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/index.html b/docs/examples/index.html new file mode 100644 index 0000000..bc8d3a3 --- /dev/null +++ b/docs/examples/index.html @@ -0,0 +1,72 @@ + + + + + +Oracle - Berkeley DB Java Edition Examples + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="je/rep/quote/package-summary.html">Non-frame version</a>.</p> + + + diff --git a/docs/examples/je/rep/quote/HARouter.html b/docs/examples/je/rep/quote/HARouter.html new file mode 100644 index 0000000..7205e4b --- /dev/null +++ b/docs/examples/je/rep/quote/HARouter.html @@ -0,0 +1,301 @@ + + + + + +HARouter (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class HARouter

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • je.rep.quote.HARouter
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class HARouter
      +extends java.lang.Object
      +
      This example illustrates use of an HA aware Router used to forward high + level requests to replication nodes implemented by + RouterDrivenStockQuotes. The router is built using the APIs provided + by the Monitor; it's a + standalone application and does not itself access a JE Environment. The + router forwards logical requests, that represent some service provided by + the application. It only has knowledge of whether a request will potentially + require an write to the database, but does not have any other application + level logic, nor does it access a JE environment. The HARouter accepts a + request from the console and dispatches it to the application running on the + master, if it's a write request, or to one of the replicas if it's a read + request. The HARouter keeps track of the current Master via the events that + are delivered to the Monitor. +

      + It's the HARouter instead of each individual node (as in the + UpdateForwardingStockQuotes example) that tracks the current Master + via the Monitor. Since the + router ensures that writes are directed to the master node, the logic in + the node itself is simpler: the node simply services the requests forwarded + to it by the router on a port dedicated for this purpose. +

      + The protocol used to communicate between the router and the nodes has been + deliberately kept very simple. In particular, it makes limited provisions + for error reporting back to the router. +

      + The router requires the following arguments: + +

      + java je.rep.quote.HARouter -nodeName <nodeName> \
      +                            -nodeHost <host:port> \
      +                            -helperHost <host:port>"
      +  The arguments are described below:
      +   -nodeName identifies the monitor name associated with this Router
      +   -nodeHost the hostname:port combination used by the Monitor to listen for
      +             election results and group level changes.
      +   -helperHost one or more nodes that may be used by the Monitor to locate the
      +               Master and register the Monitor with the Master.
      + 
      + + Note that the arguments are similar to the ones used to start a replication + node. A key difference is that the -env option is absent, since the router + is standalone and is not associated with one. +

      + The router can be started as follows: + +

      + java je.rep.quote.HARouter -nodeName n1 \
      +                            -nodeHost node.acme.com:6000 \
      +                            -helperHost node.acme.com:5001
      + 
      + + The replication nodes involved in the routing can be started as described in + RouterDrivenStockQuotes. The Router and the nodes can be started in + any convenient order.
      +
      +
      See Also:
      +
      RouterDrivenStockQuotes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidmain(java.lang.String[] argv) 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          main

          +
          public static void main(java.lang.String[] argv)
          +                 throws java.lang.Exception
          +
          +
          Throws:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/RouterDrivenStockQuotes.html b/docs/examples/je/rep/quote/RouterDrivenStockQuotes.html new file mode 100644 index 0000000..fe5da56 --- /dev/null +++ b/docs/examples/je/rep/quote/RouterDrivenStockQuotes.html @@ -0,0 +1,335 @@ + + + + + +RouterDrivenStockQuotes (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class RouterDrivenStockQuotes

    +
    +
    + +
    +
      +
    • +
      +
      Direct Known Subclasses:
      +
      UpdateForwardingStockQuotes
      +
      +
      +
      +
      public class RouterDrivenStockQuotes
      +extends StockQuotes
      +
      This class is based on StockQuotes and illustrates use of an + HA-aware router (implemented by HARouter), in conjunction with the + Monitor class, to direct + application requests, based upon the type of request (read or write) and the + state (Master or Replica) of a node in the replication group. This example + is meant to illustrate how a software load balancer might be integrated with + JE HA, where HARouter plays the role of the load balancer for + purposes of the example. +

      + Be sure to read the Example Overview first to put this + example into context. +

      + In this example, unlike StockQuotes, only the HARouter has a + console associated with it. It accepts commands typed into its console and + forwards them as appropriate to the Master and Replicas in the group. The + logic for tracking the Master resides in HARouter, and + information about the state of the replication group is supplied by the + Monitor. While this example + uses just one HARouter instance for the entire group, production + applications could use multiple router instances to avoid single points of + failure. +

      + Each node, which in this example is an instance of + RouterDrivenStockQuotes, establishes a server socket on which + it can listen for requests from HARouter. The node that is currently the + Master will expect both write and read requests from HARouter, while nodes + that are Replicas will only expect read requests from the router. +

      + The request flow between nodes in this example is shown below. +

      + ------------               Read requests
      + | HARouter |------------------------------------||
      + | Instance |---------------------||             ||
      + ------------                     ||             ||
      +  ||                              ||             ||
      +  || Write requests               ||             ||
      +  \/                              ||             ||
      + ---------------------------      ||             ||
      + | RouterDrivenStockQuotes |      ||             ||
      + | Instance 1: Master      |      ||             ||
      + ---------------------------      \/             ||
      +                ---------------------------      ||
      +                | RouterDrivenStockQuotes |      ||
      +                | Instance 2: Replica     |      ||
      +                ---------------------------      \/
      +                               ---------------------------
      +                               | RouterDrivenStockQuotes |
      +                               | Instance 3: Replica     |
      +                               ---------------------------
      +
      +                                       ...more Replica instances...
      + 
      +

      + This example is intended to be illustrative. It forwards requests as text, + and receives responses in text form. Actual applications may for example, + forward HTTP requests, or use some other application level network protocol + to forward such requests. +

      + Please review the javadoc in StockQuotes for a detailed description + of the arguments that must be supplied at startup. The only difference is + that you must use the name of this class when invoking the JVM. For example, + the first node can be started as follows: + +

      + java je.rep.quote.RouterDrivenStockQuotes -env /tmp/stockQuotes1 \
      +                                           -nodeName n1 \
      +                                           -nodeHost node.acme.com:5001 \
      +                                           -helperHost node.acme.com:5001
      + 
      + + In addition to starting the nodes, you will also need to start the + HARouter as described in its javadoc.
      +
      +
      See Also:
      +
      HARouter
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidmain(java.lang.String[] argv) 
        + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          main

          +
          public static void main(java.lang.String[] argv)
          +                 throws java.lang.Exception
          +
          +
          Throws:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/RunTransaction.html b/docs/examples/je/rep/quote/RunTransaction.html new file mode 100644 index 0000000..c752f0f --- /dev/null +++ b/docs/examples/je/rep/quote/RunTransaction.html @@ -0,0 +1,318 @@ + + + + + +RunTransaction (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class RunTransaction

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • je.rep.quote.RunTransaction
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public abstract class RunTransaction
      +extends java.lang.Object
      +
      Utility class to begin and commit/abort a transaction and handle exceptions + according to this application's policies. The doTransactionWork method is + abstract and must be implemented by callers. The transaction is run and + doTransactionWork is called by the run() method of this class. The + onReplicaWrite and onRetryFailure methods may optionally be overridden.
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods Concrete Methods 
        Modifier and TypeMethod and Description
        abstract voiddoTransactionWork(Transaction txn) +
        Must be implemented to perform operations using the given Transaction.
        +
        voidonReplicaWrite(ReplicaWriteException replicaWrite) +
        May be optionally overridden to handle a ReplicaWriteException.
        +
        voidonRetryFailure(OperationFailureException lastException) +
        May be optionally overridden to handle a failure after the + TRANSACTION_RETRY_MAX has been exceeded.
        +
        voidrun(boolean readOnly) +
        Runs a transaction, calls the doTransactionWork method, and retries as + needed.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          doTransactionWork

          +
          public abstract void doTransactionWork(Transaction txn)
          +
          Must be implemented to perform operations using the given Transaction.
          +
        • +
        + + + +
          +
        • +

          onReplicaWrite

          +
          public void onReplicaWrite(ReplicaWriteException replicaWrite)
          +
          May be optionally overridden to handle a ReplicaWriteException. After + this method is called, the RunTransaction constructor will return. By + default, this method throws the ReplicaWriteException.
          +
        • +
        + + + +
          +
        • +

          onRetryFailure

          +
          public void onRetryFailure(OperationFailureException lastException)
          +
          May be optionally overridden to handle a failure after the + TRANSACTION_RETRY_MAX has been exceeded. After this method is called, + the RunTransaction constructor will return. By default, this method + prints the last exception.
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/SimpleRouter.html b/docs/examples/je/rep/quote/SimpleRouter.html new file mode 100644 index 0000000..8b47b30 --- /dev/null +++ b/docs/examples/je/rep/quote/SimpleRouter.html @@ -0,0 +1,285 @@ + + + + + +SimpleRouter (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class SimpleRouter

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • je.rep.quote.SimpleRouter
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class SimpleRouter
      +extends java.lang.Object
      +
      This example illustrates the use of a simple HA-unaware router that is used + in conjunction with UpdateForwardingStockQuotes. The router is + unaware of the state (Master or Replica) of each + node and simply forwards requests entered at the router's console to each + node in the group in Round Robin fashion. +

      + The UpdateForwardingStockQuotes instance will in turn, if + necessary, forward any write requests to the current master and return the + results back to SimpleRouter. UpdateForwardingStockQuotes + instances do not have their own consoles, they only service requests + delivered over the network by this router. +

      + SimpleRouter takes host:port pairs as arguments, one pair for + each instance of the UpdateForwardingStockQuotes application. + The port numbers in this case are application, not HA, port numbers on which + the UpdateForwardingStockQuotes application listens for + application messages forwarded by SimpleRouter. They must + therefore be different from the ports used internally by HA, that is, from + the HA port numbers specified as arguments to + UpdateForwardingStockQuotes. The application port number is + computed in this example by adding + HARouter.APP_PORT_DISPLACEMENT (default value 100) to the HA + port number associated with the node. So, if node "n1" uses port 5001 for + HA, it must (based upon the conventions used in these examples) use port + 5101, for application level communication. +

      + SimpleRouter can thus be invoked as follows: + +

      + java je.rep.quote.SimpleRouter node.acme.com:5101 node.acme.com:5102 node.acme.com:5103
      + 
      + + for a three node group. In this case, the applications will use ports 5101, + through 5103 for application messages, while HA will use ports 5001 through + 5003. + +

      + SimpleRouter and UpdateForwardingStockQuotes can be started in any order.

      +
      +
      See Also:
      +
      UpdateForwardingStockQuotes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidmain(java.lang.String[] argv) 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          main

          +
          public static void main(java.lang.String[] argv)
          +                 throws java.lang.Exception
          +
          +
          Throws:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/StockQuotes.html b/docs/examples/je/rep/quote/StockQuotes.html new file mode 100644 index 0000000..3e79894 --- /dev/null +++ b/docs/examples/je/rep/quote/StockQuotes.html @@ -0,0 +1,410 @@ + + + + + +StockQuotes (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class StockQuotes

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • je.rep.quote.StockQuotes
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Direct Known Subclasses:
      +
      RouterDrivenStockQuotes, StockQuotesRMIForwarding
      +
      +
      +
      +
      public class StockQuotes
      +extends java.lang.Object
      +
      The most basic demonstration of a replicated application. It's intended to + help gain an understanding of basic HA concepts and demonstrate use of the + HA APIs to create a replicated environment and issue read and write + transactions. +

      + Be sure to read the Example Overview first to put this + example into context. +

      + The program can be used to start up multiple stock quote servers supplying + the following arguments: + +

      + java je.rep.quote.StockQuotes -env <environment home> \
      +                               -nodeName <nodeName> \
      +                               -nodeHost <hostname:port> \
      +                               -helperHost <hostname:port>
      + 
      + + The argument names resemble the ReplicationConfig names to draw + attention to the connection between the program argument names and + ReplicationConfig APIs. + +
      +  -env        a pre-existing directory for the replicated JE environment
      +  -nodeName   the name used to uniquely identify this node in the replication
      +  -nodeHost   the unique hostname, port pair for this node
      +  -helperHost the hostname, port pair combination for the helper node. It's
      +              the same as the nodeHost only if this node is intended to
      +              become the initial Master, during the formation of the
      +              replication group.
      + 
      + + A typical demo session begins with a set of commands such as the following + to start each node. The first node can be started as below: + +
      + java je.rep.quote.StockQuotes -env dir1 -nodeName n1 \
      +                               -nodeHost node.acme.com:5001 \
      +                               -helperHost node.acme.com:5001
      + 
      + + Note that the helperHost and the nodeHost are the + same, since it's the first node in the group. HA uses this fact to start a + brand new replication group of size one, with this node as the master if + there is no existing environment in the environment directory + dir1. +

      + Nodes can be added to the group by using a variation of the above. The + second and third node can be started as follows: + +

      + java je.rep.quote.StockQuotes -env dir2 -nodeName n2 \
      +                               -nodeHost node.acme.com:5002 \
      +                               -helperHost node.acme.com:5001
      +
      + java je.rep.quote.StockQuotes -env dir3 -nodeName n3 \
      +                               -nodeHost node.acme.com:5003 \
      +                               -helperHost node.acme.com:5002
      + 
      + + Note that each node has its own unique node name, and a distinct directory + for its replicated environment. This and any subsequent nodes can use the + first node as a helper to get itself going. In fact, you can pick any node + already in the group to serve as a helper. So, for example when adding the + third node, node 2 or node 1, could serve as helper nodes. The helper nodes + simply provide a mechanism to help a new node get itself admitted into the + group. The helper node is not needed once a node becomes part of the group. +

      + When initially running the example, please use a group of at least three + nodes. A two node group is a special case, and it is best to learn how to + run larger groups first. For more information, see + + Two-Node Replication Groups. When initially creating the nodes, it is + also important to start the master first. +

      + But once the nodes have been created, the order in which the nodes are + started up does not matter. It minimizes the initial overall group startup + time to have the master (the one where the helperHost and the + nodeHost are the same) node started first, since the master + initializes the replicated environment and is ready to start accepting and + processing commands even as the other nodes concurrently join the group. +

      + The above commands start up a group with three nodes all running locally on + the same machine. You can start up nodes on different machines connected by + a TCP/IP network by executing the above commands on the respective machines. + It's important in this case that the clocks on these machines, be reasonably + synchronized, that is, they should be within a couple of seconds of each + other. You can do this manually, but it's best to use a protocol like NTP for this purpose. +

      + Upon subsequent restarts the nodes will automatically hold an election and + select one of the nodes in the group to be the master. The choice of master + is made visible by the master/replica prompt that the application uses to + make the distinction clear. Note that at least a simple majority of nodes + must be started before the application will respond with a prompt because + it's only after a simple majority of nodes is available that an election can + be held and a master elected. For a two node group, both nodes must be + started before an election can be held. +

      + Commands are submitted directly at the command prompt in the console + established by the application at each node. Update commands are only + accepted at the console associated with the current master, identified by + the master prompt as below: + +

      StockQuotes-2 (master)>
      + + After issuing a few commands, you may want to experiment with shutting down + or killing some number of the replicated environments and bringing them back + up to see how the application behaves. +

      + If you type stock updates at an application that is currently running as a + replica node, the update is refused and you must manually re-enter the + updates on the console associated with the master. This is of course quite + cumbersome and serves as motivation for the subsequent examples. +

      + As shown below, there is no routing of requests between nodes in this + example, which is why write requests fail when they are issued on a Replica + node. +

      + -----------------------
      + | StockQuotes         | Read and Write requests both succeed,
      + | Instance 1: Master  | because this is the Master.
      + -----------------------
      +
      +      -----------------------
      +      | StockQuotes         | Read requests succeed,
      +      | Instance 2: Replica | but Write requests fail on a Replica.
      +      -----------------------
      +
      +           -----------------------
      +           | StockQuotes         | Read requests succeed,
      +           | Instance 3: Replica | but Write requests fail on a Replica.
      +           -----------------------
      +
      +               ...more Replica instances...
      + 
      +

      + See UpdateForwardingStockQuotes for an example that uses + SimpleRouter, along with application supplied inter-node request + routing to direct write requests to the master. +

      + See RouterDrivenStockQuotes along with HARouterfor an + example that uses an external router built using the + Monitor to route write + requests externally to the master and provide primitive load balancing + across the nodes in the replication group.

      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidmain(java.lang.String[] argv) 
        voidquit(java.io.PrintStream out) +
        Implements the "quit" command.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          quit

          +
          public void quit(java.io.PrintStream out)
          +
          Implements the "quit" command. Subclasses can override to take + additional cleanup measures.
          +
        • +
        + + + +
          +
        • +

          main

          +
          public static void main(java.lang.String[] argv)
          +                 throws java.lang.Exception
          +
          +
          Throws:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServices.html b/docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServices.html new file mode 100644 index 0000000..fbc33d3 --- /dev/null +++ b/docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServices.html @@ -0,0 +1,245 @@ + + + + + +StockQuotesRMIForwarding.WriteServices (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Interface StockQuotesRMIForwarding.WriteServices

    +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods 
        Modifier and TypeMethod and Description
        voidupdate(je.rep.quote.Quote quote) +
        The "write" operation which will update the price associated with + the Stock.
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          update

          +
          void update(je.rep.quote.Quote quote)
          +     throws java.rmi.RemoteException
          +
          The "write" operation which will update the price associated with + the Stock.
          +
          +
          Throws:
          +
          java.rmi.RemoteException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServicesImpl.html b/docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServicesImpl.html new file mode 100644 index 0000000..9ebcdc2 --- /dev/null +++ b/docs/examples/je/rep/quote/StockQuotesRMIForwarding.WriteServicesImpl.html @@ -0,0 +1,301 @@ + + + + + +StockQuotesRMIForwarding.WriteServicesImpl (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class StockQuotesRMIForwarding.WriteServicesImpl

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • je.rep.quote.StockQuotesRMIForwarding.WriteServicesImpl
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        WriteServicesImpl(java.io.PrintStream printStream) 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidupdate(je.rep.quote.Quote quote) +
        The update operation invoked by a Replica on this Master.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          WriteServicesImpl

          +
          public WriteServicesImpl(java.io.PrintStream printStream)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          update

          +
          public void update(je.rep.quote.Quote quote)
          +            throws java.rmi.RemoteException
          +
          The update operation invoked by a Replica on this Master. + +

          Note that this method is executed in an RMI thread and does not + handle the environment failure level exceptions: + InsufficientLogException and + RollbackException exception in order to keep the + example simple. Production code would handle the exception here and + coordinate with the main thread of control and other RMI threads to + take corrective actions and re-estabblish the environment and + database handles.

          +
          +
          Specified by:
          +
          update in interface StockQuotesRMIForwarding.WriteServices
          +
          Throws:
          +
          java.rmi.RemoteException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/StockQuotesRMIForwarding.html b/docs/examples/je/rep/quote/StockQuotesRMIForwarding.html new file mode 100644 index 0000000..8b01136 --- /dev/null +++ b/docs/examples/je/rep/quote/StockQuotesRMIForwarding.html @@ -0,0 +1,375 @@ + + + + + +StockQuotesRMIForwarding (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class StockQuotesRMIForwarding

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class StockQuotesRMIForwarding
      +extends StockQuotes
      +
      This example is a small variation on the basic StockQuotes example. + Instead of rejecting update requests made at a Replica's console, it + illustrates how RMI could be used to forward write requests to a Master. The + example is otherwise identical to StockQuotes and you should + read the javadoc associated with it before proceeding with this example. The + discussion that follows thus focusses entirely on the RMI based + write-forwarding aspects of this example. +

      + Each node in this example is an RMI server and hosts an RMI registry. The + registry contains exactly one binding associated with the name: + RMI_NAME. The object associated + with the RMI binding (an instance of StockQuotesRMIForwarding.WriteServicesImpl) makes + available all the high level database write operations that are part of the + application. When this node is the Master, + Replicas will use the remote methods to invoke write operations + on it. All nodes are RMI servers, but only the current Master + is actually used to serve write requests while it is in the + Master state. The Replicas play the role of RMI clients making + remote method calls to the Master to foward their write requests. + +

      + Please review the javadoc in StockQuotes for a detailed description + of the arguments that must be supplied at startup. The only difference is + that you must use the name of this class when invoking the Java VM. +

      + For example, the first node can be started as follows: + +

      + java je.rep.quote.StockQuotesWriteForwarding -env /tmp/stockQuotes1 \
      +                                               -nodeName n1 \
      +                                               -nodeHost node.acme.com:5001 \
      +                                               -helperHost node.acme.com:5001
      + 
      +

      + This instance of the application will therefore use port 5001 for HA, and, + by convention, port 5101 (5001 + RMI_PORT_DISPLACEMENT) for + the RMI registry. If you are running on multiple machines you may (depending + upon your DNS setup) need to specify the + java.rmi.server.hostname property to ensure that RMI does not + associate loopback addresses with entries in its registry.

      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        static java.lang.StringRMI_NAME 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidmain(java.lang.String[] argv) 
        voidquit(java.io.PrintStream out) +
        Performs the RMI associated cleanup so that the RMI serve can be + shutdown cleanly.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          quit

          +
          public void quit(java.io.PrintStream out)
          +
          Performs the RMI associated cleanup so that the RMI serve can be + shutdown cleanly.
          +
          +
          Overrides:
          +
          quit in class StockQuotes
          +
          +
        • +
        + + + +
          +
        • +

          main

          +
          public static void main(java.lang.String[] argv)
          +                 throws java.lang.Exception
          +
          +
          Throws:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/UpdateForwardingStockQuotes.html b/docs/examples/je/rep/quote/UpdateForwardingStockQuotes.html new file mode 100644 index 0000000..7840203 --- /dev/null +++ b/docs/examples/je/rep/quote/UpdateForwardingStockQuotes.html @@ -0,0 +1,341 @@ + + + + + +UpdateForwardingStockQuotes (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + + +
    +
    je.rep.quote
    +

    Class UpdateForwardingStockQuotes

    +
    +
    + +
    +
      +
    • +
      +
      +
      public class UpdateForwardingStockQuotes
      +extends RouterDrivenStockQuotes
      +
      This class is based on RouterDrivenStockQuotes and illustrates use + of an HA unaware router (implemented by SimpleRouter), that load + balances requests (both read and write) across all the nodes in a + replication group. This example is meant to illustrate how a load balancer + appliance might fit into the JE HA architecture, where SimpleRouter + plays the role of the load balancer appliance for purposes of the example. +

      + Be sure to read the Example Overview first to put this + example into context. +

      + The router is unaware of the state (Master or Replica) of each node, or the + type (read or write) of the request. Nodes use the StateChangeListener to track the + node that is currently the master and redirect write requests to it. That + is, unlike the RouterDrivenStockQuotes example, it's the nodes and + not the router that keeps track of the current master. +

      + In this example, unlike StockQuotes, only the + SimpleRouter has a console associated with it. It accepts commands + typed into its console and forwards them as appropriate to the nodes in the + group. The logic for tracking the Master resides in each node, and is + supplied by the StateChangeListener. +

      + Each node, which in this example is an instance of + UpdateForwardingStockQuotes, establishes a server socket on + which it can listen for requests from SimpleRouter. Read + requests are processed directly by the node. Write requests are redirected + to the current master and the result is communicated back to + SimpleRouter. +

      + The request flow between nodes in this example is shown below. +

      + ----------------       Read and Write requests
      + | SimpleRouter |------------------------------------||
      + | Instance     |---------------------||             ||
      + ----------------      ||             ||             ||
      +                       ||             ||             ||
      +                       \/             ||             ||
      + -------------------------------      ||             ||
      + | UpdateForwardingStockQuotes |      ||             ||
      + | Instance 1: Master          |      ||             ||
      + -------------------------------      \/             ||
      +   /\           -------------------------------      ||
      +   ||           | UpdateForwardingStockQuotes |      ||
      +   ||---------- | Instance 2: Replica         |      ||
      +   || Write     -------------------------------      \/
      +   || requests                 -------------------------------
      +   ||                          | UpdateForwardingStockQuotes |
      +   ||--------------------------| Instance 3: Replica         |
      +                               -------------------------------
      +
      +                                       ...more Replica instances...
      + 
      +

      + This example is intended to be illustrative. It forwards requests as text, + and receives responses in text form. Actual applications may for example, + forward HTTP requests, or use some other application level network protocol + to forward such requests. +

      + Please review the javadoc in StockQuotes for a detailed description + of the arguments that must be supplied at startup. The only difference is + that you must use the name of this class when invoking the java vm. +

      + For example, the first node can be started as follows: + +

      + java je.rep.quote.UpdateForwardingStockQuotes -env /tmp/stockQuotes1 \
      +                                               -nodeName n1 \
      +                                               -nodeHost node.acme.com:5001 \
      +                                               -helperHost node.acme.com:5001
      + 
      +

      + This instance of the application will therefore use port 5001 for HA, and, + by convention, port 5101 (5001 + HARouter.APP_PORT_DISPLACEMENT) + for application messages sent to it. +

      + In addition to starting the nodes, you will also need to start the + SimpleRouter as described in its javadoc.

      +
      +
      See Also:
      +
      SimpleRouter
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidmain(java.lang.String[] argv) 
        + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          main

          +
          public static void main(java.lang.String[] argv)
          +                 throws java.lang.Exception
          +
          +
          Throws:
          +
          java.lang.Exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/package-frame.html b/docs/examples/je/rep/quote/package-frame.html new file mode 100644 index 0000000..9ffca9c --- /dev/null +++ b/docs/examples/je/rep/quote/package-frame.html @@ -0,0 +1,30 @@ + + + + + +je.rep.quote (Oracle - Berkeley DB Java Edition Examples) + + + + + +

    je.rep.quote

    + + + diff --git a/docs/examples/je/rep/quote/package-summary.html b/docs/examples/je/rep/quote/package-summary.html new file mode 100644 index 0000000..c7e0b96 --- /dev/null +++ b/docs/examples/je/rep/quote/package-summary.html @@ -0,0 +1,269 @@ + + + + + +je.rep.quote (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    +

    Package je.rep.quote

    +
    +
    JE Replication Stock Quote example.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      StockQuotesRMIForwarding.WriteServices 
      +
    • +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      HARouter +
      This example illustrates use of an HA aware Router used to forward high + level requests to replication nodes implemented by + RouterDrivenStockQuotes.
      +
      RouterDrivenStockQuotes +
      This class is based on StockQuotes and illustrates use of an + HA-aware router (implemented by HARouter), in conjunction with the + Monitor class, to direct + application requests, based upon the type of request (read or write) and the + state (Master or Replica) of a node in the replication group.
      +
      RunTransaction +
      Utility class to begin and commit/abort a transaction and handle exceptions + according to this application's policies.
      +
      SimpleRouter +
      This example illustrates the use of a simple HA-unaware router that is used + in conjunction with UpdateForwardingStockQuotes.
      +
      StockQuotes +
      The most basic demonstration of a replicated application.
      +
      StockQuotesRMIForwarding +
      This example is a small variation on the basic StockQuotes example.
      +
      UpdateForwardingStockQuotes +
      This class is based on RouterDrivenStockQuotes and illustrates use + of an HA unaware router (implemented by SimpleRouter), that load + balances requests (both read and write) across all the nodes in a + replication group.
      +
      +
    • +
    + + + +

    Package je.rep.quote Description

    +
    JE Replication Stock Quote example. + +

    Example Overview

    +This example is a simple but complete demonstration of a replicated +application. The application is a mock stock ticker which stores stock values +in a replicated JE environment. The following commands are accepted: +
      +
    • <stock> <number> : enter this stock price into the +database
    • +
    • print : print all the stocks and current prices held in the database
    • +
    • quit : shut down
    • +
    +

    +There are three versions of the example which illustrate different application +designs and aspects of JE functionality. Please be sure to walk through the +three examples in the order listed below, since the information in one example +builds on the one before it. The javadoc description for each class describes +the example and explains how to run it. More detailed information is found in +the example source code. +

      +
    1. StockQuotes: This example is the most +basic demonstration of a replicated application. It's intended to help gain an +understanding of basic HA concepts and demonstrate use of the HA APIs to create +a replicated environment and issue read and write transactions. +

    2. +
    3. RouterDrivenStockQuotes and +HARouter: This example is based on StockQuotes and illustrates use of an HA-aware router (implemented by HARouter), in conjunction with the Monitor class, to direct application requests, based upon the type of request +(read or write) and the state (Master or Replica) of a node in the replication +group. This example is meant to illustrate how a software load balancer might +be integrated with JE HA, where HARouter plays the role of the load +balancer for purposes of the example. +

    4. +
    5. UpdateForwardingStockQuotes and SimpleRouter: This example is based on RouterDrivenStockQuotes and +illustrates use of an HA unaware router (implemented by SimpleRouter), +that load balances requests (both read and write) across all the nodes in a +replication group. This example is meant to illustrate how a load balancer +appliance might fit into the JE HA architecture, where SimpleRouter +plays the role of the load balancer appliance for purposes of the example. +
    6. +
    +Disclaimer: This example is intended to be illustrative. The example +is single threaded, while actual applications may be multithreaded. The +example forwards requests as text and receives responses in text form, while +actual applications may for example, forward HTTP requests, or use some other +application level network protocol to forward such requests. The example opens +and closes a socket to send each request, while actual applications will +typically use a connection management facility. +

    +The example +StockQuotesRMIForwarding, +a minor variation to the basic StockQuotes +example is also included in this package. It's intended to help illustrate how +RMI could be used to forward write requests from a Replica to the Master. +

    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/je/rep/quote/package-tree.html b/docs/examples/je/rep/quote/package-tree.html new file mode 100644 index 0000000..fee4bee --- /dev/null +++ b/docs/examples/je/rep/quote/package-tree.html @@ -0,0 +1,155 @@ + + + + + +je.rep.quote Class Hierarchy (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    +

    Hierarchy For Package je.rep.quote

    +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/overview-tree.html b/docs/examples/overview-tree.html new file mode 100644 index 0000000..a54451a --- /dev/null +++ b/docs/examples/overview-tree.html @@ -0,0 +1,159 @@ + + + + + +Class Hierarchy (Oracle - Berkeley DB Java Edition Examples) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +
    +

    Hierarchy For All Packages

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition Examples
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/examples/package-list b/docs/examples/package-list new file mode 100644 index 0000000..c9e2485 --- /dev/null +++ b/docs/examples/package-list @@ -0,0 +1 @@ +je.rep.quote diff --git a/docs/examples/script.js b/docs/examples/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/docs/examples/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/docs/examples/standard-stylesheet.css b/docs/examples/standard-stylesheet.css new file mode 100644 index 0000000..98055b2 --- /dev/null +++ b/docs/examples/standard-stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/docs/examples/style.css b/docs/examples/style.css new file mode 100644 index 0000000..9dc28c5 --- /dev/null +++ b/docs/examples/style.css @@ -0,0 +1,15 @@ +/* Javadoc style sheet for Java 7 and later versions */ + +/* Import standard style sheet for defaults */ +@import url('standard-stylesheet.css'); + +/* + * Modify the style for code samples to use a pale blue background with + * a thin, medium blue border that matches the style of various + * headings. + */ +pre.code { + border: 1px solid #9eadc0; /* Medium blue */ + padding: 2px; + background-color: #dee3e9; /* Pale blue */ +} diff --git a/docs/images/Oracle_BerkeleyDB_small.png b/docs/images/Oracle_BerkeleyDB_small.png new file mode 100644 index 0000000000000000000000000000000000000000..dd30e5fa3899f47db2fe0aaee55fc6f995e6168b GIT binary patch literal 1196 zcmeAS@N?(olHy`uVBq!ia0vp^wLomk!3-p~vrVf8QU?NjLR_CdeY$DWrvLW#|LZ|u z|Ni~+AoQm;ZnM{Qvm)|MTbHzkgp}U!R|!fByXW|M&0zzkdCHfB*mY z@5jf-_xJa|fB#+{s5n3WJWzdqzrVkKet!P?_3K~1e*NRekE2JA0xkRxME`*VHGzmb z<6NM5j7i?^E({&4vK~MVPjYTRfR}S_fq}W95s=U9!BD)1fr06nr;B4qg!|jD=-G=5 zc;>R6auvK1_`&Gan`!_4@86;RlJ(SqHE))mq5kb!89k4hFUuabBq)X%f8OV7&8heM#p-iOvswyDxlyX7OOhJC81}zMO|j z|E?upcYj|pH%}ye-lvYTPt$e3FMXZm#oxO`yT$IN@56iR5AH2}9(bl{j@uly$49a* z-2L#c_U^=&b4%6rl5OWtc=fAF@mS|>iAzuB+upxi?NXU$YViKfB~D)Jm+MyVy}GtR z#V?!l^aw(sNBKmY%EarTFs+@I}Nr)%4Y z-4Fiv`TFIz=YQmW{{8mlx1V=ozdsT>WBWhpVEg~udu%!%?#fr15zsY1Q1Oei=tZ}c zR=YI6nMdepB)%2h!n``Y=AiXj?W5{1Q*X3gO!icpQt9?)9lz5ttwX^Z<&z~PwO&vC zwCdazu7G<1avNsr%<9s+BHHfrgTteJtB8Yp%!J949$S`tW0|0R(na%Zv8MI{?yZf+ z6RUOgHo5(X;%JoEsCDg=PRh<_A1=6dEOJff&r|JJ6J)seL`pro&{a(M;==166Q-2^ znz-Oc)|RqM5v7@t*Jte5>=ad*)#@m{y1I6^LhA9q5=R%XzH?VIIujeZ>54*6U0Q~i z&op4lp8!hnUw)ODHt{^@U&yVMy#3t~m+ODcg33+yztwkJ|D^SG-tH8ps#4oW1v;lK z`p$=xmp)myc%Hrh|NQl7k<}`t?6tL;nHfrvuBsV6A#zuD-PpzLwp{DN=9WEqk6yS| zo3P53NLgHXw(Gd?YrAQ$7w + + + + + Berkeley DB Java Edition (Version: 7.5.11, 2017-10-31 09:36:36 UTC + + + + + + +
    +

    Oracle Berkeley DB Java Edition, 12c Release 2

    + +Library 12.2.7.5, Version 7.5.11, 2017-10-31 09:36:36 UTC
    + +
    +Getting Started Guides
    + +

    If you are new to Berkeley DB Java Edition, the following guides +will help you learn about important concepts and get started. +

    + +

    + + + + + + + + + + + + + + + + + + + +
    Getting Started Guide + HTML | + PDF
    Writing Transactional Applications + HTML | + PDF
    Java Collections Tutorial + HTML | + PDF
    Getting Started with BDB JE High Availability + HTML | + PDF
    +

    + +Programmatic APIs + + +

    +Javadoc: +the javadoc covers the full set of all public JE APIs. Starting points for the different +APIs are listed below. +

    +Base API
    +Direct +Persistence Layer (DPL)
    +High Availability/Replication
    +Collections
    +

    +

    +Examples +

    +General Examples
    +Translating SQL into BDB Example
    +BDB JE HA Examples
    +

    + +Build and Installation Notes
    +

    + Installation Notes
    + Release Notes
    + Change Log
    + Using JE trace logging
    + Monitoring JE with JMX and + JConsole
    +

    + +Additional Information
    + + + + + +

    + + +
    + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved. +

    + + + diff --git a/docs/installation.html b/docs/installation.html new file mode 100644 index 0000000..814ac46 --- /dev/null +++ b/docs/installation.html @@ -0,0 +1,151 @@ + + + + + Berkeley DB Java Edition Installation Notes + + + +

    +Oracle +

    + +

    Berkeley DB Java Edition
    Installation Notes

    + + +

    7.5.11, 2017-10-31 09:36:36 UTC

    +

    These installation notes describe:

    + + +

    Installing JE

    + +

    The release notes document the Java versions +that JE is compatible with and that have been used for certification.

    + +

    To install JE, use unzip or tar to unpack the JE distribution. If you are +using unzip, be sure to use the -U option to preserve case in file names. For +example:

    + +
    +
    unzip -U je-M.N.P.zip
    +
    +

    or

    +
    +
    gunzip je-M.N.P.tar.gz
    tar xvf je-M.N.P.tar
    +
    + +

    Unpacking the distribution creates a je-M.N.P directory on disk, +where M.N.P is the release's version number. This directory contains +the following contents:

    + +
    +
    docs/
    examples/
    lib/
    src/
    test/
    +
    + +

    The remainder of this document refers to the je-M.N.P/ +directory created in this step as JE_HOME.

    + +

    Using JE

    + +

    To compile and run a program using JE, you only need the +je-M.N.P.jar file in your class path. This file can be found +at:

    + +
    +
    JE_HOME/lib/je-M.N.P.jar
    +
    + +

    When using JE within a web container, note that it is important that the JE +jar file and your application jar files -- in particular the classes that are +being serialized by SerialBinding -- are loaded under the same class loader. +For running in a servlet, this typically means that you would place the JE jar +file and your application jars in the same directory.

    + +

    Additionally, it is important to not place the JE jar file in the extensions +directory for your JVM. Instead place the JE jar file in the same location as +your application jars. The extensions directory is reserved for privileged +library code.

    + +

    Compiling and running a simple example can serve as a sanity check of the +installation. Follow these instructions to compile +and run the first basic example, called PersonExample.

    + +

    Uninstalling JE

    + +

    To uninstall, just remove the directory that you unzipped into.

    + +

    Building JE

    + +

    +You need Apache Ant version 1.8.0 or later in order to do builds. You +can download Ant from: +

    +http://ant.apache.org/ +
    +

    +You also need Apache Ivy for loading dependencies. You can download Ivy +from: +

    +http://ant.apache.org/ivy/ +
    +

    +Make sure to add the ivy JAR file to your ~/.ant/lib directory +or specify the ivy directory using the ant -lib option. +

    +JE must be built with the version of Java specified as the compatibility +requirement in the release notes. +

    +Once ant and JUnit are installed, you can build JE using the following +command:

    +
    +
    +cd JE_HOME
    +ant clean jar
    +
    +
    +

    +The JE jar file will appear in JE_HOME/build/lib/je.jar. + +

    Building and Running the Unit Tests

    + +

    +You can run the unit tests using the command: "ant test". +

    +The ant 'test' target will automatically download a junit jar into the extlib +directory, and this jar is needed for compiling the tests. If this command +hangs when attempting to download the jar, due to a VPN for example, you may +need to additionally specify an HTTP proxy host and/or port. This can be +specified using the proxy.host and proxy.port properties, for example: +"ant test -Dproxy.host=my.proxy". By default, proxy.port is 80. +

    +On Windows you may see OutOfMemoryErrors while running the unit tests. To avoid +this, increase the JVM maximum memory size by setting the ANT_OPTS environment +variable so that it includes -Xmx256M. + +

    Using JE with J2EE/JCA

    + +

    JE can be used as a J2EE/JCA Resource Adapter. It has been tested +with Oracle Application Server (OC4J) 10.1.3.2.0, JBoss 3.2.6 and Sun +Java System Application Server 8.1. For cookbook style "HOWTO's" +using the JE J2EE/JCA Resource Adapter see +JE_HOME/examples/jca/HOWTO-oc4j.txt, +JE_HOME/examples/jca/HOWTO-jboss.txt and +JE_HOME/examples/jca/HOWTO-sjsas.txt.

    + +

    Using JE with JMX

    + +

    JE supplies a ready to install JMX (Java Management Extensions) MBean +as well as a JConsole plugin for viewing the mbean. See the JConsole README + +Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved. + + + diff --git a/docs/java/allclasses-frame.html b/docs/java/allclasses-frame.html new file mode 100644 index 0000000..b45d446 --- /dev/null +++ b/docs/java/allclasses-frame.html @@ -0,0 +1,323 @@ + + + + + +All Classes (Oracle - Berkeley DB Java Edition API) + + + + + +

    All Classes

    +
    + +
    + + diff --git a/docs/java/allclasses-noframe.html b/docs/java/allclasses-noframe.html new file mode 100644 index 0000000..76ddf3c --- /dev/null +++ b/docs/java/allclasses-noframe.html @@ -0,0 +1,323 @@ + + + + + +All Classes (Oracle - Berkeley DB Java Edition API) + + + + + +

    All Classes

    +
    + +
    + + diff --git a/docs/java/com/sleepycat/bind/ByteArrayBinding.html b/docs/java/com/sleepycat/bind/ByteArrayBinding.html new file mode 100644 index 0000000..3491814 --- /dev/null +++ b/docs/java/com/sleepycat/bind/ByteArrayBinding.html @@ -0,0 +1,328 @@ + + + + + +ByteArrayBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind
    +

    Class ByteArrayBinding

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.ByteArrayBinding
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<byte[]>
      +
      +
      +
      +
      public class ByteArrayBinding
      +extends java.lang.Object
      +implements EntryBinding<byte[]>
      +
      A pass-through EntryBinding that uses the entry's byte array as + the key or data object.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        ByteArrayBinding() +
        Creates a byte array binding.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        byte[]entryToObject(DatabaseEntry entry) +
        Converts a entry buffer into an Object.
        +
        voidobjectToEntry(byte[] object, + DatabaseEntry entry) +
        Converts an Object into a entry buffer.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ByteArrayBinding

          +
          public ByteArrayBinding()
          +
          Creates a byte array binding.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public byte[] entryToObject(DatabaseEntry entry)
          +
          Description copied from interface: EntryBinding
          +
          Converts a entry buffer into an Object.
          +
          +
          Specified by:
          +
          entryToObject in interface EntryBinding<byte[]>
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(byte[] object,
          +                          DatabaseEntry entry)
          +
          Description copied from interface: EntryBinding
          +
          Converts an Object into a entry buffer.
          +
          +
          Specified by:
          +
          objectToEntry in interface EntryBinding<byte[]>
          +
          Parameters:
          +
          object - is the source Object.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/EntityBinding.html b/docs/java/com/sleepycat/bind/EntityBinding.html new file mode 100644 index 0000000..03183de --- /dev/null +++ b/docs/java/com/sleepycat/bind/EntityBinding.html @@ -0,0 +1,303 @@ + + + + + +EntityBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind
    +

    Interface EntityBinding<E>

    +
    +
    +
    +
      +
    • +
      +
      All Known Implementing Classes:
      +
      SerialSerialBinding, TupleSerialBinding, TupleSerialMarshalledBinding, TupleTupleBinding, TupleTupleMarshalledBinding
      +
      +
      +
      +
      public interface EntityBinding<E>
      +
      A binding between a key-value entry pair and an entity object. + +

      WARNING: Binding instances are typically shared by multiple + threads and binding methods are called without any special synchronization. + Therefore, bindings must be thread safe. In general no shared state should + be used and any caching of computed values must be done with proper + synchronization.

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          E entryToObject(DatabaseEntry key,
          +                DatabaseEntry data)
          +
          Converts key and data entry buffers into an entity Object.
          +
          +
          Parameters:
          +
          key - is the source key entry.
          +
          data - is the source data entry.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          void objectToKey(E object,
          +                 DatabaseEntry key)
          +
          Extracts the key entry from an entity Object.
          +
          +
          Parameters:
          +
          object - is the source Object.
          +
          key - is the destination entry buffer.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          void objectToData(E object,
          +                  DatabaseEntry data)
          +
          Extracts the data entry from an entity Object.
          +
          +
          Parameters:
          +
          object - is the source Object.
          +
          data - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/EntryBinding.html b/docs/java/com/sleepycat/bind/EntryBinding.html new file mode 100644 index 0000000..024ec0d --- /dev/null +++ b/docs/java/com/sleepycat/bind/EntryBinding.html @@ -0,0 +1,275 @@ + + + + + +EntryBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind
    +

    Interface EntryBinding<E>

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          E entryToObject(DatabaseEntry entry)
          +
          Converts a entry buffer into an Object.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToEntry

          +
          void objectToEntry(E object,
          +                   DatabaseEntry entry)
          +
          Converts an Object into a entry buffer.
          +
          +
          Parameters:
          +
          object - is the source Object.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/class-use/ByteArrayBinding.html b/docs/java/com/sleepycat/bind/class-use/ByteArrayBinding.html new file mode 100644 index 0000000..3b2029a --- /dev/null +++ b/docs/java/com/sleepycat/bind/class-use/ByteArrayBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.ByteArrayBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.ByteArrayBinding

    +
    +
    No usage of com.sleepycat.bind.ByteArrayBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/class-use/EntityBinding.html b/docs/java/com/sleepycat/bind/class-use/EntityBinding.html new file mode 100644 index 0000000..3535dd4 --- /dev/null +++ b/docs/java/com/sleepycat/bind/class-use/EntityBinding.html @@ -0,0 +1,332 @@ + + + + + +Uses of Interface com.sleepycat.bind.EntityBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.bind.EntityBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/class-use/EntryBinding.html b/docs/java/com/sleepycat/bind/class-use/EntryBinding.html new file mode 100644 index 0000000..712f2c3 --- /dev/null +++ b/docs/java/com/sleepycat/bind/class-use/EntryBinding.html @@ -0,0 +1,582 @@ + + + + + +Uses of Interface com.sleepycat.bind.EntryBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.bind.EntryBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/package-frame.html b/docs/java/com/sleepycat/bind/package-frame.html new file mode 100644 index 0000000..786af17 --- /dev/null +++ b/docs/java/com/sleepycat/bind/package-frame.html @@ -0,0 +1,25 @@ + + + + + +com.sleepycat.bind (Oracle - Berkeley DB Java Edition API) + + + + + +

    com.sleepycat.bind

    +
    +

    Interfaces

    + +

    Classes

    + +
    + + diff --git a/docs/java/com/sleepycat/bind/package-summary.html b/docs/java/com/sleepycat/bind/package-summary.html new file mode 100644 index 0000000..8bc25f9 --- /dev/null +++ b/docs/java/com/sleepycat/bind/package-summary.html @@ -0,0 +1,189 @@ + + + + + +com.sleepycat.bind (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Package com.sleepycat.bind

    +
    +
    Bindings between database entries and Java objects.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      EntityBinding<E> +
      A binding between a key-value entry pair and an entity object.
      +
      EntryBinding<E> +
      A binding between a key or data entry and a key or data object.
      +
      +
    • +
    • + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      ByteArrayBinding +
      A pass-through EntryBinding that uses the entry's byte array as + the key or data object.
      +
      +
    • +
    + + + +

    Package com.sleepycat.bind Description

    +
    Bindings between database entries and Java objects. +
    +
    +
    See Also:
    +
    [Getting Started Guide] +
    +
    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/package-tree.html b/docs/java/com/sleepycat/bind/package-tree.html new file mode 100644 index 0000000..e107b34 --- /dev/null +++ b/docs/java/com/sleepycat/bind/package-tree.html @@ -0,0 +1,147 @@ + + + + + +com.sleepycat.bind Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Hierarchy For Package com.sleepycat.bind

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/package-use.html b/docs/java/com/sleepycat/bind/package-use.html new file mode 100644 index 0000000..53d9403 --- /dev/null +++ b/docs/java/com/sleepycat/bind/package-use.html @@ -0,0 +1,279 @@ + + + + + +Uses of Package com.sleepycat.bind (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Package
    com.sleepycat.bind

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/ClassCatalog.html b/docs/java/com/sleepycat/bind/serial/ClassCatalog.html new file mode 100644 index 0000000..b4fe862 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/ClassCatalog.html @@ -0,0 +1,363 @@ + + + + + +ClassCatalog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Interface ClassCatalog

    +
    +
    +
    +
      +
    • +
      +
      All Superinterfaces:
      +
      java.lang.AutoCloseable, java.io.Closeable
      +
      +
      +
      All Known Implementing Classes:
      +
      StoredClassCatalog
      +
      +
      +
      +
      public interface ClassCatalog
      +extends java.io.Closeable
      +
      A catalog of class description information for use during object + serialization. + +

      A catalog is used to store class descriptions separately from serialized + objects, to avoid redundantly stored information with each object. + When serialized objects are stored in a database, a StoredClassCatalog should be used.

      + +

      This information is used for serialization of class descriptors or + java.io.ObjectStreamClass objects, each of which represents a unique class + format. For each unique format, a unique class ID is assigned by the + catalog. The class ID can then be used in the serialization stream in place + of the full class information. When used with SerialInput and + SerialOutput or any of the serial bindings, the use of the catalog + is transparent to the application.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Class Evolution
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods 
        Modifier and TypeMethod and Description
        voidclose() +
        Close a catalog database and release any cached resources.
        +
        java.io.ObjectStreamClassgetClassFormat(byte[] classID) +
        Return the ObjectStreamClass for the given class ID.
        +
        byte[]getClassID(java.io.ObjectStreamClass classDesc) +
        Return the class ID for the current version of the given class + description.
        +
        java.lang.ClassLoadergetClassLoader() +
        Returns the ClassLoader to be used by bindings that use this catalog, or + null if a default class loader should be used.
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          close

          +
          void close()
          +    throws DatabaseException
          +
          Close a catalog database and release any cached resources.
          +
          +
          Specified by:
          +
          close in interface java.lang.AutoCloseable
          +
          Specified by:
          +
          close in interface java.io.Closeable
          +
          Throws:
          +
          DatabaseException - if an error occurs closing the catalog + database.
          +
          +
        • +
        + + + +
          +
        • +

          getClassID

          +
          byte[] getClassID(java.io.ObjectStreamClass classDesc)
          +           throws DatabaseException,
          +                  java.lang.ClassNotFoundException
          +
          Return the class ID for the current version of the given class + description. + This is used for storing in serialization streams in place of a full + class descriptor, since it is much more compact. To get back the + ObjectStreamClass for a class ID, call getClassFormat(byte[]). + This function causes a new class ID to be assigned if the class + description has changed.
          +
          +
          Parameters:
          +
          classDesc - The class description for which to return the + class ID.
          +
          Returns:
          +
          The class ID for the current version of the class.
          +
          Throws:
          +
          DatabaseException - if an error occurs accessing the catalog + database.
          +
          java.lang.ClassNotFoundException - if the class does not exist.
          +
          +
        • +
        + + + +
          +
        • +

          getClassFormat

          +
          java.io.ObjectStreamClass getClassFormat(byte[] classID)
          +                                  throws DatabaseException,
          +                                         java.lang.ClassNotFoundException
          +
          Return the ObjectStreamClass for the given class ID. This may or may + not be the current class format, depending on whether the class has + changed since the class ID was generated.
          +
          +
          Parameters:
          +
          classID - The class ID for which to return the class format.
          +
          Returns:
          +
          The class format for the given class ID, which may or may not + represent the current version of the class.
          +
          Throws:
          +
          DatabaseException - if an error occurs accessing the catalog + database.
          +
          java.lang.ClassNotFoundException - if the class does not exist.
          +
          +
        • +
        + + + +
          +
        • +

          getClassLoader

          +
          java.lang.ClassLoader getClassLoader()
          +
          Returns the ClassLoader to be used by bindings that use this catalog, or + null if a default class loader should be used. The ClassLoader is used + by SerialBinding to load classes whose description is stored in + the catalog. + +

          In BDB JE, the implementation of this method in StoredClassCatalog returns the ClassLoader property of the catalog + database Environment. This ensures that the Environment's ClassLoader + property is used for loading all user-supplied classes.

          +
          +
          Returns:
          +
          the ClassLoader or null.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/SerialBase.html b/docs/java/com/sleepycat/bind/serial/SerialBase.html new file mode 100644 index 0000000..045eb0a --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/SerialBase.html @@ -0,0 +1,369 @@ + + + + + +SerialBase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class SerialBase

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.serial.SerialBase
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Direct Known Subclasses:
      +
      SerialBinding
      +
      +
      +
      +
      public class SerialBase
      +extends java.lang.Object
      +
      A base class for serial bindings creators that provides control over the + allocation of the output buffer. + +

      Serial bindings append data to a FastOutputStream instance. This + object has a byte array buffer that is resized when it is full. The + reallocation of this buffer can be a performance factor for some + applications using large objects. To manage this issue, the setSerialBufferSize(int) method may be used to control the initial size of the + buffer, and the getSerialOutput(java.lang.Object) method may be overridden by + subclasses to take over creation of the FastOutputStream object.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Class Evolution
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        SerialBase() +
        Initializes the initial output buffer size to zero.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        intgetSerialBufferSize() +
        Returns the initial byte size of the output buffer.
        +
        protected FastOutputStreamgetSerialOutput(java.lang.Object object) +
        Returns an empty SerialOutput instance that will be used by the serial + binding or key creator.
        +
        voidsetSerialBufferSize(int byteSize) +
        Sets the initial byte size of the output buffer that is allocated by the + default implementation of getSerialOutput(java.lang.Object).
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setSerialBufferSize

          +
          public void setSerialBufferSize(int byteSize)
          +
          Sets the initial byte size of the output buffer that is allocated by the + default implementation of getSerialOutput(java.lang.Object). + +

          If this property is zero (the default), the default FastOutputStream.DEFAULT_INIT_SIZE size is used.

          +
          +
          Parameters:
          +
          byteSize - the initial byte size of the output buffer, or zero to + use the default size.
          +
          +
        • +
        + + + +
          +
        • +

          getSerialBufferSize

          +
          public int getSerialBufferSize()
          +
          Returns the initial byte size of the output buffer.
          +
          +
          Returns:
          +
          the initial byte size of the output buffer.
          +
          See Also:
          +
          setSerialBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          getSerialOutput

          +
          protected FastOutputStream getSerialOutput(java.lang.Object object)
          +
          Returns an empty SerialOutput instance that will be used by the serial + binding or key creator. + +

          The default implementation of this method creates a new SerialOutput + with an initial buffer size that can be changed using the setSerialBufferSize(int) method.

          + +

          This method may be overridden to return a FastOutputStream instance. + For example, an instance per thread could be created and returned by + this method. If a FastOutputStream instance is reused, be sure to call + its FastOutputStream.reset() method before each use.

          +
          +
          Parameters:
          +
          object - is the object to be written to the serial output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty FastOutputStream instance.
          +
          See Also:
          +
          setSerialBufferSize(int)
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/SerialBinding.html b/docs/java/com/sleepycat/bind/serial/SerialBinding.html new file mode 100644 index 0000000..d558be2 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/SerialBinding.html @@ -0,0 +1,450 @@ + + + + + +SerialBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class SerialBinding<E>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<E>
      +
      +
      +
      +
      public class SerialBinding<E>
      +extends SerialBase
      +implements EntryBinding<E>
      +
      A concrete EntryBinding that treats a key or data entry as + a serialized object. + +

      This binding stores objects in serialized object format. The + deserialized objects are returned by the binding, and their + Class must implement the Serializable + interface.

      + +

      For key bindings, a tuple binding is usually a better choice than a + serial binding. A tuple binding gives a reasonable sort order, and works + with comparators in all cases -- see below.

      + +

      WARNING: SerialBinding should not be used with Berkeley DB Java + Edition for key bindings, when a custom comparator is used. In JE, + comparators are instantiated and called internally at times when databases + are not accessible. Because serial bindings depend on the class catalog + database, a serial binding cannot be used during these times. An attempt + to use a serial binding with a custom comparator will result in a + NullPointerException during environment open or close.

      + +

      Class Evolution

      + +

      SerialBinding and other classes in this package use standard Java + serialization and all rules of Java serialization apply. This includes the + rules for class evolution. Once an instance of a class is stored, the class + must maintain its serialVersionUID and follow the rules defined in + the Java specification. To use a new incompatible version of a class, a + different ClassCatalog must be used or the class catalog database + must be truncated.

      + +

      If more advanced class evolution features are required, consider using + the Direct Persistence Layer.

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SerialBinding

          +
          public SerialBinding(ClassCatalog classCatalog,
          +                     java.lang.Class<E> baseClass)
          +
          Creates a serial binding.
          +
          +
          Parameters:
          +
          classCatalog - is the catalog to hold shared class information and + for a database should be a StoredClassCatalog.
          +
          baseClass - is the base class for serialized objects stored using + this binding -- all objects using this binding must be an instance of + this class. Note that if this parameter is non-null, then this binding + will not support serialization of null values.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getBaseClass

          +
          public final java.lang.Class<E> getBaseClass()
          +
          Returns the base class for this binding.
          +
          +
          Returns:
          +
          the base class for this binding.
          +
          +
        • +
        + + + +
          +
        • +

          getClassLoader

          +
          public java.lang.ClassLoader getClassLoader()
          +
          Returns the class loader to be used during deserialization, or null if a + default class loader should be used. The default implementation of this + method returns ClassCatalog.getClassLoader(), if it returns a + non-null value. If ClassCatalog.getClassLoader() returns null, + then Thread.currentThread().getContextClassLoader() is + returned. + +

          This method may be overridden to return a dynamically determined + class loader. For example, getBaseClass().getClassLoader() + could be called to use the class loader for the base class, assuming + that a base class has been specified.

          + +

          If this method returns null, a default class loader will be used as + determined by the java.io.ObjectInputStream.resolveClass + method.

          +
          +
          Returns:
          +
          the ClassLoader or null.
          +
          +
        • +
        + + + +
          +
        • +

          entryToObject

          +
          public E entryToObject(DatabaseEntry entry)
          +
          Deserialize an object from an entry buffer. May only be called for data + that was serialized using objectToEntry(E, com.sleepycat.je.DatabaseEntry), since the fixed + serialization header is assumed to not be included in the input data. + SerialInput is used to deserialize the object.
          +
          +
          Specified by:
          +
          entryToObject in interface EntryBinding<E>
          +
          Parameters:
          +
          entry - is the input serialized entry.
          +
          Returns:
          +
          the output deserialized object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(E object,
          +                          DatabaseEntry entry)
          +
          Serialize an object into an entry buffer. The fixed serialization + header is not included in the output data to save space, and therefore + to deserialize the data the complementary entryToObject(com.sleepycat.je.DatabaseEntry) method + must be used. SerialOutput is used to serialize the object. + +

          Note that this method sets the DatabaseEntry offset property to a + non-zero value and the size property to a value less than the length of + the byte array.

          +
          +
          Specified by:
          +
          objectToEntry in interface EntryBinding<E>
          +
          Parameters:
          +
          object - is the input deserialized object.
          +
          entry - is the output serialized entry.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if the object is not an instance of the + base class for this binding, including if the object is null and a + non-null base class was specified.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/SerialInput.html b/docs/java/com/sleepycat/bind/serial/SerialInput.html new file mode 100644 index 0000000..1371f02 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/SerialInput.html @@ -0,0 +1,423 @@ + + + + + +SerialInput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class SerialInput

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Closeable, java.io.DataInput, java.io.ObjectInput, java.io.ObjectStreamConstants, java.lang.AutoCloseable
      +
      +
      +
      +
      public class SerialInput
      +extends ClassResolver.Stream
      +
      A specialized ObjectInputStream that gets class description + information from a ClassCatalog. It is used by + SerialBinding. + +

      This class is used instead of an ObjectInputStream, which it + extends, to read an object stream written by the SerialOutput class. + For reading objects from a database normally one of the serial binding + classes is used. SerialInput is used when an ObjectInputStream is needed along with compact storage. A ClassCatalog must be supplied, however, to stored shared class + descriptions.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Class Evolution
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Nested Class Summary

        +
          +
        • + + +

          Nested classes/interfaces inherited from class java.io.ObjectInputStream

          +java.io.ObjectInputStream.GetField
        • +
        +
      • +
      + +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from interface java.io.ObjectStreamConstants

          +baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + +
        Constructors 
        Constructor and Description
        SerialInput(java.io.InputStream in, + ClassCatalog classCatalog) +
        Creates a serial input stream.
        +
        SerialInput(java.io.InputStream in, + ClassCatalog classCatalog, + java.lang.ClassLoader classLoader) +
        Creates a serial input stream.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        protected java.io.ObjectStreamClassreadClassDescriptor() 
        + +
          +
        • + + +

          Methods inherited from class java.io.ObjectInputStream

          +available, close, defaultReadObject, enableResolveObject, read, read, readBoolean, readByte, readChar, readDouble, readFields, readFloat, readFully, readFully, readInt, readLine, readLong, readObject, readObjectOverride, readShort, readStreamHeader, readUnshared, readUnsignedByte, readUnsignedShort, readUTF, registerValidation, resolveObject, resolveProxyClass, skipBytes
        • +
        +
          +
        • + + +

          Methods inherited from class java.io.InputStream

          +mark, markSupported, read, reset, skip
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.io.ObjectInput

          +read, skip
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SerialInput

          +
          public SerialInput(java.io.InputStream in,
          +                   ClassCatalog classCatalog)
          +            throws java.io.IOException
          +
          Creates a serial input stream.
          +
          +
          Parameters:
          +
          in - is the input stream from which compact serialized objects will + be read.
          +
          classCatalog - is the catalog containing the class descriptions + for the serialized objects.
          +
          Throws:
          +
          java.io.IOException - if an I/O error occurs while reading stream header.
          +
          +
        • +
        + + + +
          +
        • +

          SerialInput

          +
          public SerialInput(java.io.InputStream in,
          +                   ClassCatalog classCatalog,
          +                   java.lang.ClassLoader classLoader)
          +            throws java.io.IOException
          +
          Creates a serial input stream.
          +
          +
          Parameters:
          +
          in - is the input stream from which compact serialized objects will + be read.
          +
          classCatalog - is the catalog containing the class descriptions + for the serialized objects.
          +
          classLoader - is the class loader to use, or null if a default + class loader should be used.
          +
          Throws:
          +
          java.io.IOException - if an I/O error occurs while reading stream header.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          readClassDescriptor

          +
          protected java.io.ObjectStreamClass readClassDescriptor()
          +                                                 throws java.io.IOException,
          +                                                        java.lang.ClassNotFoundException
          +
          +
          Overrides:
          +
          readClassDescriptor in class java.io.ObjectInputStream
          +
          Throws:
          +
          java.io.IOException
          +
          java.lang.ClassNotFoundException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/SerialOutput.html b/docs/java/com/sleepycat/bind/serial/SerialOutput.html new file mode 100644 index 0000000..20b61d1 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/SerialOutput.html @@ -0,0 +1,394 @@ + + + + + +SerialOutput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class SerialOutput

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.io.OutputStream
      • +
      • +
          +
        • java.io.ObjectOutputStream
        • +
        • +
            +
          • com.sleepycat.bind.serial.SerialOutput
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Closeable, java.io.DataOutput, java.io.Flushable, java.io.ObjectOutput, java.io.ObjectStreamConstants, java.lang.AutoCloseable
      +
      +
      +
      +
      public class SerialOutput
      +extends java.io.ObjectOutputStream
      +
      A specialized ObjectOutputStream that stores class description + information in a ClassCatalog. It is used by + SerialBinding. + +

      This class is used instead of an ObjectOutputStream, which it + extends, to write a compact object stream. For writing objects to a + database normally one of the serial binding classes is used. SerialOutput is used when an ObjectOutputStream is needed along + with compact storage. A ClassCatalog must be supplied, however, to + stored shared class descriptions.

      + +

      The ClassCatalog is used to store class definitions rather than + embedding these into the stream. Instead, a class format identifier is + embedded into the stream. This identifier is then used by SerialInput to load the class format to deserialize the object.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Class Evolution
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Nested Class Summary

        +
          +
        • + + +

          Nested classes/interfaces inherited from class java.io.ObjectOutputStream

          +java.io.ObjectOutputStream.PutField
        • +
        +
      • +
      + +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from interface java.io.ObjectStreamConstants

          +baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        SerialOutput(java.io.OutputStream out, + ClassCatalog classCatalog) +
        Creates a serial output stream.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static byte[]getStreamHeader() +
        Returns the fixed stream header used for all serialized streams in + PROTOCOL_VERSION_2 format.
        +
        protected voidwriteClassDescriptor(java.io.ObjectStreamClass classdesc) 
        +
          +
        • + + +

          Methods inherited from class java.io.ObjectOutputStream

          +annotateClass, annotateProxyClass, close, defaultWriteObject, drain, enableReplaceObject, flush, putFields, replaceObject, reset, useProtocolVersion, write, write, write, writeBoolean, writeByte, writeBytes, writeChar, writeChars, writeDouble, writeFields, writeFloat, writeInt, writeLong, writeObject, writeObjectOverride, writeShort, writeStreamHeader, writeUnshared, writeUTF
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SerialOutput

          +
          public SerialOutput(java.io.OutputStream out,
          +                    ClassCatalog classCatalog)
          +             throws java.io.IOException
          +
          Creates a serial output stream.
          +
          +
          Parameters:
          +
          out - is the output stream to which the compact serialized objects + will be written.
          +
          classCatalog - is the catalog to which the class descriptions for + the serialized objects will be written.
          +
          Throws:
          +
          java.io.IOException - if an I/O error occurs while writing stream header.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          writeClassDescriptor

          +
          protected void writeClassDescriptor(java.io.ObjectStreamClass classdesc)
          +                             throws java.io.IOException
          +
          +
          Overrides:
          +
          writeClassDescriptor in class java.io.ObjectOutputStream
          +
          Throws:
          +
          java.io.IOException
          +
          +
        • +
        + + + +
          +
        • +

          getStreamHeader

          +
          public static byte[] getStreamHeader()
          +
          Returns the fixed stream header used for all serialized streams in + PROTOCOL_VERSION_2 format. To save space this header can be removed and + serialized streams before storage and inserted before deserializing. + SerialOutput always uses PROTOCOL_VERSION_2 serialization format + to guarantee that this header is fixed. SerialBinding removes + this header from serialized streams automatically.
          +
          +
          Returns:
          +
          the fixed stream header.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/SerialSerialBinding.html b/docs/java/com/sleepycat/bind/serial/SerialSerialBinding.html new file mode 100644 index 0000000..c5794a2 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/SerialSerialBinding.html @@ -0,0 +1,481 @@ + + + + + +SerialSerialBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class SerialSerialBinding<K,D,E>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.serial.SerialSerialBinding<K,D,E>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntityBinding<E>
      +
      +
      +
      +
      public abstract class SerialSerialBinding<K,D,E>
      +extends java.lang.Object
      +implements EntityBinding<E>
      +
      An abstract EntityBinding that treats an entity's key entry and + data entry as serialized objects. + +

      This class takes care of serializing and deserializing the key and + data entry automatically. Its three abstract methods must be implemented by + a concrete subclass to convert the deserialized objects to/from an entity + object.

      +
      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Class Evolution
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SerialSerialBinding

          +
          public SerialSerialBinding(ClassCatalog classCatalog,
          +                           java.lang.Class<K> keyClass,
          +                           java.lang.Class<D> dataClass)
          +
          Creates a serial-serial entity binding.
          +
          +
          Parameters:
          +
          classCatalog - is the catalog to hold shared class information and + for a database should be a StoredClassCatalog.
          +
          keyClass - is the key base class.
          +
          dataClass - is the data base class.
          +
          +
        • +
        + + + +
          +
        • +

          SerialSerialBinding

          +
          public SerialSerialBinding(SerialBinding<K> keyBinding,
          +                           SerialBinding<D> dataBinding)
          +
          Creates a serial-serial entity binding.
          +
          +
          Parameters:
          +
          keyBinding - is the key binding.
          +
          dataBinding - is the data binding.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public E entryToObject(DatabaseEntry key,
          +                       DatabaseEntry data)
          +
          Description copied from interface: EntityBinding
          +
          Converts key and data entry buffers into an entity Object.
          +
          +
          Specified by:
          +
          entryToObject in interface EntityBinding<E>
          +
          Parameters:
          +
          key - is the source key entry.
          +
          data - is the source data entry.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          public void objectToKey(E object,
          +                        DatabaseEntry key)
          +
          Description copied from interface: EntityBinding
          +
          Extracts the key entry from an entity Object.
          +
          +
          Specified by:
          +
          objectToKey in interface EntityBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          key - is the destination entry buffer.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          public void objectToData(E object,
          +                         DatabaseEntry data)
          +
          Description copied from interface: EntityBinding
          +
          Extracts the data entry from an entity Object.
          +
          +
          Specified by:
          +
          objectToData in interface EntityBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          data - is the destination entry buffer.
          +
          +
        • +
        + + + + + +
          +
        • +

          entryToObject

          +
          public abstract E entryToObject(K keyInput,
          +                                D dataInput)
          +
          Constructs an entity object from deserialized key and data objects.
          +
          +
          Parameters:
          +
          keyInput - is the deserialized key object.
          +
          dataInput - is the deserialized data object.
          +
          Returns:
          +
          the entity object constructed from the key and data.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          public abstract K objectToKey(E object)
          +
          Extracts a key object from an entity object.
          +
          +
          Parameters:
          +
          object - is the entity object.
          +
          Returns:
          +
          the deserialized key object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          public abstract D objectToData(E object)
          +
          Extracts a data object from an entity object.
          +
          +
          Parameters:
          +
          object - is the entity object.
          +
          Returns:
          +
          the deserialized data object.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/SerialSerialKeyCreator.html b/docs/java/com/sleepycat/bind/serial/SerialSerialKeyCreator.html new file mode 100644 index 0000000..53be845 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/SerialSerialKeyCreator.html @@ -0,0 +1,548 @@ + + + + + +SerialSerialKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class SerialSerialKeyCreator<PK,D,SK>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.serial.SerialSerialKeyCreator<PK,D,SK>
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SerialSerialKeyCreator

          +
          public SerialSerialKeyCreator(ClassCatalog classCatalog,
          +                              java.lang.Class<PK> primaryKeyClass,
          +                              java.lang.Class<D> dataClass,
          +                              java.lang.Class<SK> indexKeyClass)
          +
          Creates a serial-serial key creator.
          +
          +
          Parameters:
          +
          classCatalog - is the catalog to hold shared class information and + for a database should be a StoredClassCatalog.
          +
          primaryKeyClass - is the primary key base class.
          +
          dataClass - is the data base class.
          +
          indexKeyClass - is the index key base class.
          +
          +
        • +
        + + + +
          +
        • +

          SerialSerialKeyCreator

          +
          public SerialSerialKeyCreator(SerialBinding<PK> primaryKeyBinding,
          +                              SerialBinding<D> dataBinding,
          +                              SerialBinding<SK> indexKeyBinding)
          +
          Creates a serial-serial entity binding.
          +
          +
          Parameters:
          +
          primaryKeyBinding - is the primary key binding.
          +
          dataBinding - is the data binding.
          +
          indexKeyBinding - is the index key binding.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          createSecondaryKey

          +
          public boolean createSecondaryKey(SecondaryDatabase db,
          +                                  DatabaseEntry primaryKeyEntry,
          +                                  DatabaseEntry dataEntry,
          +                                  DatabaseEntry indexKeyEntry)
          +
          Description copied from interface: SecondaryKeyCreator
          +
          Creates a secondary key entry, given a primary key and data entry. + +

          A secondary key may be derived from the primary key, primary data, or + a combination of the primary key and data. For secondary keys that are + optional, the key creator method may return false and the key/data pair + will not be indexed. To ensure the integrity of a secondary database + the key creator method must always return the same result for a given + set of input parameters.

          + +

          A RuntimeException may be thrown by this method if an error + occurs attempting to create the secondary key. This exception will be + thrown by the API method currently in progress, for example, a put method. However, this will cause the write operation + to be incomplete. When databases are not configured to be + transactional, caution should be used to avoid integrity problems. See + Special considerations for + using Secondary Databases with and without Transactions.

          +
          +
          Specified by:
          +
          createSecondaryKey in interface SecondaryKeyCreator
          +
          Parameters:
          +
          db - the database to which the secondary key will be + added. This parameter is passed for informational purposes but is not + commonly used. This parameter is always non-null.
          +
          primaryKeyEntry - the primary key entry. This parameter must not be modified + by this method. This parameter is always non-null.
          +
          dataEntry - the primary data entry. This parameter must not be modified + by this method. If SecondaryConfig#setExtractFromPrimaryKeyOnly + is configured as true, the data param may be either null + or non-null, and the implementation is expected to ignore it; otherwise, + this parameter is always non-null.
          +
          indexKeyEntry - the secondary key created by this method. This parameter + is always non-null.
          +
          Returns:
          +
          true if a key was created, or false to indicate that the key is + not present.
          +
          +
        • +
        + + + +
          +
        • +

          nullifyForeignKey

          +
          public boolean nullifyForeignKey(SecondaryDatabase db,
          +                                 DatabaseEntry dataEntry)
          +
          Description copied from interface: ForeignKeyNullifier
          +
          Sets the foreign key reference to null in the datum of the primary + database.
          +
          +
          Specified by:
          +
          nullifyForeignKey in interface ForeignKeyNullifier
          +
          Parameters:
          +
          db - the database in which the foreign key integrity + constraint is defined. This parameter is passed for informational + purposes but is not commonly used.
          +
          dataEntry - the existing primary datum in which the foreign key + reference should be set to null. This parameter should be updated by + this method if it returns true.
          +
          Returns:
          +
          true if the datum was modified, or false to indicate that the + key is not present.
          +
          +
        • +
        + + + + + +
          +
        • +

          createSecondaryKey

          +
          public abstract SK createSecondaryKey(PK primaryKey,
          +                                      D data)
          +
          Creates the index key object from primary key and data objects.
          +
          +
          Parameters:
          +
          primaryKey - is the deserialized source primary key entry, or + null if no primary key entry is used to construct the index key.
          +
          data - is the deserialized source data entry, or null if no + data entry is used to construct the index key.
          +
          Returns:
          +
          the destination index key object, or null to indicate that + the key is not present.
          +
          +
        • +
        + + + + + + +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/StoredClassCatalog.html b/docs/java/com/sleepycat/bind/serial/StoredClassCatalog.html new file mode 100644 index 0000000..7f8feb7 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/StoredClassCatalog.html @@ -0,0 +1,424 @@ + + + + + +StoredClassCatalog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class StoredClassCatalog

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.serial.StoredClassCatalog
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      ClassCatalog, java.io.Closeable, java.lang.AutoCloseable
      +
      +
      +
      +
      public class StoredClassCatalog
      +extends java.lang.Object
      +implements ClassCatalog
      +
      A ClassCatalog that is stored in a Database. + +

      A single StoredClassCatalog object is normally used along + with a set of databases that stored serialized objects.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Class Evolution
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        StoredClassCatalog(Database database) +
        Creates a catalog based on a given database.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidclose() +
        Close a catalog database and release any cached resources.
        +
        java.io.ObjectStreamClassgetClassFormat(byte[] classID) +
        Return the ObjectStreamClass for the given class ID.
        +
        byte[]getClassID(java.io.ObjectStreamClass classFormat) +
        Return the class ID for the current version of the given class + description.
        +
        java.lang.ClassLoadergetClassLoader() +
        For BDB JE, returns the ClassLoader property of the catalog database + environment.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredClassCatalog

          +
          public StoredClassCatalog(Database database)
          +                   throws DatabaseException,
          +                          java.lang.IllegalArgumentException
          +
          Creates a catalog based on a given database. To save resources, only a + single catalog object should be used for each unique catalog database.
          +
          +
          Parameters:
          +
          database - an open database to use as the class catalog. It must + be a BTREE database and must not allow duplicates.
          +
          Throws:
          +
          DatabaseException - if an error occurs accessing the database.
          +
          java.lang.IllegalArgumentException - if the database is not a BTREE database + or if it configured to allow duplicates.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          close

          +
          public void close()
          +           throws DatabaseException
          +
          Description copied from interface: ClassCatalog
          +
          Close a catalog database and release any cached resources.
          +
          +
          Specified by:
          +
          close in interface ClassCatalog
          +
          Specified by:
          +
          close in interface java.io.Closeable
          +
          Specified by:
          +
          close in interface java.lang.AutoCloseable
          +
          Throws:
          +
          DatabaseException - if an error occurs closing the catalog + database.
          +
          +
        • +
        + + + +
          +
        • +

          getClassID

          +
          public byte[] getClassID(java.io.ObjectStreamClass classFormat)
          +                  throws DatabaseException,
          +                         java.lang.ClassNotFoundException
          +
          Description copied from interface: ClassCatalog
          +
          Return the class ID for the current version of the given class + description. + This is used for storing in serialization streams in place of a full + class descriptor, since it is much more compact. To get back the + ObjectStreamClass for a class ID, call ClassCatalog.getClassFormat(byte[]). + This function causes a new class ID to be assigned if the class + description has changed.
          +
          +
          Specified by:
          +
          getClassID in interface ClassCatalog
          +
          Parameters:
          +
          classFormat - The class description for which to return the + class ID.
          +
          Returns:
          +
          The class ID for the current version of the class.
          +
          Throws:
          +
          DatabaseException - if an error occurs accessing the catalog + database.
          +
          java.lang.ClassNotFoundException - if the class does not exist.
          +
          +
        • +
        + + + +
          +
        • +

          getClassFormat

          +
          public java.io.ObjectStreamClass getClassFormat(byte[] classID)
          +                                         throws DatabaseException,
          +                                                java.lang.ClassNotFoundException
          +
          Description copied from interface: ClassCatalog
          +
          Return the ObjectStreamClass for the given class ID. This may or may + not be the current class format, depending on whether the class has + changed since the class ID was generated.
          +
          +
          Specified by:
          +
          getClassFormat in interface ClassCatalog
          +
          Parameters:
          +
          classID - The class ID for which to return the class format.
          +
          Returns:
          +
          The class format for the given class ID, which may or may not + represent the current version of the class.
          +
          Throws:
          +
          DatabaseException - if an error occurs accessing the catalog + database.
          +
          java.lang.ClassNotFoundException - if the class does not exist.
          +
          +
        • +
        + + + +
          +
        • +

          getClassLoader

          +
          public java.lang.ClassLoader getClassLoader()
          +
          For BDB JE, returns the ClassLoader property of the catalog database + environment. This ensures that the Environment's ClassLoader property + is used for loading all user-supplied classes. + +

          For BDB, this method returns null because no Environment ClassLoader + property is available. This method may be overridden to return a + ClassLoader.

          +
          +
          Specified by:
          +
          getClassLoader in interface ClassCatalog
          +
          Returns:
          +
          the ClassLoader or null.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/TupleSerialBinding.html b/docs/java/com/sleepycat/bind/serial/TupleSerialBinding.html new file mode 100644 index 0000000..84e44c9 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/TupleSerialBinding.html @@ -0,0 +1,530 @@ + + + + + +TupleSerialBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class TupleSerialBinding<D,E>

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleSerialBinding

          +
          public TupleSerialBinding(ClassCatalog classCatalog,
          +                          java.lang.Class<D> baseClass)
          +
          Creates a tuple-serial entity binding.
          +
          +
          Parameters:
          +
          classCatalog - is the catalog to hold shared class information and + for a database should be a StoredClassCatalog.
          +
          baseClass - is the base class.
          +
          +
        • +
        + + + +
          +
        • +

          TupleSerialBinding

          +
          public TupleSerialBinding(SerialBinding<D> dataBinding)
          +
          Creates a tuple-serial entity binding.
          +
          +
          Parameters:
          +
          dataBinding - is the data binding.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public E entryToObject(DatabaseEntry key,
          +                       DatabaseEntry data)
          +
          Description copied from interface: EntityBinding
          +
          Converts key and data entry buffers into an entity Object.
          +
          +
          Specified by:
          +
          entryToObject in interface EntityBinding<E>
          +
          Parameters:
          +
          key - is the source key entry.
          +
          data - is the source data entry.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          public void objectToKey(E object,
          +                        DatabaseEntry key)
          +
          Description copied from interface: EntityBinding
          +
          Extracts the key entry from an entity Object.
          +
          +
          Specified by:
          +
          objectToKey in interface EntityBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          key - is the destination entry buffer.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          public void objectToData(E object,
          +                         DatabaseEntry data)
          +
          Description copied from interface: EntityBinding
          +
          Extracts the data entry from an entity Object.
          +
          +
          Specified by:
          +
          objectToData in interface EntityBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          data - is the destination entry buffer.
          +
          +
        • +
        + + + + + +
          +
        • +

          entryToObject

          +
          public abstract E entryToObject(TupleInput keyInput,
          +                                D dataInput)
          +
          Constructs an entity object from TupleInput key entry and + deserialized data entry objects.
          +
          +
          Parameters:
          +
          keyInput - is the TupleInput key entry object.
          +
          dataInput - is the deserialized data entry object.
          +
          Returns:
          +
          the entity object constructed from the key and data.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          public abstract void objectToKey(E object,
          +                                 TupleOutput keyOutput)
          +
          Extracts a key tuple from an entity object.
          +
          +
          Parameters:
          +
          object - is the entity object.
          +
          keyOutput - is the TupleOutput to which the key should be + written.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          public abstract D objectToData(E object)
          +
          Extracts a data object from an entity object.
          +
          +
          Parameters:
          +
          object - is the entity object.
          +
          Returns:
          +
          the deserialized data object.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/TupleSerialKeyCreator.html b/docs/java/com/sleepycat/bind/serial/TupleSerialKeyCreator.html new file mode 100644 index 0000000..a5f3af2 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/TupleSerialKeyCreator.html @@ -0,0 +1,536 @@ + + + + + +TupleSerialKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class TupleSerialKeyCreator<D>

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleSerialKeyCreator

          +
          public TupleSerialKeyCreator(ClassCatalog classCatalog,
          +                             java.lang.Class<D> dataClass)
          +
          Creates a tuple-serial key creator.
          +
          +
          Parameters:
          +
          classCatalog - is the catalog to hold shared class information and + for a database should be a StoredClassCatalog.
          +
          dataClass - is the data base class.
          +
          +
        • +
        + + + +
          +
        • +

          TupleSerialKeyCreator

          +
          public TupleSerialKeyCreator(SerialBinding<D> dataBinding)
          +
          Creates a tuple-serial key creator.
          +
          +
          Parameters:
          +
          dataBinding - is the data binding.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          createSecondaryKey

          +
          public boolean createSecondaryKey(SecondaryDatabase db,
          +                                  DatabaseEntry primaryKeyEntry,
          +                                  DatabaseEntry dataEntry,
          +                                  DatabaseEntry indexKeyEntry)
          +
          Description copied from interface: SecondaryKeyCreator
          +
          Creates a secondary key entry, given a primary key and data entry. + +

          A secondary key may be derived from the primary key, primary data, or + a combination of the primary key and data. For secondary keys that are + optional, the key creator method may return false and the key/data pair + will not be indexed. To ensure the integrity of a secondary database + the key creator method must always return the same result for a given + set of input parameters.

          + +

          A RuntimeException may be thrown by this method if an error + occurs attempting to create the secondary key. This exception will be + thrown by the API method currently in progress, for example, a put method. However, this will cause the write operation + to be incomplete. When databases are not configured to be + transactional, caution should be used to avoid integrity problems. See + Special considerations for + using Secondary Databases with and without Transactions.

          +
          +
          Specified by:
          +
          createSecondaryKey in interface SecondaryKeyCreator
          +
          Parameters:
          +
          db - the database to which the secondary key will be + added. This parameter is passed for informational purposes but is not + commonly used. This parameter is always non-null.
          +
          primaryKeyEntry - the primary key entry. This parameter must not be modified + by this method. This parameter is always non-null.
          +
          dataEntry - the primary data entry. This parameter must not be modified + by this method. If SecondaryConfig#setExtractFromPrimaryKeyOnly + is configured as true, the data param may be either null + or non-null, and the implementation is expected to ignore it; otherwise, + this parameter is always non-null.
          +
          indexKeyEntry - the secondary key created by this method. This parameter + is always non-null.
          +
          Returns:
          +
          true if a key was created, or false to indicate that the key is + not present.
          +
          +
        • +
        + + + +
          +
        • +

          nullifyForeignKey

          +
          public boolean nullifyForeignKey(SecondaryDatabase db,
          +                                 DatabaseEntry dataEntry)
          +
          Description copied from interface: ForeignKeyNullifier
          +
          Sets the foreign key reference to null in the datum of the primary + database.
          +
          +
          Specified by:
          +
          nullifyForeignKey in interface ForeignKeyNullifier
          +
          Parameters:
          +
          db - the database in which the foreign key integrity + constraint is defined. This parameter is passed for informational + purposes but is not commonly used.
          +
          dataEntry - the existing primary datum in which the foreign key + reference should be set to null. This parameter should be updated by + this method if it returns true.
          +
          Returns:
          +
          true if the datum was modified, or false to indicate that the + key is not present.
          +
          +
        • +
        + + + + + +
          +
        • +

          createSecondaryKey

          +
          public abstract boolean createSecondaryKey(TupleInput primaryKeyInput,
          +                                           D dataInput,
          +                                           TupleOutput indexKeyOutput)
          +
          Creates the index key entry from primary key tuple entry and + deserialized data entry.
          +
          +
          Parameters:
          +
          primaryKeyInput - is the TupleInput for the primary key + entry, or null if no primary key entry is used to construct the index + key.
          +
          dataInput - is the deserialized data entry, or null if no data + entry is used to construct the index key.
          +
          indexKeyOutput - is the destination index key tuple. For index + keys which are optionally present, no tuple entry should be output to + indicate that the key is not present or null.
          +
          Returns:
          +
          true if a key was created, or false to indicate that the key is + not present.
          +
          +
        • +
        + + + + + +
          +
        • +

          nullifyForeignKey

          +
          public D nullifyForeignKey(D data)
          +
          Clears the index key in the deserialized data entry. + +

          On entry the data parameter contains the index key to be cleared. It + should be changed by this method such that createSecondaryKey(com.sleepycat.je.SecondaryDatabase, com.sleepycat.je.DatabaseEntry, com.sleepycat.je.DatabaseEntry, com.sleepycat.je.DatabaseEntry) + will return false. Other fields in the data object should remain + unchanged.

          +
          +
          Parameters:
          +
          data - is the source and destination deserialized data + entry.
          +
          Returns:
          +
          the destination data object, or null to indicate that the + key is not present and no change is necessary. The data returned may + be the same object passed as the data parameter or a newly created + object.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledBinding.html b/docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledBinding.html new file mode 100644 index 0000000..de51b5d --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledBinding.html @@ -0,0 +1,445 @@ + + + + + +TupleSerialMarshalledBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class TupleSerialMarshalledBinding<E extends MarshalledTupleKeyEntity>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntityBinding<E>
      +
      +
      +
      +
      public class TupleSerialMarshalledBinding<E extends MarshalledTupleKeyEntity>
      +extends TupleSerialBinding<E,E>
      +
      A concrete TupleSerialBinding that delegates to the + MarshalledTupleKeyEntity interface of the entity class. + +

      The MarshalledTupleKeyEntity interface must be implemented by the + entity class to convert between the key/data entry and entity object.

      + +

      The binding is "tricky" in that it uses the entity class for both the + stored data entry and the combined entity object. To do this, the entity's + key field(s) are transient and are set by the binding after the data object + has been deserialized. This avoids the use of a "data" class completely. +

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      MarshalledTupleKeyEntity, +Class Evolution
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleSerialMarshalledBinding

          +
          public TupleSerialMarshalledBinding(ClassCatalog classCatalog,
          +                                    java.lang.Class<E> baseClass)
          +
          Creates a tuple-serial marshalled binding object.
          +
          +
          Parameters:
          +
          classCatalog - is the catalog to hold shared class information and + for a database should be a StoredClassCatalog.
          +
          baseClass - is the base class for serialized objects stored using + this binding -- all objects using this binding must be an instance of + this class.
          +
          +
        • +
        + + + +
          +
        • +

          TupleSerialMarshalledBinding

          +
          public TupleSerialMarshalledBinding(SerialBinding<E> dataBinding)
          +
          Creates a tuple-serial marshalled binding object.
          +
          +
          Parameters:
          +
          dataBinding - is the binding used for serializing and deserializing + the entity object.
          +
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledKeyCreator.html b/docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledKeyCreator.html new file mode 100644 index 0000000..c9be8ad --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/TupleSerialMarshalledKeyCreator.html @@ -0,0 +1,403 @@ + + + + + +TupleSerialMarshalledKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.serial
    +

    Class TupleSerialMarshalledKeyCreator<D extends MarshalledTupleKeyEntity>

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/ClassCatalog.html b/docs/java/com/sleepycat/bind/serial/class-use/ClassCatalog.html new file mode 100644 index 0000000..c6ef1d2 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/ClassCatalog.html @@ -0,0 +1,278 @@ + + + + + +Uses of Interface com.sleepycat.bind.serial.ClassCatalog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.bind.serial.ClassCatalog

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/SerialBase.html b/docs/java/com/sleepycat/bind/serial/class-use/SerialBase.html new file mode 100644 index 0000000..13c4906 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/SerialBase.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.SerialBase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.SerialBase

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/SerialBinding.html b/docs/java/com/sleepycat/bind/serial/class-use/SerialBinding.html new file mode 100644 index 0000000..80df09e --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/SerialBinding.html @@ -0,0 +1,243 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.SerialBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.SerialBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/SerialInput.html b/docs/java/com/sleepycat/bind/serial/class-use/SerialInput.html new file mode 100644 index 0000000..f70f393 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/SerialInput.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.SerialInput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.SerialInput

    +
    +
    No usage of com.sleepycat.bind.serial.SerialInput
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/SerialOutput.html b/docs/java/com/sleepycat/bind/serial/class-use/SerialOutput.html new file mode 100644 index 0000000..74e2eea --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/SerialOutput.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.SerialOutput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.SerialOutput

    +
    +
    No usage of com.sleepycat.bind.serial.SerialOutput
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/SerialSerialBinding.html b/docs/java/com/sleepycat/bind/serial/class-use/SerialSerialBinding.html new file mode 100644 index 0000000..d7b77d3 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/SerialSerialBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.SerialSerialBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.SerialSerialBinding

    +
    +
    No usage of com.sleepycat.bind.serial.SerialSerialBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/SerialSerialKeyCreator.html b/docs/java/com/sleepycat/bind/serial/class-use/SerialSerialKeyCreator.html new file mode 100644 index 0000000..a7bc7b6 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/SerialSerialKeyCreator.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.SerialSerialKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.SerialSerialKeyCreator

    +
    +
    No usage of com.sleepycat.bind.serial.SerialSerialKeyCreator
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/StoredClassCatalog.html b/docs/java/com/sleepycat/bind/serial/class-use/StoredClassCatalog.html new file mode 100644 index 0000000..60577ed --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/StoredClassCatalog.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.StoredClassCatalog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.StoredClassCatalog

    +
    +
    No usage of com.sleepycat.bind.serial.StoredClassCatalog
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialBinding.html b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialBinding.html new file mode 100644 index 0000000..e02fb53 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialBinding.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.TupleSerialBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.TupleSerialBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialKeyCreator.html b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialKeyCreator.html new file mode 100644 index 0000000..9ac34e6 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialKeyCreator.html @@ -0,0 +1,173 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.TupleSerialKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.TupleSerialKeyCreator

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledBinding.html b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledBinding.html new file mode 100644 index 0000000..4b78934 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledBinding.html @@ -0,0 +1,196 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.TupleSerialMarshalledBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.TupleSerialMarshalledBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledKeyCreator.html b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledKeyCreator.html new file mode 100644 index 0000000..c7c61c8 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/class-use/TupleSerialMarshalledKeyCreator.html @@ -0,0 +1,175 @@ + + + + + +Uses of Class com.sleepycat.bind.serial.TupleSerialMarshalledKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.serial.TupleSerialMarshalledKeyCreator

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/package-frame.html b/docs/java/com/sleepycat/bind/serial/package-frame.html new file mode 100644 index 0000000..a256087 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/package-frame.html @@ -0,0 +1,34 @@ + + + + + +com.sleepycat.bind.serial (Oracle - Berkeley DB Java Edition API) + + + + + +

    com.sleepycat.bind.serial

    + + + diff --git a/docs/java/com/sleepycat/bind/serial/package-summary.html b/docs/java/com/sleepycat/bind/serial/package-summary.html new file mode 100644 index 0000000..f584d62 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/package-summary.html @@ -0,0 +1,250 @@ + + + + + +com.sleepycat.bind.serial (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Package com.sleepycat.bind.serial

    +
    +
    Bindings that use Java serialization.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      ClassCatalog +
      A catalog of class description information for use during object + serialization.
      +
      +
    • +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      SerialBase +
      A base class for serial bindings creators that provides control over the + allocation of the output buffer.
      +
      SerialBinding<E> +
      A concrete EntryBinding that treats a key or data entry as + a serialized object.
      +
      SerialInput +
      A specialized ObjectInputStream that gets class description + information from a ClassCatalog.
      +
      SerialOutput +
      A specialized ObjectOutputStream that stores class description + information in a ClassCatalog.
      +
      SerialSerialBinding<K,D,E> +
      An abstract EntityBinding that treats an entity's key entry and + data entry as serialized objects.
      +
      SerialSerialKeyCreator<PK,D,SK> +
      A abstract key creator that uses a serial key and a serial data entry.
      +
      StoredClassCatalog +
      A ClassCatalog that is stored in a Database.
      +
      TupleSerialBinding<D,E> +
      An abstract EntityBinding that treats an entity's key entry as + a tuple and its data entry as a serialized object.
      +
      TupleSerialKeyCreator<D> +
      A abstract key creator that uses a tuple key and a serial data entry.
      +
      TupleSerialMarshalledBinding<E extends MarshalledTupleKeyEntity> +
      A concrete TupleSerialBinding that delegates to the + MarshalledTupleKeyEntity interface of the entity class.
      +
      TupleSerialMarshalledKeyCreator<D extends MarshalledTupleKeyEntity> +
      A concrete key creator that works in conjunction with a TupleSerialMarshalledBinding.
      +
      +
    • +
    + + + +

    Package com.sleepycat.bind.serial Description

    +
    Bindings that use Java serialization. +
    +
    +
    See Also:
    +
    [Getting Started Guide] +
    +
    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/package-tree.html b/docs/java/com/sleepycat/bind/serial/package-tree.html new file mode 100644 index 0000000..1826a0c --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/package-tree.html @@ -0,0 +1,197 @@ + + + + + +com.sleepycat.bind.serial Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Hierarchy For Package com.sleepycat.bind.serial

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    +
      +
    • java.lang.AutoCloseable +
        +
      • java.io.Closeable + +
      • +
      +
    • +
    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/serial/package-use.html b/docs/java/com/sleepycat/bind/serial/package-use.html new file mode 100644 index 0000000..636df17 --- /dev/null +++ b/docs/java/com/sleepycat/bind/serial/package-use.html @@ -0,0 +1,231 @@ + + + + + +Uses of Package com.sleepycat.bind.serial (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Package
    com.sleepycat.bind.serial

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/BigDecimalBinding.html b/docs/java/com/sleepycat/bind/tuple/BigDecimalBinding.html new file mode 100644 index 0000000..bcaf188 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/BigDecimalBinding.html @@ -0,0 +1,442 @@ + + + + + +BigDecimalBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class BigDecimalBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.math.BigDecimal>
      +
      +
      +
      +
      public class BigDecimalBinding
      +extends TupleBinding<java.math.BigDecimal>
      +
      A concrete TupleBinding for an unsorted BigDecimal + value. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      BigDecimal Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BigDecimalBinding

          +
          public BigDecimalBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.math.BigDecimal entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.math.BigDecimal>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.math.BigDecimal object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.math.BigDecimal>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.math.BigDecimal object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.math.BigDecimal>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToBigDecimal

          +
          public static java.math.BigDecimal entryToBigDecimal(DatabaseEntry entry)
          +
          Converts an entry buffer into a BigDecimal value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          bigDecimalToEntry

          +
          public static void bigDecimalToEntry(java.math.BigDecimal val,
          +                                     DatabaseEntry entry)
          +
          Converts a BigDecimal value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/BigIntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/BigIntegerBinding.html new file mode 100644 index 0000000..dc2929c --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/BigIntegerBinding.html @@ -0,0 +1,435 @@ + + + + + +BigIntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class BigIntegerBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.math.BigInteger>
      +
      +
      +
      +
      public class BigIntegerBinding
      +extends TupleBinding<java.math.BigInteger>
      +
      A concrete TupleBinding for a BigInteger value. + +

      This class produces byte array values that by default (without a custom + comparator) sort correctly.

      +
      +
      See Also:
      +
      Integer Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BigIntegerBinding

          +
          public BigIntegerBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.math.BigInteger entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.math.BigInteger>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.math.BigInteger object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.math.BigInteger>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.math.BigInteger object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.math.BigInteger>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToBigInteger

          +
          public static java.math.BigInteger entryToBigInteger(DatabaseEntry entry)
          +
          Converts an entry buffer into a BigInteger value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          bigIntegerToEntry

          +
          public static void bigIntegerToEntry(java.math.BigInteger val,
          +                                     DatabaseEntry entry)
          +
          Converts a BigInteger value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/BooleanBinding.html b/docs/java/com/sleepycat/bind/tuple/BooleanBinding.html new file mode 100644 index 0000000..f5161c5 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/BooleanBinding.html @@ -0,0 +1,443 @@ + + + + + +BooleanBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class BooleanBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BooleanBinding

          +
          public BooleanBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Boolean entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Boolean>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Boolean object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Boolean>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Boolean object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Boolean>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToBoolean

          +
          public static boolean entryToBoolean(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple boolean value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          booleanToEntry

          +
          public static void booleanToEntry(boolean val,
          +                                  DatabaseEntry entry)
          +
          Converts a simple boolean value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/ByteBinding.html b/docs/java/com/sleepycat/bind/tuple/ByteBinding.html new file mode 100644 index 0000000..c374605 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/ByteBinding.html @@ -0,0 +1,443 @@ + + + + + +ByteBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class ByteBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ByteBinding

          +
          public ByteBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Byte entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Byte>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Byte object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Byte>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Byte object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Byte>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToByte

          +
          public static byte entryToByte(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple byte value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          byteToEntry

          +
          public static void byteToEntry(byte val,
          +                               DatabaseEntry entry)
          +
          Converts a simple byte value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/CharacterBinding.html b/docs/java/com/sleepycat/bind/tuple/CharacterBinding.html new file mode 100644 index 0000000..3a86206 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/CharacterBinding.html @@ -0,0 +1,443 @@ + + + + + +CharacterBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class CharacterBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          CharacterBinding

          +
          public CharacterBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Character entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Character>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Character object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Character>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Character object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Character>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToChar

          +
          public static char entryToChar(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple char value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          charToEntry

          +
          public static void charToEntry(char val,
          +                               DatabaseEntry entry)
          +
          Converts a simple char value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/DoubleBinding.html b/docs/java/com/sleepycat/bind/tuple/DoubleBinding.html new file mode 100644 index 0000000..62d24d7 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/DoubleBinding.html @@ -0,0 +1,443 @@ + + + + + +DoubleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class DoubleBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DoubleBinding

          +
          public DoubleBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Double entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Double>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Double object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Double>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Double object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Double>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToDouble

          +
          public static double entryToDouble(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple double value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          doubleToEntry

          +
          public static void doubleToEntry(double val,
          +                                 DatabaseEntry entry)
          +
          Converts a simple double value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/FloatBinding.html b/docs/java/com/sleepycat/bind/tuple/FloatBinding.html new file mode 100644 index 0000000..1ae0aef --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/FloatBinding.html @@ -0,0 +1,443 @@ + + + + + +FloatBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class FloatBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          FloatBinding

          +
          public FloatBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Float entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Float>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Float object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Float>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Float object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Float>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToFloat

          +
          public static float entryToFloat(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple float value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          floatToEntry

          +
          public static void floatToEntry(float val,
          +                                DatabaseEntry entry)
          +
          Converts a simple float value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/IntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/IntegerBinding.html new file mode 100644 index 0000000..2f75ba1 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/IntegerBinding.html @@ -0,0 +1,443 @@ + + + + + +IntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class IntegerBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          IntegerBinding

          +
          public IntegerBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Integer entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Integer>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Integer object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Integer>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Integer object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Integer>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToInt

          +
          public static int entryToInt(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple int value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          intToEntry

          +
          public static void intToEntry(int val,
          +                              DatabaseEntry entry)
          +
          Converts a simple int value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/LongBinding.html b/docs/java/com/sleepycat/bind/tuple/LongBinding.html new file mode 100644 index 0000000..5c4fa8a --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/LongBinding.html @@ -0,0 +1,443 @@ + + + + + +LongBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class LongBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          LongBinding

          +
          public LongBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Long entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Long>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Long object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Long>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Long object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Long>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToLong

          +
          public static long entryToLong(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple long value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          longToEntry

          +
          public static void longToEntry(long val,
          +                               DatabaseEntry entry)
          +
          Converts a simple long value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/MarshalledTupleEntry.html b/docs/java/com/sleepycat/bind/tuple/MarshalledTupleEntry.html new file mode 100644 index 0000000..5c2b558 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/MarshalledTupleEntry.html @@ -0,0 +1,271 @@ + + + + + +MarshalledTupleEntry (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Interface MarshalledTupleEntry

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface MarshalledTupleEntry
      +
      A marshalling interface implemented by key, data or entity classes that + are represented as tuples. + +

      Key classes implement this interface to marshal their key entry. Data or + entity classes implement this interface to marshal their data entry. + Implementations of this interface must have a public no arguments + constructor so that they can be instantiated by a binding, prior to calling + the unmarshalEntry(com.sleepycat.bind.tuple.TupleInput) method.

      + +

      Note that implementing this interface is not necessary when the object is + a Java simple type, for example: String, Integer, etc. These types can be + used with built-in bindings returned by TupleBinding.getPrimitiveBinding(java.lang.Class<T>).

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      TupleTupleMarshalledBinding
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          marshalEntry

          +
          void marshalEntry(TupleOutput dataOutput)
          +
          Construct the key or data tuple entry from the key or data object.
          +
          +
          Parameters:
          +
          dataOutput - is the output tuple.
          +
          +
        • +
        + + + +
          +
        • +

          unmarshalEntry

          +
          void unmarshalEntry(TupleInput dataInput)
          +
          Construct the key or data object from the key or data tuple entry.
          +
          +
          Parameters:
          +
          dataInput - is the input tuple.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/MarshalledTupleKeyEntity.html b/docs/java/com/sleepycat/bind/tuple/MarshalledTupleKeyEntity.html new file mode 100644 index 0000000..65c9362 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/MarshalledTupleKeyEntity.html @@ -0,0 +1,331 @@ + + + + + +MarshalledTupleKeyEntity (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Interface MarshalledTupleKeyEntity

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface MarshalledTupleKeyEntity
      +
      A marshalling interface implemented by entity classes that represent keys as + tuples. Since MarshalledTupleKeyEntity objects are instantiated + using Java deserialization, no particular constructor is required by classes + that implement this interface. + +

      Note that a marshalled tuple key extractor is somewhat less efficient + than a non-marshalled key tuple extractor because more conversions are + needed. A marshalled key extractor must convert the entry to an object in + order to extract the key fields, while an unmarshalled key extractor does + not.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      TupleTupleMarshalledBinding, +TupleSerialMarshalledBinding
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          marshalPrimaryKey

          +
          void marshalPrimaryKey(TupleOutput keyOutput)
          +
          Extracts the entity's primary key and writes it to the key output.
          +
          +
          Parameters:
          +
          keyOutput - is the output tuple.
          +
          +
        • +
        + + + +
          +
        • +

          unmarshalPrimaryKey

          +
          void unmarshalPrimaryKey(TupleInput keyInput)
          +
          Completes construction of the entity by setting its primary key from the + stored primary key.
          +
          +
          Parameters:
          +
          keyInput - is the input tuple.
          +
          +
        • +
        + + + +
          +
        • +

          marshalSecondaryKey

          +
          boolean marshalSecondaryKey(java.lang.String keyName,
          +                            TupleOutput keyOutput)
          +
          Extracts the entity's secondary key and writes it to the key output.
          +
          +
          Parameters:
          +
          keyName - identifies the secondary key.
          +
          keyOutput - is the output tuple.
          +
          Returns:
          +
          true if a key was created, or false to indicate that the key is + not present.
          +
          +
        • +
        + + + +
          +
        • +

          nullifyForeignKey

          +
          boolean nullifyForeignKey(java.lang.String keyName)
          +
          Clears the entity's secondary key fields for the given key name. + +

          The specified index key should be changed by this method such that + marshalSecondaryKey(java.lang.String, com.sleepycat.bind.tuple.TupleOutput) for the same key name will return false. + Other fields in the data object should remain unchanged.

          + +

          If ForeignKeyDeleteAction.NULLIFY was + specified when opening the secondary database, this method is called + when the entity for this foreign key is deleted. If NULLIFY was not + specified, this method will not be called and may always return + false.

          +
          +
          Parameters:
          +
          keyName - identifies the secondary key.
          +
          Returns:
          +
          true if the key was cleared, or false to indicate that the key + is not present and no change is necessary.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/PackedIntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/PackedIntegerBinding.html new file mode 100644 index 0000000..3a3f36a --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/PackedIntegerBinding.html @@ -0,0 +1,445 @@ + + + + + +PackedIntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class PackedIntegerBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.lang.Integer>
      +
      +
      +
      +
      public class PackedIntegerBinding
      +extends TupleBinding<java.lang.Integer>
      +
      A concrete TupleBinding for an unsorted Integer + primitive wrapper or an unsorted int primitive, that stores the + value in the smallest number of bytes possible. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      Integer Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          PackedIntegerBinding

          +
          public PackedIntegerBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Integer entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Integer>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Integer object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Integer>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Integer object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Integer>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToInt

          +
          public static int entryToInt(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple int value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          intToEntry

          +
          public static void intToEntry(int val,
          +                              DatabaseEntry entry)
          +
          Converts a simple int value into an entry buffer, using + PackedInteger format.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/PackedLongBinding.html b/docs/java/com/sleepycat/bind/tuple/PackedLongBinding.html new file mode 100644 index 0000000..aac572a --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/PackedLongBinding.html @@ -0,0 +1,445 @@ + + + + + +PackedLongBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class PackedLongBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.lang.Long>
      +
      +
      +
      +
      public class PackedLongBinding
      +extends TupleBinding<java.lang.Long>
      +
      A concrete TupleBinding for an unsorted Long + primitive wrapper or an unsorted long primitive, that stores + the value in the smallest number of bytes possible. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      Integer Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          PackedLongBinding

          +
          public PackedLongBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Long entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Long>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Long object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Long>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Long object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Long>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToLong

          +
          public static java.lang.Long entryToLong(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple Long value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          longToEntry

          +
          public static void longToEntry(long val,
          +                               DatabaseEntry entry)
          +
          Converts a simple Long value into an entry buffer, using + PackedLong format.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/ShortBinding.html b/docs/java/com/sleepycat/bind/tuple/ShortBinding.html new file mode 100644 index 0000000..d89b517 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/ShortBinding.html @@ -0,0 +1,443 @@ + + + + + +ShortBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class ShortBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ShortBinding

          +
          public ShortBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Short entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Short>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Short object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Short>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Short object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Short>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToShort

          +
          public static short entryToShort(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple short value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          shortToEntry

          +
          public static void shortToEntry(short val,
          +                                DatabaseEntry entry)
          +
          Converts a simple short value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/SortedBigDecimalBinding.html b/docs/java/com/sleepycat/bind/tuple/SortedBigDecimalBinding.html new file mode 100644 index 0000000..56763b0 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/SortedBigDecimalBinding.html @@ -0,0 +1,442 @@ + + + + + +SortedBigDecimalBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class SortedBigDecimalBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.math.BigDecimal>
      +
      +
      +
      +
      public class SortedBigDecimalBinding
      +extends TupleBinding<java.math.BigDecimal>
      +
      A concrete TupleBinding for a sorted BigDecimal + value. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      BigDecimal Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SortedBigDecimalBinding

          +
          public SortedBigDecimalBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.math.BigDecimal entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.math.BigDecimal>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.math.BigDecimal object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.math.BigDecimal>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.math.BigDecimal object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.math.BigDecimal>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToBigDecimal

          +
          public static java.math.BigDecimal entryToBigDecimal(DatabaseEntry entry)
          +
          Converts an entry buffer into a BigDecimal value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          bigDecimalToEntry

          +
          public static void bigDecimalToEntry(java.math.BigDecimal val,
          +                                     DatabaseEntry entry)
          +
          Converts a BigDecimal value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/SortedDoubleBinding.html b/docs/java/com/sleepycat/bind/tuple/SortedDoubleBinding.html new file mode 100644 index 0000000..a3e10c3 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/SortedDoubleBinding.html @@ -0,0 +1,442 @@ + + + + + +SortedDoubleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class SortedDoubleBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.lang.Double>
      +
      +
      +
      +
      public class SortedDoubleBinding
      +extends TupleBinding<java.lang.Double>
      +
      A concrete TupleBinding for a sorted Double + primitive wrapper or a sorted double primitive. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      Floating Point Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SortedDoubleBinding

          +
          public SortedDoubleBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Double entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Double>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Double object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Double>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Double object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Double>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToDouble

          +
          public static double entryToDouble(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple double value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          doubleToEntry

          +
          public static void doubleToEntry(double val,
          +                                 DatabaseEntry entry)
          +
          Converts a simple double value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/SortedFloatBinding.html b/docs/java/com/sleepycat/bind/tuple/SortedFloatBinding.html new file mode 100644 index 0000000..2006437 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/SortedFloatBinding.html @@ -0,0 +1,442 @@ + + + + + +SortedFloatBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class SortedFloatBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.lang.Float>
      +
      +
      +
      +
      public class SortedFloatBinding
      +extends TupleBinding<java.lang.Float>
      +
      A concrete TupleBinding for a sorted Float + primitive wrapper or sorted a float primitive. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      Floating Point Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SortedFloatBinding

          +
          public SortedFloatBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Float entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Float>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Float object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Float>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Float object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Float>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToFloat

          +
          public static float entryToFloat(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple float value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          floatToEntry

          +
          public static void floatToEntry(float val,
          +                                DatabaseEntry entry)
          +
          Converts a simple float value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/SortedPackedIntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/SortedPackedIntegerBinding.html new file mode 100644 index 0000000..926e76e --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/SortedPackedIntegerBinding.html @@ -0,0 +1,445 @@ + + + + + +SortedPackedIntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class SortedPackedIntegerBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.lang.Integer>
      +
      +
      +
      +
      public class SortedPackedIntegerBinding
      +extends TupleBinding<java.lang.Integer>
      +
      A concrete TupleBinding for a sorted Integer + primitive wrapper or a sorted int primitive, that stores the + value in the smallest number of bytes possible. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      Integer Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SortedPackedIntegerBinding

          +
          public SortedPackedIntegerBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Integer entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Integer>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Integer object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Integer>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Integer object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Integer>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToInt

          +
          public static int entryToInt(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple int value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          intToEntry

          +
          public static void intToEntry(int val,
          +                              DatabaseEntry entry)
          +
          Converts a simple int value into an entry buffer, using + SortedPackedInteger format.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/SortedPackedLongBinding.html b/docs/java/com/sleepycat/bind/tuple/SortedPackedLongBinding.html new file mode 100644 index 0000000..801ca72 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/SortedPackedLongBinding.html @@ -0,0 +1,445 @@ + + + + + +SortedPackedLongBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class SortedPackedLongBinding

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<java.lang.Long>
      +
      +
      +
      +
      public class SortedPackedLongBinding
      +extends TupleBinding<java.lang.Long>
      +
      A concrete TupleBinding for a sorted Long + primitive wrapper or a sorted long primitive, that stores the + value in the smallest number of bytes possible. + +

      There are two ways to use this class:

      +
        +
      1. When using the com.sleepycat.je package directly, the static + methods in this class can be used to convert between primitive values and + DatabaseEntry objects.
      2. +
      3. When using the com.sleepycat.collections package, an instance of + this class can be used with any stored collection.
      4. +
      +
      +
      See Also:
      +
      Integer Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SortedPackedLongBinding

          +
          public SortedPackedLongBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.Long entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.Long>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.Long object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.Long>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.Long object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.Long>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToLong

          +
          public static java.lang.Long entryToLong(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple Long value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          longToEntry

          +
          public static void longToEntry(long val,
          +                               DatabaseEntry entry)
          +
          Converts a simple Long value into an entry buffer, using + SortedPackedLong format.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/StringBinding.html b/docs/java/com/sleepycat/bind/tuple/StringBinding.html new file mode 100644 index 0000000..eb7031d --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/StringBinding.html @@ -0,0 +1,442 @@ + + + + + +StringBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class StringBinding

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StringBinding

          +
          public StringBinding()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public java.lang.String entryToObject(TupleInput input)
          +
          Description copied from class: TupleBinding
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Specified by:
          +
          entryToObject in class TupleBinding<java.lang.String>
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(java.lang.String object,
          +                          TupleOutput output)
          +
          Description copied from class: TupleBinding
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Specified by:
          +
          objectToEntry in class TupleBinding<java.lang.String>
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(java.lang.String object)
          +
          Description copied from class: TupleBase
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the TupleBase.setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Overrides:
          +
          getTupleOutput in class TupleBase<java.lang.String>
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          TupleBase.setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          entryToString

          +
          public static java.lang.String entryToString(DatabaseEntry entry)
          +
          Converts an entry buffer into a simple String value.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting value.
          +
          +
        • +
        + + + +
          +
        • +

          stringToEntry

          +
          public static void stringToEntry(java.lang.String val,
          +                                 DatabaseEntry entry)
          +
          Converts a simple String value into an entry buffer.
          +
          +
          Parameters:
          +
          val - is the source value.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleBase.html b/docs/java/com/sleepycat/bind/tuple/TupleBase.html new file mode 100644 index 0000000..64d16b0 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleBase.html @@ -0,0 +1,492 @@ + + + + + +TupleBase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleBase<E>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.tuple.TupleBase<E>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Direct Known Subclasses:
      +
      TupleBinding, TupleSerialBinding, TupleSerialKeyCreator, TupleTupleBinding, TupleTupleKeyCreator
      +
      +
      +
      +
      public class TupleBase<E>
      +extends java.lang.Object
      +
      A base class for tuple bindings and tuple key creators that provides control + over the allocation of the output buffer. + +

      Tuple bindings and key creators append data to a TupleOutput + instance, which is also a FastOutputStream + instance. This object has a byte array buffer that is resized when it is + full. The reallocation of this buffer can be a performance factor for + some applications using large objects. To manage this issue, the setTupleBufferSize(int) method may be used to control the initial size of the + buffer, and the getTupleOutput(E) method may be overridden by + subclasses to take over creation of the TupleOutput object.

      +
    • +
    +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setTupleBufferSize

          +
          public void setTupleBufferSize(int byteSize)
          +
          Sets the initial byte size of the output buffer that is allocated by the + default implementation of getTupleOutput(E). + +

          If this property is zero (the default), the default FastOutputStream.DEFAULT_INIT_SIZE size is used.

          +
          +
          Parameters:
          +
          byteSize - the initial byte size of the output buffer, or zero to + use the default size.
          +
          +
        • +
        + + + +
          +
        • +

          getTupleBufferSize

          +
          public int getTupleBufferSize()
          +
          Returns the initial byte size of the output buffer.
          +
          +
          Returns:
          +
          the initial byte size of the output buffer.
          +
          See Also:
          +
          setTupleBufferSize(int)
          +
          +
        • +
        + + + + + +
          +
        • +

          getTupleOutput

          +
          protected TupleOutput getTupleOutput(E object)
          +
          Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator. + +

          The default implementation of this method creates a new TupleOutput + with an initial buffer size that can be changed using the setTupleBufferSize(int) method.

          + +

          This method may be overridden to return a TupleOutput instance. For + example, an instance per thread could be created and returned by this + method. If a TupleOutput instance is reused, be sure to call its + FastOutputStream.reset() method before each + use.

          +
          +
          Parameters:
          +
          object - is the object to be written to the tuple output, and may + be used by subclasses to determine the size of the output buffer.
          +
          Returns:
          +
          an empty TupleOutput instance.
          +
          See Also:
          +
          setTupleBufferSize(int)
          +
          +
        • +
        + + + +
          +
        • +

          outputToEntry

          +
          public static void outputToEntry(TupleOutput output,
          +                                 DatabaseEntry entry)
          +
          Utility method to set the data in a entry buffer to the data in a tuple + output object.
          +
          +
          Parameters:
          +
          output - is the source tuple output object.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        + + + +
          +
        • +

          inputToEntry

          +
          public static void inputToEntry(TupleInput input,
          +                                DatabaseEntry entry)
          +
          Utility method to set the data in a entry buffer to the data in a tuple + input object.
          +
          +
          Parameters:
          +
          input - is the source tuple input object.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        + + + +
          +
        • +

          entryToInput

          +
          public static TupleInput entryToInput(DatabaseEntry entry)
          +
          Utility method to create a new tuple input object for reading the data + from a given buffer. If an existing input is reused, it is reset before + returning it.
          +
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the new tuple input object.
          +
          +
        • +
        + + + +
          +
        • +

          newOutput

          +
          public static TupleOutput newOutput()
          +
          Deprecated. replaced by getTupleOutput(E)
          +
          Utility method for use by bindings to create a tuple output object.
          +
          +
          Returns:
          +
          a new tuple output object.
          +
          +
        • +
        + + + +
          +
        • +

          newOutput

          +
          public static TupleOutput newOutput(byte[] buffer)
          +
          Deprecated. replaced by getTupleOutput(E)
          +
          Utility method for use by bindings to create a tuple output object + with a specific starting size.
          +
          +
          Parameters:
          +
          buffer - is the byte array to use as the buffer.
          +
          Returns:
          +
          a new tuple output object.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleBinding.html b/docs/java/com/sleepycat/bind/tuple/TupleBinding.html new file mode 100644 index 0000000..fca5a86 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleBinding.html @@ -0,0 +1,450 @@ + + + + + +TupleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleBinding<E>

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleBinding

          +
          public TupleBinding()
          +
          Creates a tuple binding.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public E entryToObject(DatabaseEntry entry)
          +
          Description copied from interface: EntryBinding
          +
          Converts a entry buffer into an Object.
          +
          +
          Specified by:
          +
          entryToObject in interface EntryBinding<E>
          +
          Parameters:
          +
          entry - is the source entry buffer.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToEntry

          +
          public void objectToEntry(E object,
          +                          DatabaseEntry entry)
          +
          Description copied from interface: EntryBinding
          +
          Converts an Object into a entry buffer.
          +
          +
          Specified by:
          +
          objectToEntry in interface EntryBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          entry - is the destination entry buffer.
          +
          +
        • +
        + + + +
          +
        • +

          entryToObject

          +
          public abstract E entryToObject(TupleInput input)
          +
          Constructs a key or data object from a TupleInput entry.
          +
          +
          Parameters:
          +
          input - is the tuple key or data entry.
          +
          Returns:
          +
          the key or data object constructed from the entry.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToEntry

          +
          public abstract void objectToEntry(E object,
          +                                   TupleOutput output)
          +
          Converts a key or data object to a tuple entry.
          +
          +
          Parameters:
          +
          object - is the key or data object.
          +
          output - is the tuple entry to which the key or data should be + written.
          +
          +
        • +
        + + + +
          +
        • +

          getPrimitiveBinding

          +
          public static <T> TupleBinding<T> getPrimitiveBinding(java.lang.Class<T> cls)
          +
          Creates a tuple binding for a primitive Java class. The following + Java classes are supported. +
            +
          • String
          • +
          • Character
          • +
          • Boolean
          • +
          • Byte
          • +
          • Short
          • +
          • Integer
          • +
          • Long
          • +
          • Float
          • +
          • Double
          • +
          + +

          Note: getPrimitiveBinding(java.lang.Class<T>) returns bindings that do + not sort negative floating point numbers correctly by default. See + SortedFloatBinding and SortedDoubleBinding for + details.

          +
          +
          Type Parameters:
          +
          T - the primitive Java class.
          +
          Parameters:
          +
          cls - the primitive Java class.
          +
          Returns:
          +
          a new binding for the primitive class or null if the cls + parameter is not one of the supported classes.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleInput.html b/docs/java/com/sleepycat/bind/tuple/TupleInput.html new file mode 100644 index 0000000..4ee5d0f --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleInput.html @@ -0,0 +1,1303 @@ + + + + + +TupleInput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleInput

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Closeable, java.lang.AutoCloseable
      +
      +
      +
      +
      public class TupleInput
      +extends FastInputStream
      +
      An InputStream with DataInput-like methods for + reading tuple fields. It is used by TupleBinding. + +

      This class has many methods that have the same signatures as methods in + the DataInput interface. The reason this class does not + implement DataInput is because it would break the interface + contract for those methods because of data format differences.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Tuple Formats
      +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + + + + +
        Constructors 
        Constructor and Description
        TupleInput(byte[] buffer) +
        Creates a tuple input object for reading a byte array of tuple data.
        +
        TupleInput(byte[] buffer, + int offset, + int length) +
        Creates a tuple input object for reading a byte array of tuple data at + a given offset for a given length.
        +
        TupleInput(TupleOutput output) +
        Creates a tuple input object from the data contained in a tuple output + object.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        intgetBigDecimalByteLength() +
        Returns the byte length of an unsorted BigDecimal.
        +
        intgetBigIntegerByteLength() +
        Returns the byte length of a BigInteger.
        +
        intgetPackedIntByteLength() +
        Returns the byte length of a packed integer.
        +
        intgetPackedLongByteLength() +
        Returns the byte length of a packed long integer.
        +
        intgetSortedBigDecimalByteLength() +
        Returns the byte length of a sorted BigDecimal.
        +
        intgetSortedPackedIntByteLength() +
        Returns the byte length of a sorted packed integer.
        +
        intgetSortedPackedLongByteLength() +
        Returns the byte length of a sorted packed long integer.
        +
        intgetStringByteLength() +
        Returns the byte length of a null-terminated UTF string in the data + buffer, including the terminator.
        +
        java.math.BigDecimalreadBigDecimal() +
        Reads an unsorted BigDecimal.
        +
        java.math.BigIntegerreadBigInteger() +
        Reads a BigInteger.
        +
        booleanreadBoolean() +
        Reads a boolean (one byte) unsigned value from the buffer and returns + true if it is non-zero and false if it is zero.
        +
        bytereadByte() +
        Reads a signed byte (one byte) value from the buffer.
        +
        voidreadBytes(char[] chars) +
        Reads the specified number of bytes from the buffer, converting each + unsigned byte value to a character of the resulting array.
        +
        java.lang.StringreadBytes(int length) +
        Reads the specified number of bytes from the buffer, converting each + unsigned byte value to a character of the resulting string.
        +
        charreadChar() +
        Reads a char (two byte) unsigned value from the buffer.
        +
        voidreadChars(char[] chars) +
        Reads the specified number of characters from the buffer, converting + each two byte unsigned value to a character of the resulting array.
        +
        java.lang.StringreadChars(int length) +
        Reads the specified number of characters from the buffer, converting + each two byte unsigned value to a character of the resulting string.
        +
        doublereadDouble() +
        Reads an unsorted double (eight byte) value from the buffer.
        +
        floatreadFloat() +
        Reads an unsorted float (four byte) value from the buffer.
        +
        intreadInt() +
        Reads a signed int (four byte) value from the buffer.
        +
        longreadLong() +
        Reads a signed long (eight byte) value from the buffer.
        +
        intreadPackedInt() +
        Reads an unsorted packed integer.
        +
        longreadPackedLong() +
        Reads an unsorted packed long integer.
        +
        shortreadShort() +
        Reads a signed short (two byte) value from the buffer.
        +
        java.math.BigDecimalreadSortedBigDecimal() +
        Reads a sorted BigDecimal, with support for correct default + sorting.
        +
        doublereadSortedDouble() +
        Reads a sorted double (eight byte) value from the buffer.
        +
        floatreadSortedFloat() +
        Reads a sorted float (four byte) value from the buffer.
        +
        intreadSortedPackedInt() +
        Reads a sorted packed integer.
        +
        longreadSortedPackedLong() +
        Reads a sorted packed long integer.
        +
        java.lang.StringreadString() +
        Reads a null-terminated UTF string from the data buffer and converts + the data from UTF to Unicode.
        +
        voidreadString(char[] chars) +
        Reads the specified number of UTF characters string from the data + buffer and converts the data from UTF to Unicode.
        +
        java.lang.StringreadString(int length) +
        Reads the specified number of UTF characters string from the data + buffer and converts the data from UTF to Unicode.
        +
        intreadUnsignedByte() +
        Reads an unsigned byte (one byte) value from the buffer.
        +
        longreadUnsignedInt() +
        Reads an unsigned int (four byte) value from the buffer.
        +
        intreadUnsignedShort() +
        Reads an unsigned short (two byte) value from the buffer.
        +
        + +
          +
        • + + +

          Methods inherited from class java.io.InputStream

          +close
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleInput

          +
          public TupleInput(byte[] buffer)
          +
          Creates a tuple input object for reading a byte array of tuple data. A + reference to the byte array will be kept by this object (it will not be + copied) and therefore the byte array should not be modified while this + object is in use.
          +
          +
          Parameters:
          +
          buffer - is the byte array to be read and should contain data in + tuple format.
          +
          +
        • +
        + + + +
          +
        • +

          TupleInput

          +
          public TupleInput(byte[] buffer,
          +                  int offset,
          +                  int length)
          +
          Creates a tuple input object for reading a byte array of tuple data at + a given offset for a given length. A reference to the byte array will + be kept by this object (it will not be copied) and therefore the byte + array should not be modified while this object is in use.
          +
          +
          Parameters:
          +
          buffer - is the byte array to be read and should contain data in + tuple format.
          +
          offset - is the byte offset at which to begin reading.
          +
          length - is the number of bytes to be read.
          +
          +
        • +
        + + + +
          +
        • +

          TupleInput

          +
          public TupleInput(TupleOutput output)
          +
          Creates a tuple input object from the data contained in a tuple output + object. A reference to the tuple output's byte array will be kept by + this object (it will not be copied) and therefore the tuple output + object should not be modified while this object is in use.
          +
          +
          Parameters:
          +
          output - is the tuple output object containing the data to be read.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          readString

          +
          public final java.lang.String readString()
          +                                  throws java.lang.IndexOutOfBoundsException,
          +                                         java.lang.IllegalArgumentException
          +
          Reads a null-terminated UTF string from the data buffer and converts + the data from UTF to Unicode. + Reads values that were written using TupleOutput.writeString(String).
          +
          +
          Returns:
          +
          the converted string.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if no null terminating byte is found + in the buffer.
          +
          java.lang.IllegalArgumentException - malformed UTF data is encountered.
          +
          See Also:
          +
          String Formats
          +
          +
        • +
        + + + +
          +
        • +

          readChar

          +
          public final char readChar()
          +                    throws java.lang.IndexOutOfBoundsException
          +
          Reads a char (two byte) unsigned value from the buffer. + Reads values that were written using TupleOutput.writeChar(int).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readBoolean

          +
          public final boolean readBoolean()
          +                          throws java.lang.IndexOutOfBoundsException
          +
          Reads a boolean (one byte) unsigned value from the buffer and returns + true if it is non-zero and false if it is zero. + Reads values that were written using TupleOutput.writeBoolean(boolean).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readByte

          +
          public final byte readByte()
          +                    throws java.lang.IndexOutOfBoundsException
          +
          Reads a signed byte (one byte) value from the buffer. + Reads values that were written using TupleOutput.writeByte(int).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readShort

          +
          public final short readShort()
          +                      throws java.lang.IndexOutOfBoundsException
          +
          Reads a signed short (two byte) value from the buffer. + Reads values that were written using TupleOutput.writeShort(int).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readInt

          +
          public final int readInt()
          +                  throws java.lang.IndexOutOfBoundsException
          +
          Reads a signed int (four byte) value from the buffer. + Reads values that were written using TupleOutput.writeInt(int).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readLong

          +
          public final long readLong()
          +                    throws java.lang.IndexOutOfBoundsException
          +
          Reads a signed long (eight byte) value from the buffer. + Reads values that were written using TupleOutput.writeLong(long).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readFloat

          +
          public final float readFloat()
          +                      throws java.lang.IndexOutOfBoundsException
          +
          Reads an unsorted float (four byte) value from the buffer. + Reads values that were written using TupleOutput.writeFloat(float).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          readDouble

          +
          public final double readDouble()
          +                        throws java.lang.IndexOutOfBoundsException
          +
          Reads an unsorted double (eight byte) value from the buffer. + Reads values that were written using TupleOutput.writeDouble(double).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          readSortedFloat

          +
          public final float readSortedFloat()
          +                            throws java.lang.IndexOutOfBoundsException
          +
          Reads a sorted float (four byte) value from the buffer. + Reads values that were written using TupleOutput.writeSortedFloat(float).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          readSortedDouble

          +
          public final double readSortedDouble()
          +                              throws java.lang.IndexOutOfBoundsException
          +
          Reads a sorted double (eight byte) value from the buffer. + Reads values that were written using TupleOutput.writeSortedDouble(double).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          readUnsignedByte

          +
          public final int readUnsignedByte()
          +                           throws java.lang.IndexOutOfBoundsException
          +
          Reads an unsigned byte (one byte) value from the buffer. + Reads values that were written using TupleOutput.writeUnsignedByte(int).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readUnsignedShort

          +
          public final int readUnsignedShort()
          +                            throws java.lang.IndexOutOfBoundsException
          +
          Reads an unsigned short (two byte) value from the buffer. + Reads values that were written using TupleOutput.writeUnsignedShort(int).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readUnsignedInt

          +
          public final long readUnsignedInt()
          +                           throws java.lang.IndexOutOfBoundsException
          +
          Reads an unsigned int (four byte) value from the buffer. + Reads values that were written using TupleOutput.writeUnsignedInt(long).
          +
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readBytes

          +
          public final java.lang.String readBytes(int length)
          +                                 throws java.lang.IndexOutOfBoundsException
          +
          Reads the specified number of bytes from the buffer, converting each + unsigned byte value to a character of the resulting string. + Reads values that were written using TupleOutput.writeBytes(java.lang.String).
          +
          +
          Parameters:
          +
          length - is the number of bytes to be read.
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readChars

          +
          public final java.lang.String readChars(int length)
          +                                 throws java.lang.IndexOutOfBoundsException
          +
          Reads the specified number of characters from the buffer, converting + each two byte unsigned value to a character of the resulting string. + Reads values that were written using TupleOutput.writeChars(java.lang.String).
          +
          +
          Parameters:
          +
          length - is the number of characters to be read.
          +
          Returns:
          +
          the value read from the buffer.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readBytes

          +
          public final void readBytes(char[] chars)
          +                     throws java.lang.IndexOutOfBoundsException
          +
          Reads the specified number of bytes from the buffer, converting each + unsigned byte value to a character of the resulting array. + Reads values that were written using TupleOutput.writeBytes(java.lang.String).
          +
          +
          Parameters:
          +
          chars - is the array to receive the data and whose length is used + to determine the number of bytes to be read.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readChars

          +
          public final void readChars(char[] chars)
          +                     throws java.lang.IndexOutOfBoundsException
          +
          Reads the specified number of characters from the buffer, converting + each two byte unsigned value to a character of the resulting array. + Reads values that were written using TupleOutput.writeChars(java.lang.String).
          +
          +
          Parameters:
          +
          chars - is the array to receive the data and whose length is used + to determine the number of characters to be read.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if not enough bytes are available in + the buffer.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readString

          +
          public final java.lang.String readString(int length)
          +                                  throws java.lang.IndexOutOfBoundsException,
          +                                         java.lang.IllegalArgumentException
          +
          Reads the specified number of UTF characters string from the data + buffer and converts the data from UTF to Unicode. + Reads values that were written using TupleOutput.writeString(char[]).
          +
          +
          Parameters:
          +
          length - is the number of characters to be read.
          +
          Returns:
          +
          the converted string.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if no null terminating byte is found + in the buffer.
          +
          java.lang.IllegalArgumentException - malformed UTF data is encountered.
          +
          See Also:
          +
          String Formats
          +
          +
        • +
        + + + +
          +
        • +

          readString

          +
          public final void readString(char[] chars)
          +                      throws java.lang.IndexOutOfBoundsException,
          +                             java.lang.IllegalArgumentException
          +
          Reads the specified number of UTF characters string from the data + buffer and converts the data from UTF to Unicode. + Reads values that were written using TupleOutput.writeString(char[]).
          +
          +
          Parameters:
          +
          chars - is the array to receive the data and whose length is used + to determine the number of characters to be read.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if no null terminating byte is found + in the buffer.
          +
          java.lang.IllegalArgumentException - malformed UTF data is encountered.
          +
          See Also:
          +
          String Formats
          +
          +
        • +
        + + + +
          +
        • +

          getStringByteLength

          +
          public final int getStringByteLength()
          +                              throws java.lang.IndexOutOfBoundsException,
          +                                     java.lang.IllegalArgumentException
          +
          Returns the byte length of a null-terminated UTF string in the data + buffer, including the terminator. Used with string values that were + written using TupleOutput.writeString(String).
          +
          +
          Returns:
          +
          the byte length.
          +
          Throws:
          +
          java.lang.IndexOutOfBoundsException - if no null terminating byte is found + in the buffer.
          +
          java.lang.IllegalArgumentException - malformed UTF data is encountered.
          +
          See Also:
          +
          String Formats
          +
          +
        • +
        + + + +
          +
        • +

          readPackedInt

          +
          public final int readPackedInt()
          +
          Reads an unsorted packed integer.
          +
          +
          Returns:
          +
          the int value.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          getPackedIntByteLength

          +
          public final int getPackedIntByteLength()
          +
          Returns the byte length of a packed integer.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readPackedLong

          +
          public final long readPackedLong()
          +
          Reads an unsorted packed long integer.
          +
          +
          Returns:
          +
          the long value.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          getPackedLongByteLength

          +
          public final int getPackedLongByteLength()
          +
          Returns the byte length of a packed long integer.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readSortedPackedInt

          +
          public final int readSortedPackedInt()
          +
          Reads a sorted packed integer.
          +
          +
          Returns:
          +
          the int value.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          getSortedPackedIntByteLength

          +
          public final int getSortedPackedIntByteLength()
          +
          Returns the byte length of a sorted packed integer.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readSortedPackedLong

          +
          public final long readSortedPackedLong()
          +
          Reads a sorted packed long integer.
          +
          +
          Returns:
          +
          the long value.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          getSortedPackedLongByteLength

          +
          public final int getSortedPackedLongByteLength()
          +
          Returns the byte length of a sorted packed long integer.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readBigInteger

          +
          public final java.math.BigInteger readBigInteger()
          +
          Reads a BigInteger.
          +
          +
          Returns:
          +
          the non-null BigInteger value.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          getBigIntegerByteLength

          +
          public final int getBigIntegerByteLength()
          +
          Returns the byte length of a BigInteger.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          readBigDecimal

          +
          public final java.math.BigDecimal readBigDecimal()
          +
          Reads an unsorted BigDecimal.
          +
          +
          Returns:
          +
          the non-null BigDecimal value.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        + + + +
          +
        • +

          getBigDecimalByteLength

          +
          public final int getBigDecimalByteLength()
          +
          Returns the byte length of an unsorted BigDecimal.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        + + + +
          +
        • +

          readSortedBigDecimal

          +
          public final java.math.BigDecimal readSortedBigDecimal()
          +
          Reads a sorted BigDecimal, with support for correct default + sorting.
          +
          +
          Returns:
          +
          the non-null BigDecimal value.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        + + + +
          +
        • +

          getSortedBigDecimalByteLength

          +
          public final int getSortedBigDecimalByteLength()
          +
          Returns the byte length of a sorted BigDecimal.
          +
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleInputBinding.html b/docs/java/com/sleepycat/bind/tuple/TupleInputBinding.html new file mode 100644 index 0000000..2d0b91b --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleInputBinding.html @@ -0,0 +1,332 @@ + + + + + +TupleInputBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleInputBinding

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.bind.tuple.TupleInputBinding
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<TupleInput>
      +
      +
      +
      +
      public class TupleInputBinding
      +extends java.lang.Object
      +implements EntryBinding<TupleInput>
      +
      A concrete EntryBinding that uses the TupleInput + object as the key or data object. + + A concrete tuple binding for key or data entries which are TupleInput objects. This binding is used when tuples themselves are the + objects, rather than using application defined objects. A TupleInput + must always be used. To convert a TupleOutput to a TupleInput, use the TupleInput.TupleInput(TupleOutput) constructor.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleInputBinding

          +
          public TupleInputBinding()
          +
          Creates a tuple input binding.
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleMarshalledBinding.html b/docs/java/com/sleepycat/bind/tuple/TupleMarshalledBinding.html new file mode 100644 index 0000000..a3c4817 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleMarshalledBinding.html @@ -0,0 +1,365 @@ + + + + + +TupleMarshalledBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleMarshalledBinding<E extends MarshalledTupleEntry>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntryBinding<E>
      +
      +
      +
      +
      public class TupleMarshalledBinding<E extends MarshalledTupleEntry>
      +extends TupleBinding<E>
      +
      A concrete TupleBinding that delegates to the + MarshalledTupleEntry interface of the data or key object. + +

      This class works by calling the methods of the MarshalledTupleEntry interface, which must be implemented by the key or + data class, to convert between the key or data entry and the object.

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleMarshalledBinding

          +
          public TupleMarshalledBinding(java.lang.Class<E> cls)
          +
          Creates a tuple marshalled binding object. + +

          The given class is used to instantiate key or data objects using + Class.newInstance(), and therefore must be a public class and have + a public no-arguments constructor. It must also implement the MarshalledTupleEntry interface.

          +
          +
          Parameters:
          +
          cls - is the class of the key or data objects.
          +
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleOutput.html b/docs/java/com/sleepycat/bind/tuple/TupleOutput.html new file mode 100644 index 0000000..6c69171 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleOutput.html @@ -0,0 +1,1110 @@ + + + + + +TupleOutput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleOutput

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable
      +
      +
      +
      +
      public class TupleOutput
      +extends FastOutputStream
      +
      An OutputStream with DataOutput-like methods for + writing tuple fields. It is used by TupleBinding. + +

      This class has many methods that have the same signatures as methods in + the DataOutput interface. The reason this class does not + implement DataOutput is because it would break the interface + contract for those methods because of data format differences.

      +
      +
      Author:
      +
      Mark Hayes
      +
      See Also:
      +
      Tuple Formats
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleOutput

          +
          public TupleOutput()
          +
          Creates a tuple output object for writing a byte array of tuple data.
          +
        • +
        + + + +
          +
        • +

          TupleOutput

          +
          public TupleOutput(byte[] buffer)
          +
          Creates a tuple output object for writing a byte array of tuple data, + using a given buffer. A new buffer will be allocated only if the number + of bytes needed is greater than the length of this buffer. A reference + to the byte array will be kept by this object and therefore the byte + array should not be modified while this object is in use.
          +
          +
          Parameters:
          +
          buffer - is the byte array to use as the buffer.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          writeBytes

          +
          public final TupleOutput writeBytes(java.lang.String val)
          +
          Writes the specified bytes to the buffer, converting each character to + an unsigned byte value. + Writes values that can be read using TupleInput.readBytes(int).
          +
          +
          Parameters:
          +
          val - is the string containing the values to be written. + Only characters with values below 0x100 may be written using this + method, since the high-order 8 bits of all characters are discarded.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if the val parameter is null.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeChars

          +
          public final TupleOutput writeChars(java.lang.String val)
          +
          Writes the specified characters to the buffer, converting each character + to a two byte unsigned value. + Writes values that can be read using TupleInput.readChars(int).
          +
          +
          Parameters:
          +
          val - is the string containing the characters to be written.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if the val parameter is null.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeString

          +
          public final TupleOutput writeString(java.lang.String val)
          +
          Writes the specified characters to the buffer, converting each character + to UTF format, and adding a null terminator byte. + Writes values that can be read using TupleInput.readString().
          +
          +
          Parameters:
          +
          val - is the string containing the characters to be written.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          String Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeChar

          +
          public final TupleOutput writeChar(int val)
          +
          Writes a char (two byte) unsigned value to the buffer. + Writes values that can be read using TupleInput.readChar().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeBoolean

          +
          public final TupleOutput writeBoolean(boolean val)
          +
          Writes a boolean (one byte) unsigned value to the buffer, writing one + if the value is true and zero if it is false. + Writes values that can be read using TupleInput.readBoolean().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeByte

          +
          public final TupleOutput writeByte(int val)
          +
          Writes an signed byte (one byte) value to the buffer. + Writes values that can be read using TupleInput.readByte().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeShort

          +
          public final TupleOutput writeShort(int val)
          +
          Writes an signed short (two byte) value to the buffer. + Writes values that can be read using TupleInput.readShort().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeInt

          +
          public final TupleOutput writeInt(int val)
          +
          Writes an signed int (four byte) value to the buffer. + Writes values that can be read using TupleInput.readInt().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeLong

          +
          public final TupleOutput writeLong(long val)
          +
          Writes an signed long (eight byte) value to the buffer. + Writes values that can be read using TupleInput.readLong().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeFloat

          +
          public final TupleOutput writeFloat(float val)
          +
          Writes an unsorted float (four byte) value to the buffer. + Writes values that can be read using TupleInput.readFloat().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeDouble

          +
          public final TupleOutput writeDouble(double val)
          +
          Writes an unsorted double (eight byte) value to the buffer. + Writes values that can be read using TupleInput.readDouble().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeSortedFloat

          +
          public final TupleOutput writeSortedFloat(float val)
          +
          Writes a sorted float (four byte) value to the buffer. + Writes values that can be read using TupleInput.readSortedFloat().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeSortedDouble

          +
          public final TupleOutput writeSortedDouble(double val)
          +
          Writes a sorted double (eight byte) value to the buffer. + Writes values that can be read using TupleInput.readSortedDouble().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Floating Point + Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeBytes

          +
          public final TupleOutput writeBytes(char[] chars)
          +
          Writes the specified bytes to the buffer, converting each character to + an unsigned byte value. + Writes values that can be read using TupleInput.readBytes(int).
          +
          +
          Parameters:
          +
          chars - is the array of values to be written. + Only characters with values below 0x100 may be written using this + method, since the high-order 8 bits of all characters are discarded.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if the chars parameter is null.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeChars

          +
          public final TupleOutput writeChars(char[] chars)
          +
          Writes the specified characters to the buffer, converting each character + to a two byte unsigned value. + Writes values that can be read using TupleInput.readChars(int).
          +
          +
          Parameters:
          +
          chars - is the array of characters to be written.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if the chars parameter is null.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeString

          +
          public final TupleOutput writeString(char[] chars)
          +
          Writes the specified characters to the buffer, converting each character + to UTF format. + Writes values that can be read using TupleInput.readString(int) + or TupleInput.readString(char[]).
          +
          +
          Parameters:
          +
          chars - is the array of characters to be written.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if the chars parameter is null.
          +
          See Also:
          +
          String Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeUnsignedByte

          +
          public final TupleOutput writeUnsignedByte(int val)
          +
          Writes an unsigned byte (one byte) value to the buffer. + Writes values that can be read using TupleInput.readUnsignedByte().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeUnsignedShort

          +
          public final TupleOutput writeUnsignedShort(int val)
          +
          Writes an unsigned short (two byte) value to the buffer. + Writes values that can be read using TupleInput.readUnsignedShort().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeUnsignedInt

          +
          public final TupleOutput writeUnsignedInt(long val)
          +
          Writes an unsigned int (four byte) value to the buffer. + Writes values that can be read using TupleInput.readUnsignedInt().
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writePackedInt

          +
          public final TupleOutput writePackedInt(int val)
          +
          Writes an unsorted packed integer.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writePackedLong

          +
          public final TupleOutput writePackedLong(long val)
          +
          Writes an unsorted packed long integer.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeSortedPackedInt

          +
          public final TupleOutput writeSortedPackedInt(int val)
          +
          Writes a sorted packed integer.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeSortedPackedLong

          +
          public final TupleOutput writeSortedPackedLong(long val)
          +
          Writes a sorted packed long integer.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeBigInteger

          +
          public final TupleOutput writeBigInteger(java.math.BigInteger val)
          +
          Writes a BigInteger.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if val is null.
          +
          java.lang.IllegalArgumentException - if the byte array representation of val + is larger than 0x7fff bytes.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          getBigIntegerByteLength

          +
          public static int getBigIntegerByteLength(java.math.BigInteger val)
          +
          Returns the exact byte length that would would be output for a given + BigInteger value if writeBigInteger(java.math.BigInteger) were + called.
          +
          +
          Parameters:
          +
          val - the BigInteger
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          Integer Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeBigDecimal

          +
          public final TupleOutput writeBigDecimal(java.math.BigDecimal val)
          +
          Writes an unsorted BigDecimal.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          Throws:
          +
          java.lang.NullPointerException - if val is null.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        + + + +
          +
        • +

          getBigDecimalMaxByteLength

          +
          public static int getBigDecimalMaxByteLength(java.math.BigDecimal val)
          +
          Returns the maximum byte length that would be output for a given BigDecimal value if writeBigDecimal(java.math.BigDecimal) were called.
          +
          +
          Parameters:
          +
          val - the BigDecimal.
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        + + + +
          +
        • +

          writeSortedBigDecimal

          +
          public final TupleOutput writeSortedBigDecimal(java.math.BigDecimal val)
          +
          Writes a sorted BigDecimal.
          +
          +
          Parameters:
          +
          val - is the value to write to the buffer.
          +
          Returns:
          +
          this tuple output object.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        + + + +
          +
        • +

          getSortedBigDecimalMaxByteLength

          +
          public static int getSortedBigDecimalMaxByteLength(java.math.BigDecimal val)
          +
          Returns the maximum byte length that would be output for a given BigDecimal value if writeSortedBigDecimal(java.math.BigDecimal) were + called.
          +
          +
          Parameters:
          +
          val - the BigDecimal.
          +
          Returns:
          +
          the byte length.
          +
          See Also:
          +
          BigDecimal + Formats
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleTupleBinding.html b/docs/java/com/sleepycat/bind/tuple/TupleTupleBinding.html new file mode 100644 index 0000000..27300a5 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleTupleBinding.html @@ -0,0 +1,465 @@ + + + + + +TupleTupleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleTupleBinding<E>

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleTupleBinding

          +
          public TupleTupleBinding()
          +
          Creates a tuple-tuple entity binding.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          entryToObject

          +
          public E entryToObject(DatabaseEntry key,
          +                       DatabaseEntry data)
          +
          Description copied from interface: EntityBinding
          +
          Converts key and data entry buffers into an entity Object.
          +
          +
          Specified by:
          +
          entryToObject in interface EntityBinding<E>
          +
          Parameters:
          +
          key - is the source key entry.
          +
          data - is the source data entry.
          +
          Returns:
          +
          the resulting Object.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          public void objectToKey(E object,
          +                        DatabaseEntry key)
          +
          Description copied from interface: EntityBinding
          +
          Extracts the key entry from an entity Object.
          +
          +
          Specified by:
          +
          objectToKey in interface EntityBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          key - is the destination entry buffer.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          public void objectToData(E object,
          +                         DatabaseEntry data)
          +
          Description copied from interface: EntityBinding
          +
          Extracts the data entry from an entity Object.
          +
          +
          Specified by:
          +
          objectToData in interface EntityBinding<E>
          +
          Parameters:
          +
          object - is the source Object.
          +
          data - is the destination entry buffer.
          +
          +
        • +
        + + + +
          +
        • +

          entryToObject

          +
          public abstract E entryToObject(TupleInput keyInput,
          +                                TupleInput dataInput)
          +
          Constructs an entity object from TupleInput key and data + entries.
          +
          +
          Parameters:
          +
          keyInput - is the TupleInput key entry object.
          +
          dataInput - is the TupleInput data entry object.
          +
          Returns:
          +
          the entity object constructed from the key and data.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToKey

          +
          public abstract void objectToKey(E object,
          +                                 TupleOutput output)
          +
          Extracts a key tuple from an entity object.
          +
          +
          Parameters:
          +
          object - is the entity object.
          +
          output - is the TupleOutput to which the key should be + written.
          +
          +
        • +
        + + + + + +
          +
        • +

          objectToData

          +
          public abstract void objectToData(E object,
          +                                  TupleOutput output)
          +
          Extracts a key tuple from an entity object.
          +
          +
          Parameters:
          +
          object - is the entity object.
          +
          output - is the TupleOutput to which the data should be + written.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleTupleKeyCreator.html b/docs/java/com/sleepycat/bind/tuple/TupleTupleKeyCreator.html new file mode 100644 index 0000000..62034da --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleTupleKeyCreator.html @@ -0,0 +1,464 @@ + + + + + +TupleTupleKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleTupleKeyCreator<E>

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleTupleKeyCreator

          +
          public TupleTupleKeyCreator()
          +
          Creates a tuple-tuple key creator.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          createSecondaryKey

          +
          public boolean createSecondaryKey(SecondaryDatabase db,
          +                                  DatabaseEntry primaryKeyEntry,
          +                                  DatabaseEntry dataEntry,
          +                                  DatabaseEntry indexKeyEntry)
          +
          Description copied from interface: SecondaryKeyCreator
          +
          Creates a secondary key entry, given a primary key and data entry. + +

          A secondary key may be derived from the primary key, primary data, or + a combination of the primary key and data. For secondary keys that are + optional, the key creator method may return false and the key/data pair + will not be indexed. To ensure the integrity of a secondary database + the key creator method must always return the same result for a given + set of input parameters.

          + +

          A RuntimeException may be thrown by this method if an error + occurs attempting to create the secondary key. This exception will be + thrown by the API method currently in progress, for example, a put method. However, this will cause the write operation + to be incomplete. When databases are not configured to be + transactional, caution should be used to avoid integrity problems. See + Special considerations for + using Secondary Databases with and without Transactions.

          +
          +
          Specified by:
          +
          createSecondaryKey in interface SecondaryKeyCreator
          +
          Parameters:
          +
          db - the database to which the secondary key will be + added. This parameter is passed for informational purposes but is not + commonly used. This parameter is always non-null.
          +
          primaryKeyEntry - the primary key entry. This parameter must not be modified + by this method. This parameter is always non-null.
          +
          dataEntry - the primary data entry. This parameter must not be modified + by this method. If SecondaryConfig#setExtractFromPrimaryKeyOnly + is configured as true, the data param may be either null + or non-null, and the implementation is expected to ignore it; otherwise, + this parameter is always non-null.
          +
          indexKeyEntry - the secondary key created by this method. This parameter + is always non-null.
          +
          Returns:
          +
          true if a key was created, or false to indicate that the key is + not present.
          +
          +
        • +
        + + + +
          +
        • +

          nullifyForeignKey

          +
          public boolean nullifyForeignKey(SecondaryDatabase db,
          +                                 DatabaseEntry dataEntry)
          +
          Description copied from interface: ForeignKeyNullifier
          +
          Sets the foreign key reference to null in the datum of the primary + database.
          +
          +
          Specified by:
          +
          nullifyForeignKey in interface ForeignKeyNullifier
          +
          Parameters:
          +
          db - the database in which the foreign key integrity + constraint is defined. This parameter is passed for informational + purposes but is not commonly used.
          +
          dataEntry - the existing primary datum in which the foreign key + reference should be set to null. This parameter should be updated by + this method if it returns true.
          +
          Returns:
          +
          true if the datum was modified, or false to indicate that the + key is not present.
          +
          +
        • +
        + + + +
          +
        • +

          createSecondaryKey

          +
          public abstract boolean createSecondaryKey(TupleInput primaryKeyInput,
          +                                           TupleInput dataInput,
          +                                           TupleOutput indexKeyOutput)
          +
          Creates the index key from primary key tuple and data tuple.
          +
          +
          Parameters:
          +
          primaryKeyInput - is the TupleInput for the primary key + entry.
          +
          dataInput - is the TupleInput for the data entry.
          +
          indexKeyOutput - is the destination index key tuple.
          +
          Returns:
          +
          true if a key was created, or false to indicate that the key is + not present.
          +
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledBinding.html b/docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledBinding.html new file mode 100644 index 0000000..9516d60 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledBinding.html @@ -0,0 +1,403 @@ + + + + + +TupleTupleMarshalledBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleTupleMarshalledBinding<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      EntityBinding<E>
      +
      +
      +
      +
      public class TupleTupleMarshalledBinding<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity>
      +extends TupleTupleBinding<E>
      +
      A concrete TupleTupleBinding that delegates to the + MarshalledTupleEntry and + MarshalledTupleKeyEntity interfaces of the entity class. + +

      This class calls the methods of the MarshalledTupleEntry + interface to convert between the data entry and entity object. It calls the + methods of the MarshalledTupleKeyEntity interface to convert between + the key entry and the entity object. These two interfaces must both be + implemented by the entity class.

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledKeyCreator.html b/docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledKeyCreator.html new file mode 100644 index 0000000..5c2b7e7 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/TupleTupleMarshalledKeyCreator.html @@ -0,0 +1,382 @@ + + + + + +TupleTupleMarshalledKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.bind.tuple
    +

    Class TupleTupleMarshalledKeyCreator<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity>

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/BigDecimalBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/BigDecimalBinding.html new file mode 100644 index 0000000..5dc45f6 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/BigDecimalBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.BigDecimalBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.BigDecimalBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.BigDecimalBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/BigIntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/BigIntegerBinding.html new file mode 100644 index 0000000..c15225f --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/BigIntegerBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.BigIntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.BigIntegerBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.BigIntegerBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/BooleanBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/BooleanBinding.html new file mode 100644 index 0000000..d5a701b --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/BooleanBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.BooleanBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.BooleanBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.BooleanBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/ByteBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/ByteBinding.html new file mode 100644 index 0000000..0078a05 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/ByteBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.ByteBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.ByteBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.ByteBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/CharacterBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/CharacterBinding.html new file mode 100644 index 0000000..0d53a14 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/CharacterBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.CharacterBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.CharacterBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.CharacterBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/DoubleBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/DoubleBinding.html new file mode 100644 index 0000000..03d9e6b --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/DoubleBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.DoubleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.DoubleBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.DoubleBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/FloatBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/FloatBinding.html new file mode 100644 index 0000000..fbf5a18 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/FloatBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.FloatBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.FloatBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.FloatBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/IntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/IntegerBinding.html new file mode 100644 index 0000000..6753863 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/IntegerBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.IntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.IntegerBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.IntegerBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/LongBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/LongBinding.html new file mode 100644 index 0000000..6d79c41 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/LongBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.LongBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.LongBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.LongBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleEntry.html b/docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleEntry.html new file mode 100644 index 0000000..4107cbd --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleEntry.html @@ -0,0 +1,188 @@ + + + + + +Uses of Interface com.sleepycat.bind.tuple.MarshalledTupleEntry (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.bind.tuple.MarshalledTupleEntry

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleKeyEntity.html b/docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleKeyEntity.html new file mode 100644 index 0000000..b393786 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/MarshalledTupleKeyEntity.html @@ -0,0 +1,264 @@ + + + + + +Uses of Interface com.sleepycat.bind.tuple.MarshalledTupleKeyEntity (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.bind.tuple.MarshalledTupleKeyEntity

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/PackedIntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/PackedIntegerBinding.html new file mode 100644 index 0000000..6e502ba --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/PackedIntegerBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.PackedIntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.PackedIntegerBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.PackedIntegerBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/PackedLongBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/PackedLongBinding.html new file mode 100644 index 0000000..b9510ca --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/PackedLongBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.PackedLongBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.PackedLongBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.PackedLongBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/ShortBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/ShortBinding.html new file mode 100644 index 0000000..68c45f8 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/ShortBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.ShortBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.ShortBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.ShortBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/SortedBigDecimalBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/SortedBigDecimalBinding.html new file mode 100644 index 0000000..dcd8d4e --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/SortedBigDecimalBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.SortedBigDecimalBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.SortedBigDecimalBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.SortedBigDecimalBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/SortedDoubleBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/SortedDoubleBinding.html new file mode 100644 index 0000000..5ed34ae --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/SortedDoubleBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.SortedDoubleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.SortedDoubleBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.SortedDoubleBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/SortedFloatBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/SortedFloatBinding.html new file mode 100644 index 0000000..772fca1 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/SortedFloatBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.SortedFloatBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.SortedFloatBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.SortedFloatBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedIntegerBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedIntegerBinding.html new file mode 100644 index 0000000..18d241f --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedIntegerBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.SortedPackedIntegerBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.SortedPackedIntegerBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.SortedPackedIntegerBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedLongBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedLongBinding.html new file mode 100644 index 0000000..0977488 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/SortedPackedLongBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.SortedPackedLongBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.SortedPackedLongBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.SortedPackedLongBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/StringBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/StringBinding.html new file mode 100644 index 0000000..d4a8c0d --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/StringBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.StringBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.StringBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.StringBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleBase.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleBase.html new file mode 100644 index 0000000..39b172e --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleBase.html @@ -0,0 +1,382 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleBase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleBase

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleBinding.html new file mode 100644 index 0000000..ae8410e --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleBinding.html @@ -0,0 +1,317 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleBinding

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      Packages that use TupleBinding 
      PackageDescription
      com.sleepycat.bind.tuple +
      Bindings that use sequences of primitive fields, or tuples.
      +
      +
    • +
    • +
        +
      • + + +

        Uses of TupleBinding in com.sleepycat.bind.tuple

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Subclasses of TupleBinding in com.sleepycat.bind.tuple 
        Modifier and TypeClass and Description
        class BigDecimalBinding +
        A concrete TupleBinding for an unsorted BigDecimal + value.
        +
        class BigIntegerBinding +
        A concrete TupleBinding for a BigInteger value.
        +
        class BooleanBinding +
        A concrete TupleBinding for a Boolean primitive + wrapper or a boolean primitive.
        +
        class ByteBinding +
        A concrete TupleBinding for a Byte primitive + wrapper or a byte primitive.
        +
        class CharacterBinding +
        A concrete TupleBinding for a Character primitive + wrapper or a char primitive.
        +
        class DoubleBinding +
        A concrete TupleBinding for an unsorted Double + primitive wrapper or an unsorted double primitive.
        +
        class FloatBinding +
        A concrete TupleBinding for an unsorted Float + primitive wrapper or an unsorted float primitive.
        +
        class IntegerBinding +
        A concrete TupleBinding for a Integer primitive + wrapper or an int primitive.
        +
        class LongBinding +
        A concrete TupleBinding for a Long primitive + wrapper or a long primitive.
        +
        class PackedIntegerBinding +
        A concrete TupleBinding for an unsorted Integer + primitive wrapper or an unsorted int primitive, that stores the + value in the smallest number of bytes possible.
        +
        class PackedLongBinding +
        A concrete TupleBinding for an unsorted Long + primitive wrapper or an unsorted long primitive, that stores + the value in the smallest number of bytes possible.
        +
        class ShortBinding +
        A concrete TupleBinding for a Short primitive + wrapper or a short primitive.
        +
        class SortedBigDecimalBinding +
        A concrete TupleBinding for a sorted BigDecimal + value.
        +
        class SortedDoubleBinding +
        A concrete TupleBinding for a sorted Double + primitive wrapper or a sorted double primitive.
        +
        class SortedFloatBinding +
        A concrete TupleBinding for a sorted Float + primitive wrapper or sorted a float primitive.
        +
        class SortedPackedIntegerBinding +
        A concrete TupleBinding for a sorted Integer + primitive wrapper or a sorted int primitive, that stores the + value in the smallest number of bytes possible.
        +
        class SortedPackedLongBinding +
        A concrete TupleBinding for a sorted Long + primitive wrapper or a sorted long primitive, that stores the + value in the smallest number of bytes possible.
        +
        class StringBinding +
        A concrete TupleBinding for a simple String value.
        +
        class TupleMarshalledBinding<E extends MarshalledTupleEntry> +
        A concrete TupleBinding that delegates to the + MarshalledTupleEntry interface of the data or key object.
        +
        + + + + + + + + + + + + +
        Methods in com.sleepycat.bind.tuple that return TupleBinding 
        Modifier and TypeMethod and Description
        static <T> TupleBinding<T>TupleBinding.getPrimitiveBinding(java.lang.Class<T> cls) +
        Creates a tuple binding for a primitive Java class.
        +
        +
      • +
      +
    • +
    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleInput.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleInput.html new file mode 100644 index 0000000..ea68d10 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleInput.html @@ -0,0 +1,382 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleInput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleInput

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleInputBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleInputBinding.html new file mode 100644 index 0000000..4e12b9f --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleInputBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleInputBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleInputBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.TupleInputBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleMarshalledBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleMarshalledBinding.html new file mode 100644 index 0000000..9553992 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleMarshalledBinding.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleMarshalledBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleMarshalledBinding

    +
    +
    No usage of com.sleepycat.bind.tuple.TupleMarshalledBinding
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleOutput.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleOutput.html new file mode 100644 index 0000000..7452522 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleOutput.html @@ -0,0 +1,674 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleOutput (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleOutput

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleBinding.html new file mode 100644 index 0000000..7ec5455 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleBinding.html @@ -0,0 +1,175 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleTupleBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleTupleBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleKeyCreator.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleKeyCreator.html new file mode 100644 index 0000000..8def823 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleKeyCreator.html @@ -0,0 +1,173 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleTupleKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleTupleKeyCreator

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledBinding.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledBinding.html new file mode 100644 index 0000000..e3ad62f --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledBinding.html @@ -0,0 +1,172 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleTupleMarshalledBinding (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleTupleMarshalledBinding

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledKeyCreator.html b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledKeyCreator.html new file mode 100644 index 0000000..4538261 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/class-use/TupleTupleMarshalledKeyCreator.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.bind.tuple.TupleTupleMarshalledKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.bind.tuple.TupleTupleMarshalledKeyCreator

    +
    +
    No usage of com.sleepycat.bind.tuple.TupleTupleMarshalledKeyCreator
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/package-frame.html b/docs/java/com/sleepycat/bind/tuple/package-frame.html new file mode 100644 index 0000000..4dc9b75 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/package-frame.html @@ -0,0 +1,52 @@ + + + + + +com.sleepycat.bind.tuple (Oracle - Berkeley DB Java Edition API) + + + + + +

    com.sleepycat.bind.tuple

    + + + diff --git a/docs/java/com/sleepycat/bind/tuple/package-summary.html b/docs/java/com/sleepycat/bind/tuple/package-summary.html new file mode 100644 index 0000000..e4329a1 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/package-summary.html @@ -0,0 +1,754 @@ + + + + + +com.sleepycat.bind.tuple (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Package com.sleepycat.bind.tuple

    +
    +
    Bindings that use sequences of primitive fields, or tuples.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      MarshalledTupleEntry +
      A marshalling interface implemented by key, data or entity classes that + are represented as tuples.
      +
      MarshalledTupleKeyEntity +
      A marshalling interface implemented by entity classes that represent keys as + tuples.
      +
      +
    • +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      BigDecimalBinding +
      A concrete TupleBinding for an unsorted BigDecimal + value.
      +
      BigIntegerBinding +
      A concrete TupleBinding for a BigInteger value.
      +
      BooleanBinding +
      A concrete TupleBinding for a Boolean primitive + wrapper or a boolean primitive.
      +
      ByteBinding +
      A concrete TupleBinding for a Byte primitive + wrapper or a byte primitive.
      +
      CharacterBinding +
      A concrete TupleBinding for a Character primitive + wrapper or a char primitive.
      +
      DoubleBinding +
      A concrete TupleBinding for an unsorted Double + primitive wrapper or an unsorted double primitive.
      +
      FloatBinding +
      A concrete TupleBinding for an unsorted Float + primitive wrapper or an unsorted float primitive.
      +
      IntegerBinding +
      A concrete TupleBinding for a Integer primitive + wrapper or an int primitive.
      +
      LongBinding +
      A concrete TupleBinding for a Long primitive + wrapper or a long primitive.
      +
      PackedIntegerBinding +
      A concrete TupleBinding for an unsorted Integer + primitive wrapper or an unsorted int primitive, that stores the + value in the smallest number of bytes possible.
      +
      PackedLongBinding +
      A concrete TupleBinding for an unsorted Long + primitive wrapper or an unsorted long primitive, that stores + the value in the smallest number of bytes possible.
      +
      ShortBinding +
      A concrete TupleBinding for a Short primitive + wrapper or a short primitive.
      +
      SortedBigDecimalBinding +
      A concrete TupleBinding for a sorted BigDecimal + value.
      +
      SortedDoubleBinding +
      A concrete TupleBinding for a sorted Double + primitive wrapper or a sorted double primitive.
      +
      SortedFloatBinding +
      A concrete TupleBinding for a sorted Float + primitive wrapper or sorted a float primitive.
      +
      SortedPackedIntegerBinding +
      A concrete TupleBinding for a sorted Integer + primitive wrapper or a sorted int primitive, that stores the + value in the smallest number of bytes possible.
      +
      SortedPackedLongBinding +
      A concrete TupleBinding for a sorted Long + primitive wrapper or a sorted long primitive, that stores the + value in the smallest number of bytes possible.
      +
      StringBinding +
      A concrete TupleBinding for a simple String value.
      +
      TupleBase<E> +
      A base class for tuple bindings and tuple key creators that provides control + over the allocation of the output buffer.
      +
      TupleBinding<E> +
      An abstract EntryBinding that treats a key or data entry as a + tuple; it includes predefined bindings for Java primitive types.
      +
      TupleInput +
      An InputStream with DataInput-like methods for + reading tuple fields.
      +
      TupleInputBinding +
      A concrete EntryBinding that uses the TupleInput + object as the key or data object.
      +
      TupleMarshalledBinding<E extends MarshalledTupleEntry> +
      A concrete TupleBinding that delegates to the + MarshalledTupleEntry interface of the data or key object.
      +
      TupleOutput +
      An OutputStream with DataOutput-like methods for + writing tuple fields.
      +
      TupleTupleBinding<E> +
      An abstract EntityBinding that treats an entity's key entry and + data entry as tuples.
      +
      TupleTupleKeyCreator<E> +
      An abstract key creator that uses a tuple key and a tuple data entry.
      +
      TupleTupleMarshalledBinding<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity> +
      A concrete TupleTupleBinding that delegates to the + MarshalledTupleEntry and + MarshalledTupleKeyEntity interfaces of the entity class.
      +
      TupleTupleMarshalledKeyCreator<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity> +
      A concrete key creator that works in conjunction with a TupleTupleMarshalledBinding.
      +
      +
    • +
    + + + +

    Package com.sleepycat.bind.tuple Description

    +
    Bindings that use sequences of primitive fields, or tuples. + + +For a general discussion of bindings, see the +Getting Started Guide. + + +

    Tuple Formats

    + +

    The serialization format for tuple bindings are designed for compactness, +serialization speed and proper default sorting.

    + +

    When a format is used for database keys, it is important to use default +sorting for best performance. Although a custom comparator may be specified +for a database or +entity +index, custom comparators often reduce performance because comparators are +called very frequently during Btree operations.

    + +

    For proper default sorting, the byte array of the stored format must be +designed so that a byte-by-byte unsigned comparison results in the natural sort +order, as defined by the Comparable.compareTo(T) method of the +data type. For example, the natural sort order for integers is the standard +mathematical definition, and is implemented by Integer.compareTo, +Long.compareTo, etc. This is called default natural +sorting.

    + +

    Although most tuple formats provide default natural sorting, not all of them +do. Certain formats do not provide default natural sorting for historical +reasons (see the discussion of packed integer and float formats below.) Other +formats sacrifice default natural sorting for other performance factors (see +the discussion of BigDecimal formats below.)

    + + +

    Another performance factor has to do with amount of memory used by keys in +the Btree. Keys are stored in their serialized form in the Btree. If keys are +small (currently 16 bytes or less), Btree memory can be optimized. Optimized +memory storage is based on the maximum size of all keys in a single Btree +node. A single Btree node holds N adjacent key values, where N is 128 by +default and can be configured for each database or index.

    + + +

    String Formats

    + +

    All String formats support default natural sorting.

    + +

    Strings are stored as a byte array of UTF encoded characters, either where +the length must be known by the application, or the byte array is +zero-terminated. The UTF encoding is described below.

    +
      +
    • Null strings are UTF encoded as { 0xFF }, which is not allowed in a +standard UTF encoding. This allows null strings, as distinct from empty or +zero length strings, to be represented. Using default sorting, null strings +will be ordered last. +
    • +
    • Zero (0x0000) character values are UTF encoded as non-zero values, and +therefore embedded zeros in the string are supported. The sequence { 0xC0, +0x80 } is used to encode a zero character. This UTF encoding is the same one +used by the native Java UTF libraries and is called +Modified UTF-8. +However, this encoding of zero does impact the lexicographical ordering, and +zeros will not be sorted first (the natural order) or last. +
    • +
    • For all character values other than zero, the standard UTF encoding is +used, and the default sorting is the same as the Unicode lexicographical +character ordering. +
    • +
    + +

    Binding classes and methods are provided for zero-terminated and +known-length String values.

    + + +

    Integer Formats

    + +

    Fixed Size Integer Formats

    + +

    All fixed size integer formats support default natural sorting.

    + +

    The size of the stored value depends on the type, and ranges (as one would +expect) from 1 byte for type byte and class Byte, to 8 bytes for +type long and class Long.

    + +

    Signed numbers are stored in the buffer in MSB (most significant byte first) +order with their sign bit (high-order bit) inverted to cause negative numbers +to be sorted first when comparing values as unsigned byte arrays, as done in a +database.

    + + + +

    Unsigned numbers, including characters, are stored in MSB order with no +change to their sign bit. Arrays of characters and unsigned bytes may also be +stored and may be treated as String values. For booleans, true +is stored as the unsigned byte value one and false as the unsigned byte +value zero.

    + + + +

    Packed Integer Formats

    + +

    The packed integer format stores integers with small absolute values in a +single byte. The size increases as the absolute value increases, up to a +maximum of 5 bytes for int values and 9 bytes for long +values.

    + +

    The packed integer format can be used for integer values between Long.MIN_VALUE and Long.MAX_VALUE. However, +different bindings and methods are provided for type int and long, to avoid unsafe casting from long to int when int values are used.

    + +

    Because the same packed format is used for int and long +values, stored int values may be expanded to long values +without introducing a format incompatibility. In other words, you can treat +previously stored packed int values as packed long values.

    + +

    Packed integer formats come in two varieties: those that support default +natural sorting and those that don't. The formats of the two varieties are +incompatible. For new applications, the format that supports default natural +sorting should normally be used. There is no performance advantage to using +the unsorted format.

    + +

    The format with support for default natural sorting stores values in the +inclusive range [-119,120] in a single byte.

    + + +

    The unsorted packed integer format is an older, legacy format that is used +internally and supported for compatibility. It stores values in the inclusive +range [-119,119] in a single byte. Because default natural sorting is not +supported, this format should not be used for keys. However, it so happens +that packed integers in the inclusive range [0,630] are sorted correctly by +default, and this may be useful for some applications.

    + + +

    BigInteger Formats

    + +

    All BigInteger formats support default natural sorting.

    + +

    BigInteger values are variable length and are stored as signed +values with a preceding byte length. The length has the same sign as the +value, in order to support default natural sorting.

    + +

    The length is stored as a 2-byte (short), fixed size, signed integer. +Supported values are therefore limited to those with a byte array (BigInteger.toByteArray()) representation with a size of 0x7fff bytes +or less. The maximum BigInteger value is (20x3fff7 - 1) and +the minimum value is (-20x3fff7).

    + + + +

    Floating Point Formats

    + +

    Floats and doubles are stored in a fixed size, 4 and 8 byte format, +respectively. Floats and doubles are stored using two different +representations: a representation with default natural sorting, and an +unsorted, integer-bit (IEEE 754) representation. For new applications, the +format that supports default natural sorting should normally be used. There is +no performance advantage to using the unsorted format.

    + +

    For float values, Float.floatToIntBits and the following +bit manipulations are used to convert the signed float value to a +representation that is sorted correctly by default.

    +
    + int intVal = Float.floatToIntBits(val);
    + intVal ^= (intVal < 0) ? 0xffffffff : 0x80000000;
    +
    + +

    For double values, Float.doubleToLongBits and the +following bit manipulations are used to convert the signed double value to a +representation that is sorted correctly by default.

    +
    + long longVal = Double.doubleToLongBits(val);
    + longVal ^= (longVal < 0) ? 0xffffffffffffffffL : 0x8000000000000000L;
    +
    + +

    In both cases, the resulting int or long value is stored as +an unsigned value.

    + + + +

    The unsorted floating point format is an older, legacy format that is +supported for compatibility. With this format, only zero and positive values +have default natural sorting; negative values do not.

    + + + +

    BigDecimal Formats

    + +

    BigDecimal values are stored using two different, variable length +representations: a representation that supports default natural sorting, and an +unsorted representation. Differences between the two formats are: +

      +
    • The BigDecimal format with default natural sorting should normally +be used for database keys.
    • +
        +
      • Default natural sorting is supported.
      • +
      • The stored value is around 3 bytes larger than the unsorted format, + more or less, and is a minimum of 8 bytes.
      • +
      • More computation is required for serialization than the unsorted + format.
      • +
      • Trailing zeros after the decimal place are stripped, meaning that + precision is not preserved.
      • +
      +
    • The unsorted BigDecimal format should normally be used for non-key +values.
    • +
        +
      • Default natural sorting is not supported.
      • +
      • The stored value is around 3 bytes smaller than the sorted format, more + or less, and is a minimum of 3 bytes.
      • +
      • Less computation is required for serialization than the sorted + format.
      • +
      • Trailing zeros after the decimal place are preserved, meaning that + precision is preserved.
      • +
      +
    + +

    Both formats store the scale or exponent separately from the unscaled value, +and the stored size does not increase proportionally as the absolute value of +the scale or exponent increases.

    + +
    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/package-tree.html b/docs/java/com/sleepycat/bind/tuple/package-tree.html new file mode 100644 index 0000000..e191ef8 --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/package-tree.html @@ -0,0 +1,202 @@ + + + + + +com.sleepycat.bind.tuple Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Hierarchy For Package com.sleepycat.bind.tuple

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/bind/tuple/package-use.html b/docs/java/com/sleepycat/bind/tuple/package-use.html new file mode 100644 index 0000000..eb1561f --- /dev/null +++ b/docs/java/com/sleepycat/bind/tuple/package-use.html @@ -0,0 +1,281 @@ + + + + + +Uses of Package com.sleepycat.bind.tuple (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Package
    com.sleepycat.bind.tuple

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/CurrentTransaction.html b/docs/java/com/sleepycat/collections/CurrentTransaction.html new file mode 100644 index 0000000..8b17796 --- /dev/null +++ b/docs/java/com/sleepycat/collections/CurrentTransaction.html @@ -0,0 +1,437 @@ + + + + + +CurrentTransaction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class CurrentTransaction

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.CurrentTransaction
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class CurrentTransaction
      +extends java.lang.Object
      +
      Provides access to the current transaction for the current thread within the + context of a Berkeley DB environment. This class provides explicit + transaction control beyond that provided by the TransactionRunner + class. However, both methods of transaction control manage per-thread + transactions.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        TransactionabortTransaction() +
        Aborts the transaction that is active for the current thread for this + environment and makes the parent transaction (if any) the current + transaction.
        +
        TransactionbeginTransaction(TransactionConfig config) +
        Begins a new transaction for this environment and associates it with + the current thread.
        +
        TransactioncommitTransaction() +
        Commits the transaction that is active for the current thread for this + environment and makes the parent transaction (if any) the current + transaction.
        +
        EnvironmentgetEnvironment() +
        Returns the underlying Berkeley DB environment.
        +
        static CurrentTransactiongetInstance(Environment env) +
        Gets the CurrentTransaction accessor for a specified Berkeley DB + environment.
        +
        TransactiongetTransaction() +
        Returns the transaction associated with the current thread for this + environment, or null if no transaction is active.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getInstance

          +
          public static CurrentTransaction getInstance(Environment env)
          +
          Gets the CurrentTransaction accessor for a specified Berkeley DB + environment. This method always returns the same reference when called + more than once with the same environment parameter.
          +
          +
          Parameters:
          +
          env - is an open Berkeley DB environment.
          +
          Returns:
          +
          the CurrentTransaction accessor for the given environment, or + null if the environment is not transactional.
          +
          +
        • +
        + + + +
          +
        • +

          getEnvironment

          +
          public final Environment getEnvironment()
          +
          Returns the underlying Berkeley DB environment.
          +
          +
          Returns:
          +
          the Environment.
          +
          +
        • +
        + + + +
          +
        • +

          getTransaction

          +
          public final Transaction getTransaction()
          +
          Returns the transaction associated with the current thread for this + environment, or null if no transaction is active.
          +
          +
          Returns:
          +
          the Transaction.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          commitTransaction

          +
          public final Transaction commitTransaction()
          +                                    throws DatabaseException,
          +                                           java.lang.IllegalStateException
          +
          Commits the transaction that is active for the current thread for this + environment and makes the parent transaction (if any) the current + transaction.
          +
          +
          Returns:
          +
          the parent transaction or null if the committed transaction was + not nested. + +
          +
          Throws:
          +
          InsufficientReplicasException - if the master + in a replicated environment could not contact a quorum of replicas as + determined by the Durability.ReplicaAckPolicy. + The application must abort the transaction and can choose to retry it.
          +
          InsufficientAcksException - if the master in + a replicated environment did not receive enough replica acknowledgments, + although the commit succeeded locally.
          +
          ReplicaWriteException - if a write operation + was performed with this transaction, but this node is now a Replica.
          +
          OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          DatabaseException - if an error occurs committing the transaction. + The transaction will still be closed and the parent transaction will + become the current transaction.
          +
          java.lang.IllegalStateException - if no transaction is active for the + current thread for this environment.
          +
          +
        • +
        + + + +
          +
        • +

          abortTransaction

          +
          public final Transaction abortTransaction()
          +                                   throws DatabaseException,
          +                                          java.lang.IllegalStateException
          +
          Aborts the transaction that is active for the current thread for this + environment and makes the parent transaction (if any) the current + transaction.
          +
          +
          Returns:
          +
          the parent transaction or null if the aborted transaction was + not nested. + +
          +
          Throws:
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          DatabaseException - if an error occurs aborting the transaction. + The transaction will still be closed and the parent transaction will + become the current transaction.
          +
          java.lang.IllegalStateException - if no transaction is active for the + current thread for this environment.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/MapEntryParameter.html b/docs/java/com/sleepycat/collections/MapEntryParameter.html new file mode 100644 index 0000000..faeb4c4 --- /dev/null +++ b/docs/java/com/sleepycat/collections/MapEntryParameter.html @@ -0,0 +1,443 @@ + + + + + +MapEntryParameter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class MapEntryParameter<K,V>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.MapEntryParameter<K,V>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.util.Map.Entry<K,V>
      +
      +
      +
      +
      public class MapEntryParameter<K,V>
      +extends java.lang.Object
      +implements java.util.Map.Entry<K,V>
      +
      A simple Map.Entry implementation that can be used as in + input parameter. Since a MapEntryParameter is not obtained + from a map, it is not attached to any map in particular. To emphasize that + changing this object does not change the map, the setValue(V) method + always throws UnsupportedOperationException. + +

      Warning: Use of this interface violates the Java Collections + interface contract since these state that Map.Entry objects + should only be obtained from Map.entrySet() sets, while this + class allows constructing them directly. However, it is useful for + performing operations on an entry set such as add(), contains(), etc. For + restrictions see getValue() and setValue(V).

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        MapEntryParameter(K key, + V value) +
        Creates a map entry with a given key and value.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        booleanequals(java.lang.Object other) +
        Compares this entry to a given entry as specified by Map.Entry.equals(java.lang.Object).
        +
        KgetKey() +
        Returns the key of this entry.
        +
        VgetValue() +
        Returns the value of this entry.
        +
        inthashCode() +
        Computes a hash code as specified by Map.Entry.hashCode().
        +
        VsetValue(V newValue) +
        Always throws UnsupportedOperationException since this + object is not attached to a map.
        +
        java.lang.StringtoString() +
        Converts the entry to a string representation for debugging.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Map.Entry

          +comparingByKey, comparingByKey, comparingByValue, comparingByValue
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + + + +
          +
        • +

          MapEntryParameter

          +
          public MapEntryParameter(K key,
          +                         V value)
          +
          Creates a map entry with a given key and value.
          +
          +
          Parameters:
          +
          key - is the key to use.
          +
          value - is the value to use.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          Computes a hash code as specified by Map.Entry.hashCode().
          +
          +
          Specified by:
          +
          hashCode in interface java.util.Map.Entry<K,V>
          +
          Overrides:
          +
          hashCode in class java.lang.Object
          +
          Returns:
          +
          the computed hash code.
          +
          +
        • +
        + + + +
          +
        • +

          equals

          +
          public boolean equals(java.lang.Object other)
          +
          Compares this entry to a given entry as specified by Map.Entry.equals(java.lang.Object).
          +
          +
          Specified by:
          +
          equals in interface java.util.Map.Entry<K,V>
          +
          Overrides:
          +
          equals in class java.lang.Object
          +
          Returns:
          +
          the computed hash code.
          +
          +
        • +
        + + + +
          +
        • +

          getKey

          +
          public final K getKey()
          +
          Returns the key of this entry.
          +
          +
          Specified by:
          +
          getKey in interface java.util.Map.Entry<K,V>
          +
          Returns:
          +
          the key of this entry.
          +
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public final V getValue()
          +
          Returns the value of this entry. Note that this will be the value + passed to the constructor or the last value passed to setValue(V). + It will not reflect changes made to a Map.
          +
          +
          Specified by:
          +
          getValue in interface java.util.Map.Entry<K,V>
          +
          Returns:
          +
          the value of this entry.
          +
          +
        • +
        + + + + + +
          +
        • +

          setValue

          +
          public V setValue(V newValue)
          +
          Always throws UnsupportedOperationException since this + object is not attached to a map.
          +
          +
          Specified by:
          +
          setValue in interface java.util.Map.Entry<K,V>
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          Converts the entry to a string representation for debugging.
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          Returns:
          +
          the string representation.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/PrimaryKeyAssigner.html b/docs/java/com/sleepycat/collections/PrimaryKeyAssigner.html new file mode 100644 index 0000000..403a99b --- /dev/null +++ b/docs/java/com/sleepycat/collections/PrimaryKeyAssigner.html @@ -0,0 +1,245 @@ + + + + + +PrimaryKeyAssigner (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Interface PrimaryKeyAssigner

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface PrimaryKeyAssigner
      +
      An interface implemented to assign new primary key values. + An implementation of this interface is passed to the StoredMap + or StoredSortedMap constructor to assign primary keys for that + store. Key assignment occurs when StoredMap.append() is called.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          assignKey

          +
          void assignKey(DatabaseEntry keyData)
          +        throws DatabaseException
          +
          Assigns a new primary key value into the given buffer.
          +
          +
          Parameters:
          +
          keyData - the buffer.
          +
          Throws:
          +
          DatabaseException - to stop the operation and cause this exception + to be propagated to the caller of StoredMap.append().
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredCollection.html b/docs/java/com/sleepycat/collections/StoredCollection.html new file mode 100644 index 0000000..d9c5463 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredCollection.html @@ -0,0 +1,948 @@ + + + + + +StoredCollection (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredCollection<E>

    +
    +
    + +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        static intDEFAULT_ITERATOR_BLOCK_SIZE +
        The default number of records read at one time by iterators.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods Deprecated Methods 
        Modifier and TypeMethod and Description
        booleanaddAll(java.util.Collection<? extends E> coll) +
        Adds all of the elements in the specified collection to this collection + (optional operation).
        +
        booleancontainsAll(java.util.Collection<?> coll) +
        Returns true if this collection contains all of the elements in the + specified collection.
        +
        booleanequals(java.lang.Object other) +
        Compares the specified object with this collection for equality.
        +
        intgetIteratorBlockSize() +
        Returns the number of records read at one time by iterators returned by + the iterator() method.
        +
        inthashCode() 
        java.util.Iterator<E>iterator() +
        Returns an iterator over the elements in this collection.
        +
        StoredIterator<E>iterator(boolean writeAllowed) +
        Deprecated.  +
        Please use storedIterator() or storedIterator(boolean) instead. Because the iterator returned must + be closed, the method name iterator is confusing since standard + Java iterators do not need to be closed.
        +
        +
        StoredIterator<E>join(StoredContainer[] indices, + java.lang.Object[] indexKeys, + JoinConfig joinConfig) +
        Returns an iterator representing an equality join of the indices and + index key values specified.
        +
        booleanremoveAll(java.util.Collection<?> coll) +
        Removes all this collection's elements that are also contained in the + specified collection (optional operation).
        +
        booleanretainAll(java.util.Collection<?> coll) +
        Retains only the elements in this collection that are contained in the + specified collection (optional operation).
        +
        voidsetIteratorBlockSize(int blockSize) +
        Changes the number of records read at one time by iterators returned by + the iterator() method.
        +
        intsize() +
        Returns a non-transactional count of the records in the collection or + map.
        +
        StoredIterator<E>storedIterator() +
        Returns an iterator over the elements in this collection.
        +
        StoredIterator<E>storedIterator(boolean writeAllowed) +
        Returns a read or read-write iterator over the elements in this + collection.
        +
        java.lang.Object[]toArray() +
        Returns an array of all the elements in this collection.
        +
        <T> T[]toArray(T[] a) +
        Returns an array of all the elements in this collection whose runtime + type is that of the specified array.
        +
        java.util.List<E>toList() +
        Returns a copy of this collection as an ArrayList.
        +
        java.lang.StringtoString() +
        Converts the collection to a string representation for debugging.
        +
        + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Collection

          +add, clear, contains, isEmpty, parallelStream, remove, removeIf, spliterator, stream
        • +
        +
          +
        • + + +

          Methods inherited from interface java.lang.Iterable

          +forEach
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getIteratorBlockSize

          +
          public int getIteratorBlockSize()
          +
          Returns the number of records read at one time by iterators returned by + the iterator() method. By default this value is DEFAULT_ITERATOR_BLOCK_SIZE.
          +
          +
          Returns:
          +
          the number of records.
          +
          +
        • +
        + + + +
          +
        • +

          setIteratorBlockSize

          +
          public void setIteratorBlockSize(int blockSize)
          +
          Changes the number of records read at one time by iterators returned by + the iterator() method. By default this value is DEFAULT_ITERATOR_BLOCK_SIZE.
          +
          +
          Parameters:
          +
          blockSize - the number of records.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if the blockSize is less than two.
          +
          +
        • +
        + + + +
          +
        • +

          iterator

          +
          public java.util.Iterator<E> iterator()
          +
          Returns an iterator over the elements in this collection. + The iterator will be read-only if the collection is read-only. + This method conforms to the Collection.iterator() interface. + +

          The iterator returned by this method does not keep a database cursor + open and therefore it does not need to be closed. It reads blocks of + records as needed, opening and closing a cursor to read each block of + records. The number of records per block is 10 by default and can be + changed with setIteratorBlockSize(int).

          + +

          Because this iterator does not keep a cursor open, if it is used + without transactions, the iterator does not have cursor + stability characteristics. In other words, the record at the + current iterator position can be changed or deleted by another thread. + To prevent this from happening, call this method within a transaction or + use the storedIterator() method instead.

          +
          +
          Specified by:
          +
          iterator in interface java.lang.Iterable<E>
          +
          Specified by:
          +
          iterator in interface java.util.Collection<E>
          +
          Returns:
          +
          a standard Iterator for this collection.
          +
          See Also:
          +
          StoredContainer.isWriteAllowed()
          +
          +
        • +
        + + + +
          +
        • +

          storedIterator

          +
          public StoredIterator<E> storedIterator()
          +
          Returns an iterator over the elements in this collection. + The iterator will be read-only if the collection is read-only. + This method does not exist in the standard Collection interface. + +

          If Iterator.set or Iterator.remove will be called + and the underlying Database is transactional, then a transaction must be + active when calling this method and must remain active while using the + iterator.

          + +

          Warning: The iterator returned must be explicitly + closed using StoredIterator.close() or StoredIterator.close(java.util.Iterator) to release the underlying + database cursor resources.

          +
          +
          Returns:
          +
          a StoredIterator for this collection.
          +
          See Also:
          +
          StoredContainer.isWriteAllowed()
          +
          +
        • +
        + + + +
          +
        • +

          storedIterator

          +
          public StoredIterator<E> storedIterator(boolean writeAllowed)
          +
          Returns a read or read-write iterator over the elements in this + collection. + This method does not exist in the standard Collection interface. + +

          If Iterator.set or Iterator.remove will be called + and the underlying Database is transactional, then a transaction must be + active when calling this method and must remain active while using the + iterator.

          + +

          Warning: The iterator returned must be explicitly + closed using StoredIterator.close() or StoredIterator.close(java.util.Iterator) to release the underlying + database cursor resources.

          +
          +
          Parameters:
          +
          writeAllowed - is true to open a read-write iterator or false to + open a read-only iterator. If the collection is read-only the iterator + will always be read-only.
          +
          Returns:
          +
          a StoredIterator for this collection.
          +
          Throws:
          +
          java.lang.IllegalStateException - if writeAllowed is true but the collection + is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          See Also:
          +
          StoredContainer.isWriteAllowed()
          +
          +
        • +
        + + + +
          +
        • +

          iterator

          +
          public StoredIterator<E> iterator(boolean writeAllowed)
          +
          Deprecated. Please use storedIterator() or storedIterator(boolean) instead. Because the iterator returned must + be closed, the method name iterator is confusing since standard + Java iterators do not need to be closed.
          +
          +
          Parameters:
          +
          writeAllowed - is true to open a read-write iterator or false to + open a read-only iterator. If the collection is read-only the iterator + will always be read-only.
          +
          Returns:
          +
          a StoredIterator for this collection.
          +
          +
        • +
        + + + +
          +
        • +

          toArray

          +
          public java.lang.Object[] toArray()
          +
          Returns an array of all the elements in this collection. + This method conforms to the Collection.toArray() interface. + +
          +
          +
          Specified by:
          +
          toArray in interface java.util.Collection<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          toArray

          +
          public <T> T[] toArray(T[] a)
          +
          Returns an array of all the elements in this collection whose runtime + type is that of the specified array. + This method conforms to the Collection.toArray(Object[]) + interface. + +
          +
          +
          Specified by:
          +
          toArray in interface java.util.Collection<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          containsAll

          +
          public boolean containsAll(java.util.Collection<?> coll)
          +
          Returns true if this collection contains all of the elements in the + specified collection. + This method conforms to the Collection.containsAll(java.util.Collection<?>) interface. + +
          +
          +
          Specified by:
          +
          containsAll in interface java.util.Collection<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          addAll

          +
          public boolean addAll(java.util.Collection<? extends E> coll)
          +
          Adds all of the elements in the specified collection to this collection + (optional operation). + This method calls the Collection.add(Object) method of the concrete + collection class, which may or may not be supported. + This method conforms to the Collection.addAll(java.util.Collection<? extends E>) interface. + +
          +
          +
          Specified by:
          +
          addAll in interface java.util.Collection<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only, or + if the collection is indexed, or if the add method is not supported by + the concrete collection.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          removeAll

          +
          public boolean removeAll(java.util.Collection<?> coll)
          +
          Removes all this collection's elements that are also contained in the + specified collection (optional operation). + This method conforms to the Collection.removeAll(java.util.Collection<?>) interface. + +
          +
          +
          Specified by:
          +
          removeAll in interface java.util.Collection<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          retainAll

          +
          public boolean retainAll(java.util.Collection<?> coll)
          +
          Retains only the elements in this collection that are contained in the + specified collection (optional operation). + This method conforms to the Collection.removeAll(java.util.Collection<?>) interface. + +
          +
          +
          Specified by:
          +
          retainAll in interface java.util.Collection<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          equals

          +
          public boolean equals(java.lang.Object other)
          +
          Compares the specified object with this collection for equality. + A value comparison is performed by this method and the stored values + are compared rather than calling the equals() method of each element. + This method conforms to the Collection.equals(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          equals in interface java.util.Collection<E>
          +
          Overrides:
          +
          equals in class java.lang.Object
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          +
          Specified by:
          +
          hashCode in interface java.util.Collection<E>
          +
          Overrides:
          +
          hashCode in class java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          toList

          +
          public java.util.List<E> toList()
          +
          Returns a copy of this collection as an ArrayList. This is the same as + toArray() but returns a collection instead of an array.
          +
          +
          Returns:
          +
          an ArrayList containing a copy of all elements in this + collection. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          Converts the collection to a string representation for debugging. + WARNING: The returned string may be very large.
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          Returns:
          +
          the string representation. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          size

          +
          public int size()
          +
          Description copied from class: StoredContainer
          +
          Returns a non-transactional count of the records in the collection or + map. This method conforms to the Collection.size() and + Map.size() interfaces. + + +

          This operation is faster than obtaining a count by scanning the + collection manually, and will not perturb the current contents of the + cache. However, the count is not guaranteed to be accurate if there are + concurrent updates.

          +
          +
          +
          Specified by:
          +
          size in interface java.util.Collection<E>
          +
          Specified by:
          +
          size in class StoredContainer
          +
          Returns:
          +
          the number of records. + +
          +
          +
        • +
        + + + +
          +
        • +

          join

          +
          public StoredIterator<E> join(StoredContainer[] indices,
          +                              java.lang.Object[] indexKeys,
          +                              JoinConfig joinConfig)
          +
          Returns an iterator representing an equality join of the indices and + index key values specified. + This method does not exist in the standard Collection interface. + +

          Warning: The iterator returned must be explicitly + closed using StoredIterator.close() or StoredIterator.close(java.util.Iterator) to release the underlying + database cursor resources.

          + +

          The returned iterator supports only the two methods: hasNext() and + next(). All other methods will throw UnsupportedOperationException.

          +
          +
          Parameters:
          +
          indices - is an array of indices with elements corresponding to + those in the indexKeys array.
          +
          indexKeys - is an array of index key values identifying the + elements to be selected.
          +
          joinConfig - is the join configuration, or null to use the + default configuration.
          +
          Returns:
          +
          an iterator over the elements in this collection that match + all specified index key values. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.IllegalArgumentException - if this collection is indexed or if a + given index does not have the same store as this collection.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredCollections.html b/docs/java/com/sleepycat/collections/StoredCollections.html new file mode 100644 index 0000000..a40d9b8 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredCollections.html @@ -0,0 +1,476 @@ + + + + + +StoredCollections (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredCollections

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.StoredCollections
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class StoredCollections
      +extends java.lang.Object
      +
      Static methods operating on collections and maps. + +

      This class consists exclusively of static methods that operate on or + return stored collections and maps, jointly called containers. It contains + methods for changing certain properties of a container. Because container + properties are immutable, these methods always return a new container + instance. This allows stored container instances to be used safely by + multiple threads. Creating the new container instance is not expensive and + creates only two new objects.

      + +

      When a container is created with a particular property, all containers + and iterators derived from that container will inherit the property. For + example, if a read-uncommitted Map is created then calls to its subMap(), + values(), entrySet(), and keySet() methods will create read-uncommitted + containers also.

      + +

      Method names beginning with "configured" create a new container with a + specified CursorConfig from a given stored container. This allows + configuring a container for read-committed isolation, read-uncommitted + isolation, or any other property supported by CursorConfig. + All operations performed with the resulting container will be performed with + the specified cursor configuration.

      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static <E> java.util.Collection<E>configuredCollection(java.util.Collection<E> storedCollection, + CursorConfig config) +
        Creates a configured collection from a given stored collection.
        +
        static <E> java.util.List<E>configuredList(java.util.List<E> storedList, + CursorConfig config) +
        Creates a configured list from a given stored list.
        +
        static <K,V> java.util.Map<K,V>configuredMap(java.util.Map<K,V> storedMap, + CursorConfig config) +
        Creates a configured map from a given stored map.
        +
        static <E> java.util.Set<E>configuredSet(java.util.Set<E> storedSet, + CursorConfig config) +
        Creates a configured set from a given stored set.
        +
        static <K,V> java.util.SortedMap<K,V>configuredSortedMap(java.util.SortedMap<K,V> storedSortedMap, + CursorConfig config) +
        Creates a configured sorted map from a given stored sorted map.
        +
        static <E> java.util.SortedSet<E>configuredSortedSet(java.util.SortedSet<E> storedSortedSet, + CursorConfig config) +
        Creates a configured sorted set from a given stored sorted set.
        +
        static <E> java.util.Iterator<E>iterator(java.util.Iterator<E> iter) +
        Clones an iterator preserving its current position.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          configuredCollection

          +
          public static <E> java.util.Collection<E> configuredCollection(java.util.Collection<E> storedCollection,
          +                                                               CursorConfig config)
          +
          Creates a configured collection from a given stored collection.
          +
          +
          Type Parameters:
          +
          E - the element class.
          +
          Parameters:
          +
          storedCollection - the base collection.
          +
          config - is the cursor configuration to be used for all operations + performed via the new collection instance; null may be specified to use + the default configuration.
          +
          Returns:
          +
          the configured collection.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given container is not a + StoredContainer.
          +
          +
        • +
        + + + +
          +
        • +

          configuredList

          +
          public static <E> java.util.List<E> configuredList(java.util.List<E> storedList,
          +                                                   CursorConfig config)
          +
          Creates a configured list from a given stored list. + +

          Note that this method may not be called in the JE product, since the + StoredList class is not supported.

          +
          +
          Type Parameters:
          +
          E - the element class.
          +
          Parameters:
          +
          storedList - the base list.
          +
          config - is the cursor configuration to be used for all operations + performed via the new list instance; null may be specified to use the + default configuration.
          +
          Returns:
          +
          the configured list.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given container is not a + StoredContainer.
          +
          +
        • +
        + + + +
          +
        • +

          configuredMap

          +
          public static <K,V> java.util.Map<K,V> configuredMap(java.util.Map<K,V> storedMap,
          +                                                     CursorConfig config)
          +
          Creates a configured map from a given stored map.
          +
          +
          Type Parameters:
          +
          K - the key class.
          +
          V - the value class.
          +
          Parameters:
          +
          storedMap - the base map.
          +
          config - is the cursor configuration to be used for all operations + performed via the new map instance; null may be specified to use the + default configuration.
          +
          Returns:
          +
          the configured map.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given container is not a + StoredContainer.
          +
          +
        • +
        + + + +
          +
        • +

          configuredSet

          +
          public static <E> java.util.Set<E> configuredSet(java.util.Set<E> storedSet,
          +                                                 CursorConfig config)
          +
          Creates a configured set from a given stored set.
          +
          +
          Type Parameters:
          +
          E - the element class.
          +
          Parameters:
          +
          storedSet - the base set.
          +
          config - is the cursor configuration to be used for all operations + performed via the new set instance; null may be specified to use the + default configuration.
          +
          Returns:
          +
          the configured set.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given container is not a + StoredContainer.
          +
          +
        • +
        + + + +
          +
        • +

          configuredSortedMap

          +
          public static <K,V> java.util.SortedMap<K,V> configuredSortedMap(java.util.SortedMap<K,V> storedSortedMap,
          +                                                                 CursorConfig config)
          +
          Creates a configured sorted map from a given stored sorted map.
          +
          +
          Type Parameters:
          +
          K - the key class.
          +
          V - the value class.
          +
          Parameters:
          +
          storedSortedMap - the base map.
          +
          config - is the cursor configuration to be used for all operations + performed via the new map instance; null may be specified to use the + default configuration.
          +
          Returns:
          +
          the configured map.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given container is not a + StoredContainer.
          +
          +
        • +
        + + + +
          +
        • +

          configuredSortedSet

          +
          public static <E> java.util.SortedSet<E> configuredSortedSet(java.util.SortedSet<E> storedSortedSet,
          +                                                             CursorConfig config)
          +
          Creates a configured sorted set from a given stored sorted set.
          +
          +
          Type Parameters:
          +
          E - the element class.
          +
          Parameters:
          +
          storedSortedSet - the base set.
          +
          config - is the cursor configuration to be used for all operations + performed via the new set instance; null may be specified to use the + default configuration.
          +
          Returns:
          +
          the configured set.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given container is not a + StoredContainer.
          +
          +
        • +
        + + + +
          +
        • +

          iterator

          +
          public static <E> java.util.Iterator<E> iterator(java.util.Iterator<E> iter)
          +
          Clones an iterator preserving its current position.
          +
          +
          Type Parameters:
          +
          E - the element class.
          +
          Parameters:
          +
          iter - an iterator to clone.
          +
          Returns:
          +
          a new Iterator having the same position as the given + iterator.
          +
          Throws:
          +
          java.lang.ClassCastException - if the given iterator was not obtained via a + StoredCollection method.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredContainer.html b/docs/java/com/sleepycat/collections/StoredContainer.html new file mode 100644 index 0000000..5b8fe1b --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredContainer.html @@ -0,0 +1,599 @@ + + + + + +StoredContainer (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredContainer

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.StoredContainer
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods Concrete Methods 
        Modifier and TypeMethod and Description
        booleanareDuplicatesAllowed() +
        Returns whether duplicate keys are allowed in this container.
        +
        booleanareDuplicatesOrdered() +
        Returns whether duplicate keys are allowed and sorted by element value.
        +
        booleanareKeyRangesAllowed() +
        Returns whether key ranges are allowed in this container.
        +
        booleanareKeysRenumbered() +
        Returns whether keys are renumbered when insertions and deletions occur.
        +
        voidclear() +
        Removes all mappings or elements from this map or collection (optional + operation).
        +
        CursorConfiggetCursorConfig() +
        Returns the cursor configuration that is used for all operations + performed via this container.
        +
        booleanisEmpty() +
        Returns true if this map or collection contains no mappings or elements.
        +
        booleanisOrdered() +
        Returns whether keys are ordered in this container.
        +
        booleanisSecondary() +
        Returns whether this container is a view on a secondary database rather + than directly on a primary database.
        +
        booleanisTransactional() +
        Returns whether the databases underlying this container are + transactional.
        +
        booleanisWriteAllowed() +
        Returns true if this is a read-write container or false if this is a + read-only container.
        +
        abstract intsize() +
        Returns a non-transactional count of the records in the collection or + map.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          isWriteAllowed

          +
          public final boolean isWriteAllowed()
          +
          Returns true if this is a read-write container or false if this is a + read-only container. + This method does not exist in the standard Map or + Collection interfaces.
          +
          +
          Returns:
          +
          whether write is allowed.
          +
          +
        • +
        + + + +
          +
        • +

          getCursorConfig

          +
          public final CursorConfig getCursorConfig()
          +
          Returns the cursor configuration that is used for all operations + performed via this container. + For example, if CursorConfig.getReadUncommitted returns + true, data will be read that is modified but not committed. + This method does not exist in the standard Map or + Collection interfaces.
          +
          +
          Returns:
          +
          the cursor configuration, or null if no configuration has been + specified.
          +
          +
        • +
        + + + +
          +
        • +

          isTransactional

          +
          public final boolean isTransactional()
          +
          Returns whether the databases underlying this container are + transactional. + Even in a transactional environment, a database will be transactional + only if it was opened within a transaction or if the auto-commit option + was specified when it was opened. + This method does not exist in the standard Map or + Collection interfaces.
          +
          +
          Returns:
          +
          whether the database is transactional.
          +
          +
        • +
        + + + +
          +
        • +

          areDuplicatesAllowed

          +
          public final boolean areDuplicatesAllowed()
          +
          Returns whether duplicate keys are allowed in this container. + Duplicates are optionally allowed for HASH and BTREE databases. + This method does not exist in the standard Map or + Collection interfaces. + +

          Note that the JE product only supports BTREE databases.

          +
          +
          Returns:
          +
          whether duplicates are allowed.
          +
          +
        • +
        + + + +
          +
        • +

          areDuplicatesOrdered

          +
          public final boolean areDuplicatesOrdered()
          +
          Returns whether duplicate keys are allowed and sorted by element value. + Duplicates are optionally sorted for HASH and BTREE databases. + This method does not exist in the standard Map or + Collection interfaces. + +

          Note that the JE product only supports BTREE databases, and + duplicates are always sorted.

          +
          +
          Returns:
          +
          whether duplicates are ordered.
          +
          +
        • +
        + + + +
          +
        • +

          areKeysRenumbered

          +
          public final boolean areKeysRenumbered()
          +
          Returns whether keys are renumbered when insertions and deletions occur. + Keys are optionally renumbered for RECNO databases. + This method does not exist in the standard Map or + Collection interfaces. + +

          Note that the JE product does not support RECNO databases, and + therefore keys are never renumbered.

          +
          +
          Returns:
          +
          whether keys are renumbered.
          +
          +
        • +
        + + + +
          +
        • +

          isOrdered

          +
          public final boolean isOrdered()
          +
          Returns whether keys are ordered in this container. + Keys are ordered for BTREE, RECNO and QUEUE databases. + This method does not exist in the standard Map or + Collection interfaces. + +

          Note that the JE product only support BTREE databases, and + therefore keys are always ordered.

          +
          +
          Returns:
          +
          whether keys are ordered.
          +
          +
        • +
        + + + +
          +
        • +

          areKeyRangesAllowed

          +
          public final boolean areKeyRangesAllowed()
          +
          Returns whether key ranges are allowed in this container. + Key ranges are allowed only for BTREE databases. + This method does not exist in the standard Map or + Collection interfaces. + +

          Note that the JE product only supports BTREE databases, and + therefore key ranges are always allowed.

          +
          +
          Returns:
          +
          whether keys are ordered.
          +
          +
        • +
        + + + +
          +
        • +

          isSecondary

          +
          public final boolean isSecondary()
          +
          Returns whether this container is a view on a secondary database rather + than directly on a primary database. + This method does not exist in the standard Map or + Collection interfaces.
          +
          +
          Returns:
          +
          whether the view is for a secondary database.
          +
          +
        • +
        + + + +
          +
        • +

          size

          +
          public abstract int size()
          +
          Returns a non-transactional count of the records in the collection or + map. This method conforms to the Collection.size() and + Map.size() interfaces. + + +

          This operation is faster than obtaining a count by scanning the + collection manually, and will not perturb the current contents of the + cache. However, the count is not guaranteed to be accurate if there are + concurrent updates.

          +
          +
          +
          Returns:
          +
          the number of records. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          isEmpty

          +
          public boolean isEmpty()
          +
          Returns true if this map or collection contains no mappings or elements. + This method conforms to the Collection.isEmpty() and + Map.isEmpty() interfaces.
          +
          +
          Returns:
          +
          whether the container is empty. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          clear

          +
          public void clear()
          +
          Removes all mappings or elements from this map or collection (optional + operation). + This method conforms to the Collection.clear() and + Map.clear() interfaces. + +
          +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the container is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredEntrySet.html b/docs/java/com/sleepycat/collections/StoredEntrySet.html new file mode 100644 index 0000000..374b038 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredEntrySet.html @@ -0,0 +1,460 @@ + + + + + +StoredEntrySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredEntrySet<K,V>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.lang.Iterable<java.util.Map.Entry<K,V>>, java.util.Collection<java.util.Map.Entry<K,V>>, java.util.Set<java.util.Map.Entry<K,V>>
      +
      +
      +
      Direct Known Subclasses:
      +
      StoredSortedEntrySet
      +
      +
      +
      +
      public class StoredEntrySet<K,V>
      +extends StoredCollection<java.util.Map.Entry<K,V>>
      +implements java.util.Set<java.util.Map.Entry<K,V>>
      +
      The Set returned by Map.entrySet(). This class may not be instantiated + directly. Contrary to what is stated by Map.entrySet() this class + does support the add(java.util.Map.Entry<K, V>) and StoredCollection.addAll(java.util.Collection<? extends E>) methods. + +

      The Map.Entry.setValue(V) method of the Map.Entry objects + that are returned by this class and its iterators behaves just as the StoredIterator.set(E) method does.

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          add

          +
          public boolean add(java.util.Map.Entry<K,V> mapEntry)
          +
          Adds the specified element to this set if it is not already present + (optional operation). + This method conforms to the Set.add(E) interface.
          +
          +
          Specified by:
          +
          add in interface java.util.Collection<java.util.Map.Entry<K,V>>
          +
          Specified by:
          +
          add in interface java.util.Set<java.util.Map.Entry<K,V>>
          +
          Parameters:
          +
          mapEntry - must be a Map.Entry instance.
          +
          Returns:
          +
          true if the key-value pair was added to the set (and was not + previously present). + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          java.lang.ClassCastException - if the mapEntry is not a Map.Entry instance.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public boolean remove(java.lang.Object mapEntry)
          +
          Removes the specified element from this set if it is present (optional + operation). + This method conforms to the Set.remove(java.lang.Object) interface.
          +
          +
          Specified by:
          +
          remove in interface java.util.Collection<java.util.Map.Entry<K,V>>
          +
          Specified by:
          +
          remove in interface java.util.Set<java.util.Map.Entry<K,V>>
          +
          Parameters:
          +
          mapEntry - is a Map.Entry instance to be removed.
          +
          Returns:
          +
          true if the key-value pair was removed from the set, or false if + the mapEntry is not a Map.Entry instance or is not + present in the set. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          contains

          +
          public boolean contains(java.lang.Object mapEntry)
          +
          Returns true if this set contains the specified element. + This method conforms to the Set.contains(java.lang.Object) interface.
          +
          +
          Specified by:
          +
          contains in interface java.util.Collection<java.util.Map.Entry<K,V>>
          +
          Specified by:
          +
          contains in interface java.util.Set<java.util.Map.Entry<K,V>>
          +
          Parameters:
          +
          mapEntry - is a Map.Entry instance to be checked.
          +
          Returns:
          +
          true if the key-value pair is present in the set, or false if + the mapEntry is not a Map.Entry instance or is not + present in the set. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          Description copied from class: StoredCollection
          +
          Converts the collection to a string representation for debugging. + WARNING: The returned string may be very large.
          +
          +
          Overrides:
          +
          toString in class StoredCollection<java.util.Map.Entry<K,V>>
          +
          Returns:
          +
          the string representation. + +
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredIterator.html b/docs/java/com/sleepycat/collections/StoredIterator.html new file mode 100644 index 0000000..886a2c9 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredIterator.html @@ -0,0 +1,807 @@ + + + + + +StoredIterator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredIterator<E>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.StoredIterator<E>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Closeable, java.lang.AutoCloseable, java.lang.Cloneable, java.util.Iterator<E>, java.util.ListIterator<E>
      +
      +
      +
      +
      public class StoredIterator<E>
      +extends java.lang.Object
      +implements java.util.ListIterator<E>, java.lang.Cloneable, java.io.Closeable
      +
      The Iterator returned by all stored collections. + +

      While in general this class conforms to the Iterator interface, + it is important to note that all iterators for stored collections must be + explicitly closed with close(). The static method close(java.util.Iterator) allows calling close for all iterators without + harm to iterators that are not from stored collections, and also avoids + casting. If a stored iterator is not closed, unpredictable behavior + including process death may result.

      + +

      This class implements the Iterator interface for all stored + iterators. It also implements ListIterator because some list + iterator methods apply to all stored iterators, for example, previous() and hasPrevious(). Other list iterator methods are always + supported for lists, but for other types of collections are only supported + under certain conditions. See nextIndex(), previousIndex(), + add(E) and set(E) for details.

      + +

      In addition, this class provides the following methods for stored + collection iterators only. Note that the use of these methods is not + compatible with the standard Java collections interface.

      +
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidadd(E value) +
        Inserts the specified element into the list or inserts a duplicate into + other types of collections (optional operation).
        +
        voidclose() +
        Closes this iterator.
        +
        static voidclose(java.util.Iterator<?> i) +
        Closes the given iterator using close() if it is a StoredIterator.
        +
        intcount() +
        Returns the number of elements having the same key value as the key + value of the element last returned by next() or previous().
        +
        StoredCollection<E>getCollection() +
        Returns the collection associated with this iterator.
        +
        booleanhasNext() +
        Returns true if this iterator has more elements when traversing in the + forward direction.
        +
        booleanhasPrevious() +
        Returns true if this iterator has more elements when traversing in the + reverse direction.
        +
        booleanisReadModifyWrite() +
        Returns whether write-locks will be obtained when reading with this + cursor.
        +
        Enext() +
        Returns the next element in the iteration.
        +
        intnextIndex() +
        Returns the index of the element that would be returned by a subsequent + call to next.
        +
        Eprevious() +
        Returns the next element in the iteration.
        +
        intpreviousIndex() +
        Returns the index of the element that would be returned by a subsequent + call to previous.
        +
        voidremove() +
        Removes the last element that was returned by next or previous (optional + operation).
        +
        voidset(E value) +
        Replaces the last element returned by next or previous with the + specified element (optional operation).
        +
        voidsetReadModifyWrite(boolean lockForWrite) +
        Changes whether write-locks will be obtained when reading with this + cursor.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Iterator

          +forEachRemaining
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          close

          +
          public static void close(java.util.Iterator<?> i)
          +
          Closes the given iterator using close() if it is a StoredIterator. If the given iterator is not a StoredIterator, + this method does nothing.
          +
          +
          Parameters:
          +
          i - is the iterator to close.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          isReadModifyWrite

          +
          public final boolean isReadModifyWrite()
          +
          Returns whether write-locks will be obtained when reading with this + cursor. + Obtaining write-locks can prevent deadlocks when reading and then + modifying data.
          +
          +
          Returns:
          +
          the write-lock setting.
          +
          +
        • +
        + + + +
          +
        • +

          setReadModifyWrite

          +
          public void setReadModifyWrite(boolean lockForWrite)
          +
          Changes whether write-locks will be obtained when reading with this + cursor. + Obtaining write-locks can prevent deadlocks when reading and then + modifying data.
          +
          +
          Parameters:
          +
          lockForWrite - the write-lock setting.
          +
          +
        • +
        + + + +
          +
        • +

          hasNext

          +
          public boolean hasNext()
          +
          Returns true if this iterator has more elements when traversing in the + forward direction. False is returned if the iterator has been closed. + This method conforms to the Iterator.hasNext() interface.
          +
          +
          Specified by:
          +
          hasNext in interface java.util.Iterator<E>
          +
          Specified by:
          +
          hasNext in interface java.util.ListIterator<E>
          +
          Returns:
          +
          whether next() will succeed. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          hasPrevious

          +
          public boolean hasPrevious()
          +
          Returns true if this iterator has more elements when traversing in the + reverse direction. It returns false if the iterator has been closed. + This method conforms to the ListIterator.hasPrevious() interface.
          +
          +
          Specified by:
          +
          hasPrevious in interface java.util.ListIterator<E>
          +
          Returns:
          +
          whether previous() will succeed. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          next

          +
          public E next()
          +
          Returns the next element in the iteration. + This method conforms to the Iterator.next() interface.
          +
          +
          Specified by:
          +
          next in interface java.util.Iterator<E>
          +
          Specified by:
          +
          next in interface java.util.ListIterator<E>
          +
          Returns:
          +
          the next element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          previous

          +
          public E previous()
          +
          Returns the next element in the iteration. + This method conforms to the ListIterator.previous() interface.
          +
          +
          Specified by:
          +
          previous in interface java.util.ListIterator<E>
          +
          Returns:
          +
          the previous element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          nextIndex

          +
          public int nextIndex()
          +
          Returns the index of the element that would be returned by a subsequent + call to next. + This method conforms to the ListIterator.nextIndex() interface + except that it returns Integer.MAX_VALUE for stored lists when + positioned at the end of the list, rather than returning the list size + as specified by the ListIterator interface. This is because the database + size is not available.
          +
          +
          Specified by:
          +
          nextIndex in interface java.util.ListIterator<E>
          +
          Returns:
          +
          the next index. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if this iterator's collection does + not use record number keys.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          previousIndex

          +
          public int previousIndex()
          +
          Returns the index of the element that would be returned by a subsequent + call to previous. + This method conforms to the ListIterator.previousIndex() + interface.
          +
          +
          Specified by:
          +
          previousIndex in interface java.util.ListIterator<E>
          +
          Returns:
          +
          the previous index. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if this iterator's collection does + not use record number keys.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          set

          +
          public void set(E value)
          +
          Replaces the last element returned by next or previous with the + specified element (optional operation). + This method conforms to the ListIterator.set(E) interface. + +

          In order to call this method, if the underlying Database is + transactional then a transaction must be active when creating the + iterator.

          +
          +
          Specified by:
          +
          set in interface java.util.ListIterator<E>
          +
          Parameters:
          +
          value - the new value. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is a StoredKeySet (the set returned by Map.keySet()), or if + duplicates are sorted since this would change the iterator position, or + if the collection is indexed, or if the collection is read-only.
          +
          java.lang.IllegalArgumentException - if an entity value binding is used and + the primary key of the value given is different than the existing stored + primary key.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public void remove()
          +
          Removes the last element that was returned by next or previous (optional + operation). + This method conforms to the ListIterator.remove() interface except + that when the collection is a list and the RECNO-RENUMBER access method + is not used, list indices will not be renumbered. + +

          In order to call this method, if the underlying Database is + transactional then a transaction must be active when creating the + iterator.

          + +

          Note that for the JE product, RECNO-RENUMBER databases are not + supported, and therefore list indices are never renumbered by this + method.

          + +
          +
          +
          Specified by:
          +
          remove in interface java.util.Iterator<E>
          +
          Specified by:
          +
          remove in interface java.util.ListIterator<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is a sublist, or + if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          add

          +
          public void add(E value)
          +
          Inserts the specified element into the list or inserts a duplicate into + other types of collections (optional operation). + This method conforms to the ListIterator.add(E) interface when + the collection is a list and the RECNO-RENUMBER access method is used. + Otherwise, this method may only be called when duplicates are allowed. + If duplicates are unsorted, the new value will be inserted in the same + manner as list elements. + If duplicates are sorted, the new value will be inserted in sort order. + +

          Note that for the JE product, RECNO-RENUMBER databases are not + supported, and therefore this method may only be used to add + duplicates.

          +
          +
          Specified by:
          +
          add in interface java.util.ListIterator<E>
          +
          Parameters:
          +
          value - the new value. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is a sublist, or + if the collection is indexed, or if the collection is read-only, or if + the collection is a list and the RECNO-RENUMBER access method was not + used, or if the collection is not a list and duplicates are not allowed.
          +
          java.lang.IllegalStateException - if the collection is empty and is not a + list with RECNO-RENUMBER access.
          +
          java.lang.IllegalArgumentException - if a duplicate value is being added + that already exists and duplicates are sorted.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          count

          +
          public int count()
          +
          Returns the number of elements having the same key value as the key + value of the element last returned by next() or previous(). If no + duplicates are allowed, 1 is always returned. + This method does not exist in the standard Iterator or ListIterator interfaces. + +
          +
          +
          Returns:
          +
          the number of duplicates.
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.IllegalStateException - if next() or previous() has not been + called for this iterator, or if remove() or add() were called after + the last call to next() or previous().
          +
          +
        • +
        + + + +
          +
        • +

          close

          +
          public void close()
          +
          Closes this iterator. + This method does not exist in the standard Iterator or ListIterator interfaces. + +

          After being closed, only the hasNext() and hasPrevious() methods may be called and these will return false. close() may also be called again and will do nothing. If other + methods are called a NullPointerException will generally be + thrown.

          +
          +
          Specified by:
          +
          close in interface java.io.Closeable
          +
          Specified by:
          +
          close in interface java.lang.AutoCloseable
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          getCollection

          +
          public final StoredCollection<E> getCollection()
          +
          Returns the collection associated with this iterator. + This method does not exist in the standard Iterator or ListIterator interfaces.
          +
          +
          Returns:
          +
          the collection associated with this iterator.
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredKeySet.html b/docs/java/com/sleepycat/collections/StoredKeySet.html new file mode 100644 index 0000000..eab8422 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredKeySet.html @@ -0,0 +1,480 @@ + + + + + +StoredKeySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredKeySet<K>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.lang.Iterable<K>, java.util.Collection<K>, java.util.Set<K>
      +
      +
      +
      Direct Known Subclasses:
      +
      StoredSortedKeySet
      +
      +
      +
      +
      public class StoredKeySet<K>
      +extends StoredCollection<K>
      +implements java.util.Set<K>
      +
      The Set returned by Map.keySet() and which can also be constructed directly + if a Map is not needed. + Since this collection is a set it only contains one element for each key, + even when duplicates are allowed. Key set iterators are therefore + particularly useful for enumerating the unique keys of a store or index that + allows duplicates.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredKeySet

          +
          public StoredKeySet(Database database,
          +                    EntryBinding<K> keyBinding,
          +                    boolean writeAllowed)
          +
          Creates a key set view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          add

          +
          public boolean add(K key)
          +
          Adds the specified key to this set if it is not already present + (optional operation). + This method conforms to the Set.add(E) interface. + +

          WARNING: When a key is added the value in the underlying data store + will be empty, i.e., the byte array will be zero length. Such a record + cannot be accessed using the Map interface unless the value binding + supports zero length byte arrays.

          + +
          +
          +
          Specified by:
          +
          add in interface java.util.Collection<K>
          +
          Specified by:
          +
          add in interface java.util.Set<K>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is indexed, or + if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public boolean remove(java.lang.Object key)
          +
          Removes the specified key from this set if it is present (optional + operation). + If duplicates are allowed, this method removes all duplicates for the + given key. + This method conforms to the Set.remove(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          remove in interface java.util.Collection<K>
          +
          Specified by:
          +
          remove in interface java.util.Set<K>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          contains

          +
          public boolean contains(java.lang.Object key)
          +
          Returns true if this set contains the specified key. + This method conforms to the Set.contains(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          contains in interface java.util.Collection<K>
          +
          Specified by:
          +
          contains in interface java.util.Set<K>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredMap.html b/docs/java/com/sleepycat/collections/StoredMap.html new file mode 100644 index 0000000..afe5322 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredMap.html @@ -0,0 +1,1190 @@ + + + + + +StoredMap (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredMap<K,V>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.util.concurrent.ConcurrentMap<K,V>, java.util.Map<K,V>
      +
      +
      +
      Direct Known Subclasses:
      +
      StoredSortedMap
      +
      +
      +
      +
      public class StoredMap<K,V>
      +extends StoredContainer
      +implements java.util.concurrent.ConcurrentMap<K,V>
      +
      A Map view of a Database. + +

      In addition to the standard Map methods, this class provides the + following methods for stored maps only. Note that the use of these methods + is not compatible with the standard Java collections interface.

      +
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Nested Class Summary

        +
          +
        • + + +

          Nested classes/interfaces inherited from interface java.util.Map

          +java.util.Map.Entry<K,V>
        • +
        +
      • +
      + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        Kappend(V value) +
        Appends a given value returning the newly assigned key.
        +
        booleancontainsKey(java.lang.Object key) +
        Returns true if this map contains the specified key.
        +
        booleancontainsValue(java.lang.Object value) +
        Returns true if this map contains the specified value.
        +
        java.util.Collection<V>duplicates(K key) +
        Returns a new collection containing the values mapped to the given key + in this map.
        +
        <PK> java.util.Map<PK,V>duplicatesMap(K secondaryKey, + EntryBinding primaryKeyBinding) +
        Returns a new map from primary key to value for the subset of records + having a given secondary key (duplicates).
        +
        java.util.Set<java.util.Map.Entry<K,V>>entrySet() +
        Returns a set view of the mappings contained in this map.
        +
        booleanequals(java.lang.Object other) +
        Compares the specified object with this map for equality.
        +
        Vget(java.lang.Object key) +
        Returns the value to which this map maps the specified key.
        +
        inthashCode() 
        java.util.Set<K>keySet() +
        Returns a set view of the keys contained in this map.
        +
        Vput(K key, + V value) +
        Associates the specified value with the specified key in this map + (optional operation).
        +
        voidputAll(java.util.Map<? extends K,? extends V> map) +
        Copies all of the mappings from the specified map to this map (optional + operation).
        +
        VputIfAbsent(K key, + V value) +
        If the specified key is not already associated with a value, associate + it with the given value.
        +
        Vremove(java.lang.Object key) +
        Removes the mapping for this key from this map if present (optional + operation).
        +
        booleanremove(java.lang.Object key, + java.lang.Object value) +
        Remove entry for key only if currently mapped to given value.
        +
        Vreplace(K key, + V value) +
        Replace entry for key only if currently mapped to some value.
        +
        booleanreplace(K key, + V oldValue, + V newValue) +
        Replace entry for key only if currently mapped to given value.
        +
        intsize() +
        Returns a non-transactional count of the records in the collection or + map.
        +
        java.lang.StringtoString() +
        Converts the map to a string representation for debugging.
        +
        java.util.Collection<V>values() +
        Returns a collection view of the values contained in this map.
        +
        + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.concurrent.ConcurrentMap

          +compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, replaceAll
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Map

          +clear, isEmpty
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredMap

          +
          public StoredMap(Database database,
          +                 EntryBinding<K> keyBinding,
          +                 EntryBinding<V> valueBinding,
          +                 boolean writeAllowed)
          +
          Creates a map view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueBinding - is the binding used to translate between value + buffers and value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredMap

          +
          public StoredMap(Database database,
          +                 EntryBinding<K> keyBinding,
          +                 EntryBinding<V> valueBinding,
          +                 PrimaryKeyAssigner keyAssigner)
          +
          Creates a map view of a Database with a PrimaryKeyAssigner. Writing is allowed for the created map.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueBinding - is the binding used to translate between value + buffers and value objects.
          +
          keyAssigner - is used by the append(V) method to assign + primary keys.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredMap

          +
          public StoredMap(Database database,
          +                 EntryBinding<K> keyBinding,
          +                 EntityBinding<V> valueEntityBinding,
          +                 boolean writeAllowed)
          +
          Creates a map entity view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueEntityBinding - is the binding used to translate between + key/value buffers and entity value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredMap

          +
          public StoredMap(Database database,
          +                 EntryBinding<K> keyBinding,
          +                 EntityBinding<V> valueEntityBinding,
          +                 PrimaryKeyAssigner keyAssigner)
          +
          Creates a map entity view of a Database with a PrimaryKeyAssigner. Writing is allowed for the created map.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueEntityBinding - is the binding used to translate between + key/value buffers and entity value objects.
          +
          keyAssigner - is used by the append(V) method to assign + primary keys.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          get

          +
          public V get(java.lang.Object key)
          +
          Returns the value to which this map maps the specified key. If + duplicates are allowed, this method returns the first duplicate, in the + order in which duplicates are configured, that maps to the specified + key. + + This method conforms to the Map.get(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          get in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          put

          +
          public V put(K key,
          +             V value)
          +
          Associates the specified value with the specified key in this map + (optional operation). If duplicates are allowed and the specified key + is already mapped to a value, this method appends the new duplicate + after the existing duplicates. This method conforms to the Map.put(K, V) interface. + +

          The key parameter may be null if an entity binding is used and the + key will be derived from the value (entity) parameter. If an entity + binding is used and the key parameter is non-null, then the key + parameter must be equal to the key derived from the value parameter.

          +
          +
          Specified by:
          +
          put in interface java.util.Map<K,V>
          +
          Returns:
          +
          the previous value associated with specified key, or null if + there was no mapping for the key or if duplicates are allowed. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is indexed, or + if the collection is read-only.
          +
          java.lang.IllegalArgumentException - if an entity value binding is used and + the primary key of the value given is different than the existing stored + primary key.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          append

          +
          public K append(V value)
          +
          Appends a given value returning the newly assigned key. If a PrimaryKeyAssigner is associated with Store for this map, it will be + used to assigned the returned key. Otherwise the Store must be a QUEUE + or RECNO database and the next available record number is assigned as + the key. This method does not exist in the standard Map + interface. + +

          Note that for the JE product, QUEUE and RECNO databases are not + supported, and therefore a PrimaryKeyAssigner must be associated with + the map in order to call this method.

          +
          +
          Parameters:
          +
          value - the value to be appended.
          +
          Returns:
          +
          the assigned key. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is indexed, or + if the collection is read-only, or if the Store has no PrimaryKeyAssigner and is not a QUEUE or RECNO database.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public V remove(java.lang.Object key)
          +
          Removes the mapping for this key from this map if present (optional + operation). If duplicates are allowed, this method removes all + duplicates for the given key. This method conforms to the Map.remove(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          remove in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          putIfAbsent

          +
          public V putIfAbsent(K key,
          +                     V value)
          +
          If the specified key is not already associated with a value, associate + it with the given value. This method conforms to the ConcurrentMap.putIfAbsent(K, V) interface. + +
          +
          +
          Specified by:
          +
          putIfAbsent in interface java.util.concurrent.ConcurrentMap<K,V>
          +
          Specified by:
          +
          putIfAbsent in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public boolean remove(java.lang.Object key,
          +                      java.lang.Object value)
          +
          Remove entry for key only if currently mapped to given value. This + method conforms to the ConcurrentMap.remove(Object,Object) + interface. + +
          +
          +
          Specified by:
          +
          remove in interface java.util.concurrent.ConcurrentMap<K,V>
          +
          Specified by:
          +
          remove in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          replace

          +
          public V replace(K key,
          +                 V value)
          +
          Replace entry for key only if currently mapped to some value. This + method conforms to the ConcurrentMap.replace(Object,Object) + interface. + +
          +
          +
          Specified by:
          +
          replace in interface java.util.concurrent.ConcurrentMap<K,V>
          +
          Specified by:
          +
          replace in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          replace

          +
          public boolean replace(K key,
          +                       V oldValue,
          +                       V newValue)
          +
          Replace entry for key only if currently mapped to given value. This + method conforms to the ConcurrentMap.replace(Object,Object,Object) interface. + +
          +
          +
          Specified by:
          +
          replace in interface java.util.concurrent.ConcurrentMap<K,V>
          +
          Specified by:
          +
          replace in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          containsKey

          +
          public boolean containsKey(java.lang.Object key)
          +
          Returns true if this map contains the specified key. This method + conforms to the Map.containsKey(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          containsKey in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          containsValue

          +
          public boolean containsValue(java.lang.Object value)
          +
          Returns true if this map contains the specified value. When an entity + binding is used, this method returns whether the map contains the + primary key and value mapping of the entity. This method conforms to + the Map.containsValue(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          containsValue in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          putAll

          +
          public void putAll(java.util.Map<? extends K,? extends V> map)
          +
          Copies all of the mappings from the specified map to this map (optional + operation). When duplicates are allowed, the mappings in the specified + map are effectively appended to the existing mappings in this map, that + is no previously existing mappings in this map are replaced. This + method conforms to the Map.putAll(java.util.Map<? extends K, ? extends V>) interface. + +
          +
          +
          Specified by:
          +
          putAll in interface java.util.Map<K,V>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only, or + if the collection is indexed.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          keySet

          +
          public java.util.Set<K> keySet()
          +
          Returns a set view of the keys contained in this map. A SortedSet is returned if the map supports key ranges. The + returned collection will be read-only if the map is read-only. This + method conforms to the Map.keySet() interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          keySet in interface java.util.Map<K,V>
          +
          Returns:
          +
          a StoredKeySet or a StoredSortedKeySet for this + map.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          See Also:
          +
          StoredContainer.areKeyRangesAllowed(), +StoredContainer.isWriteAllowed()
          +
          +
        • +
        + + + +
          +
        • +

          entrySet

          +
          public java.util.Set<java.util.Map.Entry<K,V>> entrySet()
          +
          Returns a set view of the mappings contained in this map. A SortedSet is returned if the map supports key ranges. The + returned collection will be read-only if the map is read-only. This + method conforms to the Map.entrySet() interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          entrySet in interface java.util.Map<K,V>
          +
          Returns:
          +
          a StoredEntrySet or a StoredSortedEntrySet for + this map.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          See Also:
          +
          StoredContainer.areKeyRangesAllowed(), +StoredContainer.isWriteAllowed()
          +
          +
        • +
        + + + +
          +
        • +

          values

          +
          public java.util.Collection<V> values()
          +
          Returns a collection view of the values contained in this map. A SortedSet is returned if the map supports key ranges and the + value/entity binding can be used to derive the map's key from its + value/entity object. The returned collection will be read-only if the + map is read-only. This method conforms to the Map.values() + interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          values in interface java.util.Map<K,V>
          +
          Returns:
          +
          a StoredValueSet or a StoredSortedValueSet for + this map.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          See Also:
          +
          StoredContainer.areKeyRangesAllowed(), +StoredContainer.isWriteAllowed()
          +
          +
        • +
        + + + + + +
          +
        • +

          duplicates

          +
          public java.util.Collection<V> duplicates(K key)
          +
          Returns a new collection containing the values mapped to the given key + in this map. This collection's iterator() method is particularly useful + for iterating over the duplicates for a given key, since this is not + supported by the standard Map interface. This method does not exist in + the standard Map interface. + +

          If no mapping for the given key is present, an empty collection is + returned. If duplicates are not allowed, at most a single value will be + in the collection returned. If duplicates are allowed, the returned + collection's add() method may be used to add values for the given + key.

          +
          +
          Parameters:
          +
          key - is the key for which values are to be returned.
          +
          Returns:
          +
          the new collection.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          duplicatesMap

          +
          public <PK> java.util.Map<PK,V> duplicatesMap(K secondaryKey,
          +                                              EntryBinding primaryKeyBinding)
          +
          Returns a new map from primary key to value for the subset of records + having a given secondary key (duplicates). This method does not exist + in the standard Map interface. + +

          If no mapping for the given key is present, an empty collection is + returned. If duplicates are not allowed, at most a single value will be + in the collection returned. If duplicates are allowed, the returned + collection's add() method may be used to add values for the given + key.

          +
          +
          Type Parameters:
          +
          PK - the primary key class.
          +
          Parameters:
          +
          secondaryKey - is the secondary key for which duplicates values + will be represented by the returned map.
          +
          primaryKeyBinding - is the binding used for keys in the returned + map.
          +
          Returns:
          +
          the new map.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          equals

          +
          public boolean equals(java.lang.Object other)
          +
          Compares the specified object with this map for equality. A value + comparison is performed by this method and the stored values are + compared rather than calling the equals() method of each element. This + method conforms to the Map.equals(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          equals in interface java.util.Map<K,V>
          +
          Overrides:
          +
          equals in class java.lang.Object
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          +
          Specified by:
          +
          hashCode in interface java.util.Map<K,V>
          +
          Overrides:
          +
          hashCode in class java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          size

          +
          public int size()
          +
          Description copied from class: StoredContainer
          +
          Returns a non-transactional count of the records in the collection or + map. This method conforms to the Collection.size() and + Map.size() interfaces. + + +

          This operation is faster than obtaining a count by scanning the + collection manually, and will not perturb the current contents of the + cache. However, the count is not guaranteed to be accurate if there are + concurrent updates.

          +
          +
          +
          Specified by:
          +
          size in interface java.util.Map<K,V>
          +
          Specified by:
          +
          size in class StoredContainer
          +
          Returns:
          +
          the number of records. + +
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          Converts the map to a string representation for debugging. WARNING: All + mappings will be converted to strings and returned and therefore the + returned string may be very large.
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          Returns:
          +
          the string representation.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredSortedEntrySet.html b/docs/java/com/sleepycat/collections/StoredSortedEntrySet.html new file mode 100644 index 0000000..59b2aac --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredSortedEntrySet.html @@ -0,0 +1,638 @@ + + + + + +StoredSortedEntrySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredSortedEntrySet<K,V>

    +
    +
    + +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.util.Comparator<? super java.util.Map.Entry<K,V>>comparator() +
        Returns null since comparators are not supported.
        +
        java.util.Map.Entry<K,V>first() +
        Returns the first (lowest) element currently in this sorted set.
        +
        java.util.SortedSet<java.util.Map.Entry<K,V>>headSet(java.util.Map.Entry<K,V> toMapEntry) +
        Returns a view of the portion of this sorted set whose elements are + strictly less than toMapEntry.
        +
        java.util.SortedSet<java.util.Map.Entry<K,V>>headSet(java.util.Map.Entry<K,V> toMapEntry, + boolean toInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly less than toMapEntry, optionally including toMapEntry.
        +
        java.util.Map.Entry<K,V>last() +
        Returns the last (highest) element currently in this sorted set.
        +
        java.util.SortedSet<java.util.Map.Entry<K,V>>subSet(java.util.Map.Entry<K,V> fromMapEntry, + boolean fromInclusive, + java.util.Map.Entry<K,V> toMapEntry, + boolean toInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly greater than fromMapEntry and strictly less than toMapEntry, + optionally including fromMapEntry and toMapEntry.
        +
        java.util.SortedSet<java.util.Map.Entry<K,V>>subSet(java.util.Map.Entry<K,V> fromMapEntry, + java.util.Map.Entry<K,V> toMapEntry) +
        Returns a view of the portion of this sorted set whose elements range + from fromMapEntry, inclusive, to toMapEntry, exclusive.
        +
        java.util.SortedSet<java.util.Map.Entry<K,V>>tailSet(java.util.Map.Entry<K,V> fromMapEntry) +
        Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromMapEntry.
        +
        java.util.SortedSet<java.util.Map.Entry<K,V>>tailSet(java.util.Map.Entry<K,V> fromMapEntry, + boolean fromInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly greater than fromMapEntry, optionally including fromMapEntry.
        +
        + + + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.SortedSet

          +spliterator
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Set

          +add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Collection

          +parallelStream, removeIf, stream
        • +
        +
          +
        • + + +

          Methods inherited from interface java.lang.Iterable

          +forEach
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          comparator

          +
          public java.util.Comparator<? super java.util.Map.Entry<K,V>> comparator()
          +
          Returns null since comparators are not supported. The natural ordering + of a stored collection is data byte order, whether the data classes + implement the Comparable interface or not. + This method does not conform to the SortedSet.comparator() + interface.
          +
          +
          Specified by:
          +
          comparator in interface java.util.SortedSet<java.util.Map.Entry<K,V>>
          +
          Returns:
          +
          null.
          +
          +
        • +
        + + + +
          +
        • +

          first

          +
          public java.util.Map.Entry<K,V> first()
          +
          Returns the first (lowest) element currently in this sorted set. + This method conforms to the SortedSet.first() interface.
          +
          +
          Specified by:
          +
          first in interface java.util.SortedSet<java.util.Map.Entry<K,V>>
          +
          Returns:
          +
          the first element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          last

          +
          public java.util.Map.Entry<K,V> last()
          +
          Returns the last (highest) element currently in this sorted set. + This method conforms to the SortedSet.last() interface.
          +
          +
          Specified by:
          +
          last in interface java.util.SortedSet<java.util.Map.Entry<K,V>>
          +
          Returns:
          +
          the last element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          headSet

          +
          public java.util.SortedSet<java.util.Map.Entry<K,V>> headSet(java.util.Map.Entry<K,V> toMapEntry)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly less than toMapEntry. + This method conforms to the SortedSet.headSet(E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          headSet in interface java.util.SortedSet<java.util.Map.Entry<K,V>>
          +
          Parameters:
          +
          toMapEntry - the upper bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          headSet

          +
          public java.util.SortedSet<java.util.Map.Entry<K,V>> headSet(java.util.Map.Entry<K,V> toMapEntry,
          +                                                             boolean toInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly less than toMapEntry, optionally including toMapEntry. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          toMapEntry - is the upper bound.
          +
          toInclusive - is true to include toMapEntry.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          tailSet

          +
          public java.util.SortedSet<java.util.Map.Entry<K,V>> tailSet(java.util.Map.Entry<K,V> fromMapEntry)
          +
          Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromMapEntry. + This method conforms to the SortedSet.tailSet(E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          tailSet in interface java.util.SortedSet<java.util.Map.Entry<K,V>>
          +
          Parameters:
          +
          fromMapEntry - is the lower bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          tailSet

          +
          public java.util.SortedSet<java.util.Map.Entry<K,V>> tailSet(java.util.Map.Entry<K,V> fromMapEntry,
          +                                                             boolean fromInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly greater than fromMapEntry, optionally including fromMapEntry. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromMapEntry - is the lower bound.
          +
          fromInclusive - is true to include fromMapEntry.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          subSet

          +
          public java.util.SortedSet<java.util.Map.Entry<K,V>> subSet(java.util.Map.Entry<K,V> fromMapEntry,
          +                                                            java.util.Map.Entry<K,V> toMapEntry)
          +
          Returns a view of the portion of this sorted set whose elements range + from fromMapEntry, inclusive, to toMapEntry, exclusive. + This method conforms to the SortedSet.subSet(E, E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          subSet in interface java.util.SortedSet<java.util.Map.Entry<K,V>>
          +
          Parameters:
          +
          fromMapEntry - is the lower bound.
          +
          toMapEntry - is the upper bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          subSet

          +
          public java.util.SortedSet<java.util.Map.Entry<K,V>> subSet(java.util.Map.Entry<K,V> fromMapEntry,
          +                                                            boolean fromInclusive,
          +                                                            java.util.Map.Entry<K,V> toMapEntry,
          +                                                            boolean toInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly greater than fromMapEntry and strictly less than toMapEntry, + optionally including fromMapEntry and toMapEntry. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromMapEntry - is the lower bound.
          +
          fromInclusive - is true to include fromMapEntry.
          +
          toMapEntry - is the upper bound.
          +
          toInclusive - is true to include toMapEntry.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredSortedKeySet.html b/docs/java/com/sleepycat/collections/StoredSortedKeySet.html new file mode 100644 index 0000000..e545349 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredSortedKeySet.html @@ -0,0 +1,704 @@ + + + + + +StoredSortedKeySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredSortedKeySet<K>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.lang.Iterable<K>, java.util.Collection<K>, java.util.Set<K>, java.util.SortedSet<K>
      +
      +
      +
      +
      public class StoredSortedKeySet<K>
      +extends StoredKeySet<K>
      +implements java.util.SortedSet<K>
      +
      The SortedSet returned by Map.keySet() and which can also be constructed + directly if a Map is not needed. + Since this collection is a set it only contains one element for each key, + even when duplicates are allowed. Key set iterators are therefore + particularly useful for enumerating the unique keys of a store or index that + allows duplicates. + +

      In addition to the standard SortedSet methods, this class provides the + following methods for stored sorted sets only. Note that the use of these + methods is not compatible with the standard Java collections interface.

      +
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + + + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.util.Comparator<? super K>comparator() +
        Returns null since comparators are not supported.
        +
        Kfirst() +
        Returns the first (lowest) element currently in this sorted set.
        +
        java.util.SortedSet<K>headSet(K toKey) +
        Returns a view of the portion of this sorted set whose elements are + strictly less than toKey.
        +
        java.util.SortedSet<K>headSet(K toKey, + boolean toInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly less than toKey, optionally including toKey.
        +
        Klast() +
        Returns the last (highest) element currently in this sorted set.
        +
        java.util.SortedSet<K>subSet(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly greater than fromKey and strictly less than toKey, + optionally including fromKey and toKey.
        +
        java.util.SortedSet<K>subSet(K fromKey, + K toKey) +
        Returns a view of the portion of this sorted set whose elements range + from fromKey, inclusive, to toKey, exclusive.
        +
        java.util.SortedSet<K>tailSet(K fromKey) +
        Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromKey.
        +
        java.util.SortedSet<K>tailSet(K fromKey, + boolean fromInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly greater than fromKey, optionally including fromKey.
        +
        + + + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.SortedSet

          +spliterator
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Set

          +add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Collection

          +parallelStream, removeIf, stream
        • +
        +
          +
        • + + +

          Methods inherited from interface java.lang.Iterable

          +forEach
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredSortedKeySet

          +
          public StoredSortedKeySet(Database database,
          +                          EntryBinding<K> keyBinding,
          +                          boolean writeAllowed)
          +
          Creates a sorted key set view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          comparator

          +
          public java.util.Comparator<? super K> comparator()
          +
          Returns null since comparators are not supported. The natural ordering + of a stored collection is data byte order, whether the data classes + implement the Comparable interface or not. + This method does not conform to the SortedSet.comparator() + interface.
          +
          +
          Specified by:
          +
          comparator in interface java.util.SortedSet<K>
          +
          Returns:
          +
          null.
          +
          +
        • +
        + + + +
          +
        • +

          first

          +
          public K first()
          +
          Returns the first (lowest) element currently in this sorted set. + This method conforms to the SortedSet.first() interface.
          +
          +
          Specified by:
          +
          first in interface java.util.SortedSet<K>
          +
          Returns:
          +
          the first element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          last

          +
          public K last()
          +
          Returns the last (highest) element currently in this sorted set. + This method conforms to the SortedSet.last() interface.
          +
          +
          Specified by:
          +
          last in interface java.util.SortedSet<K>
          +
          Returns:
          +
          the last element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          headSet

          +
          public java.util.SortedSet<K> headSet(K toKey)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly less than toKey. + This method conforms to the SortedSet.headSet(E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          headSet in interface java.util.SortedSet<K>
          +
          Parameters:
          +
          toKey - is the upper bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          headSet

          +
          public java.util.SortedSet<K> headSet(K toKey,
          +                                      boolean toInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly less than toKey, optionally including toKey. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          toKey - is the upper bound.
          +
          toInclusive - is true to include toKey.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          tailSet

          +
          public java.util.SortedSet<K> tailSet(K fromKey)
          +
          Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromKey. + This method conforms to the SortedSet.tailSet(E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          tailSet in interface java.util.SortedSet<K>
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          tailSet

          +
          public java.util.SortedSet<K> tailSet(K fromKey,
          +                                      boolean fromInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly greater than fromKey, optionally including fromKey. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          fromInclusive - is true to include fromKey.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          subSet

          +
          public java.util.SortedSet<K> subSet(K fromKey,
          +                                     K toKey)
          +
          Returns a view of the portion of this sorted set whose elements range + from fromKey, inclusive, to toKey, exclusive. + This method conforms to the SortedSet.subSet(E, E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          subSet in interface java.util.SortedSet<K>
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          toKey - is the upper bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          subSet

          +
          public java.util.SortedSet<K> subSet(K fromKey,
          +                                     boolean fromInclusive,
          +                                     K toKey,
          +                                     boolean toInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly greater than fromKey and strictly less than toKey, + optionally including fromKey and toKey. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          fromInclusive - is true to include fromKey.
          +
          toKey - is the upper bound.
          +
          toInclusive - is true to include toKey.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredSortedMap.html b/docs/java/com/sleepycat/collections/StoredSortedMap.html new file mode 100644 index 0000000..b0bfe53 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredSortedMap.html @@ -0,0 +1,792 @@ + + + + + +StoredSortedMap (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredSortedMap<K,V>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.util.concurrent.ConcurrentMap<K,V>, java.util.Map<K,V>, java.util.SortedMap<K,V>
      +
      +
      +
      +
      public class StoredSortedMap<K,V>
      +extends StoredMap<K,V>
      +implements java.util.SortedMap<K,V>
      +
      A SortedMap view of a Database. + +

      In addition to the standard SortedMap methods, this class provides the + following methods for stored sorted maps only. Note that the use of these + methods is not compatible with the standard Java collections interface.

      +
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredSortedMap

          +
          public StoredSortedMap(Database database,
          +                       EntryBinding<K> keyBinding,
          +                       EntryBinding<V> valueBinding,
          +                       boolean writeAllowed)
          +
          Creates a sorted map view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueBinding - is the binding used to translate between value + buffers and value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredSortedMap

          +
          public StoredSortedMap(Database database,
          +                       EntryBinding<K> keyBinding,
          +                       EntryBinding<V> valueBinding,
          +                       PrimaryKeyAssigner keyAssigner)
          +
          Creates a sorted map view of a Database with a PrimaryKeyAssigner. Writing is allowed for the created map.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueBinding - is the binding used to translate between value + buffers and value objects.
          +
          keyAssigner - is used by the StoredMap.append(V) method to assign + primary keys.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredSortedMap

          +
          public StoredSortedMap(Database database,
          +                       EntryBinding<K> keyBinding,
          +                       EntityBinding<V> valueEntityBinding,
          +                       boolean writeAllowed)
          +
          Creates a sorted map entity view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueEntityBinding - is the binding used to translate between + key/value buffers and entity value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredSortedMap

          +
          public StoredSortedMap(Database database,
          +                       EntryBinding<K> keyBinding,
          +                       EntityBinding<V> valueEntityBinding,
          +                       PrimaryKeyAssigner keyAssigner)
          +
          Creates a sorted map entity view of a Database with a PrimaryKeyAssigner. Writing is allowed for the created map.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          keyBinding - is the binding used to translate between key buffers + and key objects.
          +
          valueEntityBinding - is the binding used to translate between + key/value buffers and entity value objects.
          +
          keyAssigner - is used by the StoredMap.append(V) method to assign + primary keys.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          comparator

          +
          public java.util.Comparator<? super K> comparator()
          +
          Returns null since comparators are not supported. The natural ordering + of a stored collection is data byte order, whether the data classes + implement the Comparable interface or not. + This method does not conform to the SortedMap.comparator() + interface.
          +
          +
          Specified by:
          +
          comparator in interface java.util.SortedMap<K,V>
          +
          Returns:
          +
          null.
          +
          +
        • +
        + + + +
          +
        • +

          firstKey

          +
          public K firstKey()
          +
          Returns the first (lowest) key currently in this sorted map. + This method conforms to the SortedMap.firstKey() interface.
          +
          +
          Specified by:
          +
          firstKey in interface java.util.SortedMap<K,V>
          +
          Returns:
          +
          the first key. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          lastKey

          +
          public K lastKey()
          +
          Returns the last (highest) element currently in this sorted map. + This method conforms to the SortedMap.lastKey() interface.
          +
          +
          Specified by:
          +
          lastKey in interface java.util.SortedMap<K,V>
          +
          Returns:
          +
          the last key. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          headMap

          +
          public java.util.SortedMap<K,V> headMap(K toKey)
          +
          Returns a view of the portion of this sorted set whose keys are + strictly less than toKey. + This method conforms to the SortedMap.headMap(K) interface. + +

          Note that the return value is a StoredStoredMap and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          headMap in interface java.util.SortedMap<K,V>
          +
          Parameters:
          +
          toKey - is the upper bound.
          +
          Returns:
          +
          the submap.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          headMap

          +
          public java.util.SortedMap<K,V> headMap(K toKey,
          +                                        boolean toInclusive)
          +
          Returns a view of the portion of this sorted map whose elements are + strictly less than toKey, optionally including toKey. + This method does not exist in the standard SortedMap interface. + +

          Note that the return value is a StoredStoredMap and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          toKey - is the upper bound.
          +
          toInclusive - is true to include toKey.
          +
          Returns:
          +
          the submap.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          tailMap

          +
          public java.util.SortedMap<K,V> tailMap(K fromKey)
          +
          Returns a view of the portion of this sorted map whose elements are + greater than or equal to fromKey. + This method conforms to the SortedMap.tailMap(K) interface. + +

          Note that the return value is a StoredStoredMap and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          tailMap in interface java.util.SortedMap<K,V>
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          Returns:
          +
          the submap.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          tailMap

          +
          public java.util.SortedMap<K,V> tailMap(K fromKey,
          +                                        boolean fromInclusive)
          +
          Returns a view of the portion of this sorted map whose elements are + strictly greater than fromKey, optionally including fromKey. + This method does not exist in the standard SortedMap interface. + +

          Note that the return value is a StoredStoredMap and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          fromInclusive - is true to include fromKey.
          +
          Returns:
          +
          the submap.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          subMap

          +
          public java.util.SortedMap<K,V> subMap(K fromKey,
          +                                       K toKey)
          +
          Returns a view of the portion of this sorted map whose elements range + from fromKey, inclusive, to toKey, exclusive. + This method conforms to the SortedMap.subMap(K, K) interface. + +

          Note that the return value is a StoredStoredMap and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          subMap in interface java.util.SortedMap<K,V>
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          toKey - is the upper bound.
          +
          Returns:
          +
          the submap.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          subMap

          +
          public java.util.SortedMap<K,V> subMap(K fromKey,
          +                                       boolean fromInclusive,
          +                                       K toKey,
          +                                       boolean toInclusive)
          +
          Returns a view of the portion of this sorted map whose elements are + strictly greater than fromKey and strictly less than toKey, + optionally including fromKey and toKey. + This method does not exist in the standard SortedMap interface. + +

          Note that the return value is a StoredStoredMap and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromKey - is the lower bound.
          +
          fromInclusive - is true to include fromKey.
          +
          toKey - is the upper bound.
          +
          toInclusive - is true to include toKey.
          +
          Returns:
          +
          the submap.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredSortedValueSet.html b/docs/java/com/sleepycat/collections/StoredSortedValueSet.html new file mode 100644 index 0000000..50c7f82 --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredSortedValueSet.html @@ -0,0 +1,703 @@ + + + + + +StoredSortedValueSet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredSortedValueSet<E>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.lang.Iterable<E>, java.util.Collection<E>, java.util.Set<E>, java.util.SortedSet<E>
      +
      +
      +
      +
      public class StoredSortedValueSet<E>
      +extends StoredValueSet<E>
      +implements java.util.SortedSet<E>
      +
      The SortedSet returned by Map.values() and which can also be constructed + directly if a Map is not needed. + Although this collection is a set it may contain duplicate values. Only if + an entity value binding is used are all elements guaranteed to be unique. + +

      In addition to the standard SortedSet methods, this class provides the + following methods for stored sorted value sets only. Note that the use of + these methods is not compatible with the standard Java collections + interface.

      +
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    +
      +
    • + + + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.util.Comparator<? super E>comparator() +
        Returns null since comparators are not supported.
        +
        Efirst() +
        Returns the first (lowest) element currently in this sorted set.
        +
        java.util.SortedSet<E>headSet(E toValue) +
        Returns a view of the portion of this sorted set whose elements are + strictly less than toValue.
        +
        java.util.SortedSet<E>headSet(E toValue, + boolean toInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly less than toValue, optionally including toValue.
        +
        Elast() +
        Returns the last (highest) element currently in this sorted set.
        +
        java.util.SortedSet<E>subSet(E fromValue, + boolean fromInclusive, + E toValue, + boolean toInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly greater than fromValue and strictly less than toValue, + optionally including fromValue and toValue.
        +
        java.util.SortedSet<E>subSet(E fromValue, + E toValue) +
        Returns a view of the portion of this sorted set whose elements range + from fromValue, inclusive, to toValue, exclusive.
        +
        java.util.SortedSet<E>tailSet(E fromValue) +
        Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromValue.
        +
        java.util.SortedSet<E>tailSet(E fromValue, + boolean fromInclusive) +
        Returns a view of the portion of this sorted set whose elements are + strictly greater than fromValue, optionally including fromValue.
        +
        + + + +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.SortedSet

          +spliterator
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Set

          +add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Collection

          +parallelStream, removeIf, stream
        • +
        +
          +
        • + + +

          Methods inherited from interface java.lang.Iterable

          +forEach
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredSortedValueSet

          +
          public StoredSortedValueSet(Database database,
          +                            EntityBinding<E> valueEntityBinding,
          +                            boolean writeAllowed)
          +
          Creates a sorted value set entity view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          valueEntityBinding - is the binding used to translate between + key/value buffers and entity value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          comparator

          +
          public java.util.Comparator<? super E> comparator()
          +
          Returns null since comparators are not supported. The natural ordering + of a stored collection is data byte order, whether the data classes + implement the Comparable interface or not. + This method does not conform to the SortedSet.comparator() + interface.
          +
          +
          Specified by:
          +
          comparator in interface java.util.SortedSet<E>
          +
          Returns:
          +
          null.
          +
          +
        • +
        + + + +
          +
        • +

          first

          +
          public E first()
          +
          Returns the first (lowest) element currently in this sorted set. + This method conforms to the SortedSet.first() interface.
          +
          +
          Specified by:
          +
          first in interface java.util.SortedSet<E>
          +
          Returns:
          +
          the first element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + +
          +
        • +

          last

          +
          public E last()
          +
          Returns the last (highest) element currently in this sorted set. + This method conforms to the SortedSet.last() interface.
          +
          +
          Specified by:
          +
          last in interface java.util.SortedSet<E>
          +
          Returns:
          +
          the last element. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          headSet

          +
          public java.util.SortedSet<E> headSet(E toValue)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly less than toValue. + This method conforms to the SortedSet.headSet(E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          headSet in interface java.util.SortedSet<E>
          +
          Parameters:
          +
          toValue - the upper bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          headSet

          +
          public java.util.SortedSet<E> headSet(E toValue,
          +                                      boolean toInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly less than toValue, optionally including toValue. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          toValue - is the upper bound.
          +
          toInclusive - is true to include toValue.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          tailSet

          +
          public java.util.SortedSet<E> tailSet(E fromValue)
          +
          Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromValue. + This method conforms to the SortedSet.tailSet(E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          tailSet in interface java.util.SortedSet<E>
          +
          Parameters:
          +
          fromValue - is the lower bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          tailSet

          +
          public java.util.SortedSet<E> tailSet(E fromValue,
          +                                      boolean fromInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly greater than fromValue, optionally including fromValue. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromValue - is the lower bound.
          +
          fromInclusive - is true to include fromValue.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          subSet

          +
          public java.util.SortedSet<E> subSet(E fromValue,
          +                                     E toValue)
          +
          Returns a view of the portion of this sorted set whose elements range + from fromValue, inclusive, to toValue, exclusive. + This method conforms to the SortedSet.subSet(E, E) interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Specified by:
          +
          subSet in interface java.util.SortedSet<E>
          +
          Parameters:
          +
          fromValue - is the lower bound.
          +
          toValue - is the upper bound.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        + + + + + +
          +
        • +

          subSet

          +
          public java.util.SortedSet<E> subSet(E fromValue,
          +                                     boolean fromInclusive,
          +                                     E toValue,
          +                                     boolean toInclusive)
          +
          Returns a view of the portion of this sorted set whose elements are + strictly greater than fromValue and strictly less than toValue, + optionally including fromValue and toValue. + This method does not exist in the standard SortedSet interface. + +

          Note that the return value is a StoredCollection and must be treated + as such; for example, its iterators must be explicitly closed.

          +
          +
          Parameters:
          +
          fromValue - is the lower bound.
          +
          fromInclusive - is true to include fromValue.
          +
          toValue - is the upper bound.
          +
          toInclusive - is true to include toValue.
          +
          Returns:
          +
          the subset.
          +
          Throws:
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/StoredValueSet.html b/docs/java/com/sleepycat/collections/StoredValueSet.html new file mode 100644 index 0000000..628ebda --- /dev/null +++ b/docs/java/com/sleepycat/collections/StoredValueSet.html @@ -0,0 +1,516 @@ + + + + + +StoredValueSet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class StoredValueSet<E>

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.Cloneable, java.lang.Iterable<E>, java.util.Collection<E>, java.util.Set<E>
      +
      +
      +
      Direct Known Subclasses:
      +
      StoredSortedValueSet
      +
      +
      +
      +
      public class StoredValueSet<E>
      +extends StoredCollection<E>
      +implements java.util.Set<E>
      +
      The Set returned by Map.values() and Map.duplicates(), and which can also be + constructed directly if a Map is not needed. + Although this collection is a set it may contain duplicate values. Only if + an entity value binding is used are all elements guaranteed to be unique.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StoredValueSet

          +
          public StoredValueSet(Database database,
          +                      EntryBinding<E> valueBinding,
          +                      boolean writeAllowed)
          +
          Creates a value set view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          valueBinding - is the binding used to translate between value + buffers and value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          StoredValueSet

          +
          public StoredValueSet(Database database,
          +                      EntityBinding<E> valueEntityBinding,
          +                      boolean writeAllowed)
          +
          Creates a value set entity view of a Database.
          +
          +
          Parameters:
          +
          database - is the Database underlying the new collection.
          +
          valueEntityBinding - is the binding used to translate between + key/value buffers and entity value objects.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if formats are not consistently + defined or a parameter is invalid.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          add

          +
          public boolean add(E entity)
          +
          Adds the specified entity to this set if it is not already present + (optional operation). + This method conforms to the Set.add(E) interface.
          +
          +
          Specified by:
          +
          add in interface java.util.Collection<E>
          +
          Specified by:
          +
          add in interface java.util.Set<E>
          +
          Parameters:
          +
          entity - is the entity to be added.
          +
          Returns:
          +
          true if the entity was added, that is the key-value pair + represented by the entity was not previously present in the collection. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only, + if the collection is indexed, or if an entity binding is not used.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          contains

          +
          public boolean contains(java.lang.Object value)
          +
          Returns true if this set contains the specified element. + This method conforms to the Set.contains(java.lang.Object) + interface.
          +
          +
          Specified by:
          +
          contains in interface java.util.Collection<E>
          +
          Specified by:
          +
          contains in interface java.util.Set<E>
          +
          Parameters:
          +
          value - the value to check.
          +
          Returns:
          +
          whether the set contains the given value. + +
          +
          Throws:
          +
          OperationFailureException - if one of the Read Operation + Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public boolean remove(java.lang.Object value)
          +
          Removes the specified value from this set if it is present (optional + operation). + If an entity binding is used, the key-value pair represented by the + given entity is removed. If an entity binding is used, the first + occurrence of a key-value pair with the given value is removed. + This method conforms to the Set.remove(java.lang.Object) interface. + +
          +
          +
          Specified by:
          +
          remove in interface java.util.Collection<E>
          +
          Specified by:
          +
          remove in interface java.util.Set<E>
          +
          Throws:
          +
          OperationFailureException - if one of the Write + Operation Failures occurs.
          +
          EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
          +
          java.lang.UnsupportedOperationException - if the collection is read-only.
          +
          RuntimeExceptionWrapper - if a checked exception is thrown, + including a DatabaseException on BDB (C Edition).
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/TransactionRunner.html b/docs/java/com/sleepycat/collections/TransactionRunner.html new file mode 100644 index 0000000..543519c --- /dev/null +++ b/docs/java/com/sleepycat/collections/TransactionRunner.html @@ -0,0 +1,649 @@ + + + + + +TransactionRunner (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class TransactionRunner

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.TransactionRunner
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TransactionRunner
      +extends java.lang.Object
      +
      Starts a transaction, calls TransactionWorker.doWork(), and handles + transaction retry and exceptions. To perform a transaction, the user + implements the TransactionWorker interface and passes an instance of + that class to the run method. + +

      A single TransactionRunner instance may be used by any number of threads + for any number of transactions.

      + +

      The behavior of the run() method depends on whether the environment is + transactional, whether nested transactions are enabled, and whether a + transaction is already active.

      + +
        +
      • When the run() method is called in a transactional environment and no + transaction is active for the current thread, a new transaction is started + before calling doWork(). If LockConflictException is thrown by doWork(), + the transaction will be aborted and the process will be repeated up to the + maximum number of retries. If another exception is thrown by doWork() or + the maximum number of retries has occurred, the transaction will be aborted + and the exception will be rethrown by the run() method. If no exception is + thrown by doWork(), the transaction will be committed. The run() method + will not attempt to commit or abort a transaction if it has already been + committed or aborted by doWork().
      • + +
      • When the run() method is called and a transaction is active for the + current thread, and nested transactions are enabled, a nested transaction is + started before calling doWork(). The transaction that is active when + calling the run() method will become the parent of the nested transaction. + The nested transaction will be committed or aborted by the run() method + following the same rules described above. Note that nested transactions may + not be enabled for the JE product, since JE does not support nested + transactions.
      • + +
      • When the run() method is called in a non-transactional environment, the + doWork() method is called without starting a transaction. The run() method + will return without committing or aborting a transaction, and any exceptions + thrown by the doWork() method will be thrown by the run() method.
      • + +
      • When the run() method is called and a transaction is active for the + current thread and nested transactions are not enabled (the default) the + same rules as above apply. All the operations performed by the doWork() + method will be part of the currently active transaction.
      • +
      + +

      In a transactional environment, the rules described above support nested + calls to the run() method and guarantee that the outermost call will cause + the transaction to be committed or aborted. This is true whether or not + nested transactions are supported or enabled. Note that nested transactions + are provided as an optimization for improving concurrency but do not change + the meaning of the outermost transaction. Nested transactions are not + currently supported by the JE product.

      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          DEFAULT_MAX_RETRIES

          +
          public static final int DEFAULT_MAX_RETRIES
          +
          The default maximum number of retries.
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TransactionRunner

          +
          public TransactionRunner(Environment env)
          +
          Creates a transaction runner for a given Berkeley DB environment. + The default maximum number of retries (DEFAULT_MAX_RETRIES) and + a null (default) TransactionConfig will be used.
          +
          +
          Parameters:
          +
          env - is the environment for running transactions.
          +
          +
        • +
        + + + +
          +
        • +

          TransactionRunner

          +
          public TransactionRunner(Environment env,
          +                         int maxRetries,
          +                         TransactionConfig config)
          +
          Creates a transaction runner for a given Berkeley DB environment and + with a given number of maximum retries.
          +
          +
          Parameters:
          +
          env - is the environment for running transactions.
          +
          maxRetries - is the maximum number of retries that will be + performed when deadlocks are detected.
          +
          config - the transaction configuration used for calling + Environment.beginTransaction(com.sleepycat.je.Transaction, com.sleepycat.je.TransactionConfig), or null to use the default + configuration. The configuration object is not cloned, and + any modifications to it will impact subsequent transactions.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getMaxRetries

          +
          public int getMaxRetries()
          +
          Returns the maximum number of retries that will be performed when + deadlocks are detected.
          +
          +
          Returns:
          +
          the maximum number of retries.
          +
          +
        • +
        + + + +
          +
        • +

          setMaxRetries

          +
          public void setMaxRetries(int maxRetries)
          +
          Changes the maximum number of retries that will be performed when + deadlocks are detected. + Calling this method does not impact transactions already running.
          +
          +
          Parameters:
          +
          maxRetries - the maximum number of retries.
          +
          +
        • +
        + + + +
          +
        • +

          getAllowNestedTransactions

          +
          public boolean getAllowNestedTransactions()
          +
          Returns whether nested transactions will be created if + run() is called when a transaction is already active for + the current thread. + By default this property is false.
          +
          +
          Returns:
          +
          whether nested transactions will be created. + +

          Note that this method always returns false in the JE product, since + nested transactions are not supported by JE.

          +
          +
        • +
        + + + +
          +
        • +

          setAllowNestedTransactions

          +
          public void setAllowNestedTransactions(boolean allowNestedTxn)
          +
          Changes whether nested transactions will be created if + run() is called when a transaction is already active for + the current thread. + Calling this method does not impact transactions already running.
          +
          +
          Parameters:
          +
          allowNestedTxn - whether nested transactions will be created. + +

          Note that true may not be passed to this method in the JE product, + since nested transactions are not supported by JE.

          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          run

          +
          public void run(TransactionWorker worker)
          +         throws DatabaseException,
          +                java.lang.Exception
          +
          Calls the TransactionWorker.doWork() method and, for transactional + environments, may begin and end a transaction. If the environment given + is non-transactional, a transaction will not be used but the doWork() + method will still be called. See the class description for more + information.
          +
          +
          Parameters:
          +
          worker - the TransactionWorker.
          +
          Throws:
          +
          LockConflictException - when it is thrown by doWork() and the + maximum number of retries has occurred. The transaction will have been + aborted by this method.
          +
          java.lang.Exception - when any other exception is thrown by doWork(). The + exception will first be unwrapped by calling ExceptionUnwrapper.unwrap(java.lang.Exception). The transaction will have been aborted by + this method.
          +
          DatabaseException
          +
          +
        • +
        + + + +
          +
        • +

          handleException

          +
          public int handleException(java.lang.Exception exception,
          +                           int retries,
          +                           int maxRetries)
          +                    throws java.lang.Exception
          +
          Handles exceptions that occur during a transaction, and may implement + transaction retry policy. The transaction is aborted by the run method before calling this method. + +

          The default implementation of this method throws the exception parameter if it is not an instance of LockConflictException and otherwise returns the maxRetries + parameter value. This method can be overridden to throw a different + exception or return a different number of retries. For example:

          +
            +
          • This method could call Thread.sleep for a short interval to + allow other transactions to finish.
          • + +
          • This method could return a different maxRetries value + depending on the exception that occurred.
          • + +
          • This method could throw an application-defined exception when the + retries value is greater or equal to the maxRetries and + a LockConflictException occurs, to override the default behavior + which is to throw the LockConflictException.
          • +
          +
          +
          Parameters:
          +
          exception - an exception that was thrown by the TransactionWorker.doWork() method or thrown when beginning or committing + the transaction. If the retries value is greater or equal to + maxRetries when this method returns normally, this exception + will be thrown by the run method.
          +
          retries - the current value of a counter that starts out at zero + and is incremented when each retry is performed.
          +
          maxRetries - the maximum retries to be performed. By default, + this value is set to getMaxRetries(). This method may return a + different maximum retries value to override that default.
          +
          Returns:
          +
          the maximum number of retries to perform. The + default policy is to return the maxRetries parameter value + if the exception parameter value is an instance of LockConflictException.
          +
          Throws:
          +
          java.lang.Exception - to cause the exception to be thrown by the run method. The default policy is to throw the exception + parameter value if it is not an instance of LockConflictException.
          +
          Since:
          +
          3.4
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/TransactionWorker.html b/docs/java/com/sleepycat/collections/TransactionWorker.html new file mode 100644 index 0000000..dbe776f --- /dev/null +++ b/docs/java/com/sleepycat/collections/TransactionWorker.html @@ -0,0 +1,246 @@ + + + + + +TransactionWorker (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Interface TransactionWorker

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/TupleSerialFactory.html b/docs/java/com/sleepycat/collections/TupleSerialFactory.html new file mode 100644 index 0000000..a442acb --- /dev/null +++ b/docs/java/com/sleepycat/collections/TupleSerialFactory.html @@ -0,0 +1,423 @@ + + + + + +TupleSerialFactory (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.collections
    +

    Class TupleSerialFactory

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.sleepycat.collections.TupleSerialFactory
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class TupleSerialFactory
      +extends java.lang.Object
      +
      Creates stored collections having tuple keys and serialized entity values. + The entity classes must be Serializable and must implement the + MarshalledTupleKeyEntity interfaces. The key classes must either implement + the MarshalledTupleEntry interface or be one of the Java primitive type + classes. Underlying binding objects are created automatically.
      +
      +
      Author:
      +
      Mark Hayes
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          TupleSerialFactory

          +
          public TupleSerialFactory(ClassCatalog catalog)
          +
          Creates a tuple-serial factory for given environment and class catalog.
          +
          +
          Parameters:
          +
          catalog - the ClassCatalog.
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getCatalog

          +
          public final ClassCatalog getCatalog()
          +
          Returns the class catalog associated with this factory.
          +
          +
          Returns:
          +
          the catalog.
          +
          +
        • +
        + + + +
          +
        • +

          newMap

          +
          public <K,V extends MarshalledTupleKeyEntityStoredMap<K,V> newMap(Database db,
          +                                                                    java.lang.Class<K> keyClass,
          +                                                                    java.lang.Class<V> valueBaseClass,
          +                                                                    boolean writeAllowed)
          +
          Creates a map from a previously opened Database object.
          +
          +
          Type Parameters:
          +
          K - the key class.
          +
          V - the value base class.
          +
          Parameters:
          +
          db - the previously opened Database object.
          +
          keyClass - is the class used for map keys. It must implement the + MarshalledTupleEntry interface or be one of the Java primitive + type classes.
          +
          valueBaseClass - the base class of the entity values for this + store. It must implement the MarshalledTupleKeyEntity + interface.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Returns:
          +
          the map.
          +
          +
        • +
        + + + +
          +
        • +

          newSortedMap

          +
          public <K,V extends MarshalledTupleKeyEntityStoredSortedMap<K,V> newSortedMap(Database db,
          +                                                                                java.lang.Class<K> keyClass,
          +                                                                                java.lang.Class<V> valueBaseClass,
          +                                                                                boolean writeAllowed)
          +
          Creates a sorted map from a previously opened Database object.
          +
          +
          Type Parameters:
          +
          K - the key class.
          +
          V - the value base class.
          +
          Parameters:
          +
          db - the previously opened Database object.
          +
          keyClass - is the class used for map keys. It must implement the + MarshalledTupleEntry interface or be one of the Java primitive + type classes.
          +
          valueBaseClass - the base class of the entity values for this + store. It must implement the MarshalledTupleKeyEntity + interface.
          +
          writeAllowed - is true to create a read-write collection or false + to create a read-only collection.
          +
          Returns:
          +
          the sorted map.
          +
          +
        • +
        + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/CurrentTransaction.html b/docs/java/com/sleepycat/collections/class-use/CurrentTransaction.html new file mode 100644 index 0000000..4e54cfc --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/CurrentTransaction.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.collections.CurrentTransaction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.CurrentTransaction

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/MapEntryParameter.html b/docs/java/com/sleepycat/collections/class-use/MapEntryParameter.html new file mode 100644 index 0000000..2859174 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/MapEntryParameter.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.MapEntryParameter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.MapEntryParameter

    +
    +
    No usage of com.sleepycat.collections.MapEntryParameter
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/PrimaryKeyAssigner.html b/docs/java/com/sleepycat/collections/class-use/PrimaryKeyAssigner.html new file mode 100644 index 0000000..46e09e3 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/PrimaryKeyAssigner.html @@ -0,0 +1,198 @@ + + + + + +Uses of Interface com.sleepycat.collections.PrimaryKeyAssigner (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.collections.PrimaryKeyAssigner

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredCollection.html b/docs/java/com/sleepycat/collections/class-use/StoredCollection.html new file mode 100644 index 0000000..db322a6 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredCollection.html @@ -0,0 +1,222 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredCollection (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredCollection

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredCollections.html b/docs/java/com/sleepycat/collections/class-use/StoredCollections.html new file mode 100644 index 0000000..ef77770 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredCollections.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredCollections (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredCollections

    +
    +
    No usage of com.sleepycat.collections.StoredCollections
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredContainer.html b/docs/java/com/sleepycat/collections/class-use/StoredContainer.html new file mode 100644 index 0000000..82c2eaa --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredContainer.html @@ -0,0 +1,243 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredContainer (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredContainer

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredEntrySet.html b/docs/java/com/sleepycat/collections/class-use/StoredEntrySet.html new file mode 100644 index 0000000..706f19d --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredEntrySet.html @@ -0,0 +1,173 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredEntrySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredEntrySet

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredIterator.html b/docs/java/com/sleepycat/collections/class-use/StoredIterator.html new file mode 100644 index 0000000..a245bb3 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredIterator.html @@ -0,0 +1,199 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredIterator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredIterator

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredKeySet.html b/docs/java/com/sleepycat/collections/class-use/StoredKeySet.html new file mode 100644 index 0000000..770fa52 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredKeySet.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredKeySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredKeySet

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredMap.html b/docs/java/com/sleepycat/collections/class-use/StoredMap.html new file mode 100644 index 0000000..2ab212e --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredMap.html @@ -0,0 +1,191 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredMap (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredMap

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredSortedEntrySet.html b/docs/java/com/sleepycat/collections/class-use/StoredSortedEntrySet.html new file mode 100644 index 0000000..3a47532 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredSortedEntrySet.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredSortedEntrySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredSortedEntrySet

    +
    +
    No usage of com.sleepycat.collections.StoredSortedEntrySet
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredSortedKeySet.html b/docs/java/com/sleepycat/collections/class-use/StoredSortedKeySet.html new file mode 100644 index 0000000..f83d228 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredSortedKeySet.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredSortedKeySet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredSortedKeySet

    +
    +
    No usage of com.sleepycat.collections.StoredSortedKeySet
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredSortedMap.html b/docs/java/com/sleepycat/collections/class-use/StoredSortedMap.html new file mode 100644 index 0000000..befcf9e --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredSortedMap.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredSortedMap (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredSortedMap

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredSortedValueSet.html b/docs/java/com/sleepycat/collections/class-use/StoredSortedValueSet.html new file mode 100644 index 0000000..8cfb4bf --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredSortedValueSet.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredSortedValueSet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredSortedValueSet

    +
    +
    No usage of com.sleepycat.collections.StoredSortedValueSet
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/StoredValueSet.html b/docs/java/com/sleepycat/collections/class-use/StoredValueSet.html new file mode 100644 index 0000000..b804221 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/StoredValueSet.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.collections.StoredValueSet (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.StoredValueSet

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/TransactionRunner.html b/docs/java/com/sleepycat/collections/class-use/TransactionRunner.html new file mode 100644 index 0000000..8b2afe8 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/TransactionRunner.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.TransactionRunner (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.TransactionRunner

    +
    +
    No usage of com.sleepycat.collections.TransactionRunner
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/TransactionWorker.html b/docs/java/com/sleepycat/collections/class-use/TransactionWorker.html new file mode 100644 index 0000000..0316984 --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/TransactionWorker.html @@ -0,0 +1,174 @@ + + + + + +Uses of Interface com.sleepycat.collections.TransactionWorker (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Interface
    com.sleepycat.collections.TransactionWorker

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/class-use/TupleSerialFactory.html b/docs/java/com/sleepycat/collections/class-use/TupleSerialFactory.html new file mode 100644 index 0000000..92f290a --- /dev/null +++ b/docs/java/com/sleepycat/collections/class-use/TupleSerialFactory.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.collections.TupleSerialFactory (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Class
    com.sleepycat.collections.TupleSerialFactory

    +
    +
    No usage of com.sleepycat.collections.TupleSerialFactory
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/package-frame.html b/docs/java/com/sleepycat/collections/package-frame.html new file mode 100644 index 0000000..4c49cfc --- /dev/null +++ b/docs/java/com/sleepycat/collections/package-frame.html @@ -0,0 +1,40 @@ + + + + + +com.sleepycat.collections (Oracle - Berkeley DB Java Edition API) + + + + + +

    com.sleepycat.collections

    + + + diff --git a/docs/java/com/sleepycat/collections/package-summary.html b/docs/java/com/sleepycat/collections/package-summary.html new file mode 100644 index 0000000..8f8c3e8 --- /dev/null +++ b/docs/java/com/sleepycat/collections/package-summary.html @@ -0,0 +1,282 @@ + + + + + +com.sleepycat.collections (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Package com.sleepycat.collections

    +
    +
    Data access based on the standard Java collections API.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      PrimaryKeyAssigner +
      An interface implemented to assign new primary key values.
      +
      TransactionWorker +
      The interface implemented to perform the work within a transaction.
      +
      +
    • +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      CurrentTransaction +
      Provides access to the current transaction for the current thread within the + context of a Berkeley DB environment.
      +
      MapEntryParameter<K,V> +
      A simple Map.Entry implementation that can be used as in + input parameter.
      +
      StoredCollection<E> +
      A abstract base class for all stored collections.
      +
      StoredCollections +
      Static methods operating on collections and maps.
      +
      StoredContainer +
      A abstract base class for all stored collections and maps.
      +
      StoredEntrySet<K,V> +
      The Set returned by Map.entrySet().
      +
      StoredIterator<E> +
      The Iterator returned by all stored collections.
      +
      StoredKeySet<K> +
      The Set returned by Map.keySet() and which can also be constructed directly + if a Map is not needed.
      +
      StoredMap<K,V> +
      A Map view of a Database.
      +
      StoredSortedEntrySet<K,V> +
      The SortedSet returned by Map.entrySet().
      +
      StoredSortedKeySet<K> +
      The SortedSet returned by Map.keySet() and which can also be constructed + directly if a Map is not needed.
      +
      StoredSortedMap<K,V> +
      A SortedMap view of a Database.
      +
      StoredSortedValueSet<E> +
      The SortedSet returned by Map.values() and which can also be constructed + directly if a Map is not needed.
      +
      StoredValueSet<E> +
      The Set returned by Map.values() and Map.duplicates(), and which can also be + constructed directly if a Map is not needed.
      +
      TransactionRunner +
      Starts a transaction, calls TransactionWorker.doWork(), and handles + transaction retry and exceptions.
      +
      TupleSerialFactory +
      Creates stored collections having tuple keys and serialized entity values.
      +
      +
    • +
    + + + +

    Package com.sleepycat.collections Description

    +
    Data access based on the standard Java collections API. + +Examples can be found in je/examples/collections. Build and run directions are +in the installation notes. +
    +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/package-tree.html b/docs/java/com/sleepycat/collections/package-tree.html new file mode 100644 index 0000000..d4d899d --- /dev/null +++ b/docs/java/com/sleepycat/collections/package-tree.html @@ -0,0 +1,180 @@ + + + + + +com.sleepycat.collections Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Hierarchy For Package com.sleepycat.collections

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    +
      +
    • java.lang.Object + +
    • +
    +

    Interface Hierarchy

    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/collections/package-use.html b/docs/java/com/sleepycat/collections/package-use.html new file mode 100644 index 0000000..912ae60 --- /dev/null +++ b/docs/java/com/sleepycat/collections/package-use.html @@ -0,0 +1,219 @@ + + + + + +Uses of Package com.sleepycat.collections (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +
    +

    Uses of Package
    com.sleepycat.collections

    +
    +
    + +
    + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/je/BinaryEqualityComparator.html b/docs/java/com/sleepycat/je/BinaryEqualityComparator.html new file mode 100644 index 0000000..06a096a --- /dev/null +++ b/docs/java/com/sleepycat/je/BinaryEqualityComparator.html @@ -0,0 +1,225 @@ + + + + + +BinaryEqualityComparator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.je
    +

    Interface BinaryEqualityComparator

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface BinaryEqualityComparator
      +
      A tag interface used to mark a BTree or duplicate comparator class as a + binary equality comparator, that is, a comparator that considers + two keys (byte arrays) to be equal if and only if they have the same + length and they are equal byte-per-byte. +

      + If both the BTree and duplicate comparators used by a databse are + binary-equality comparators, then certain internal optimizations can be + enabled. Specifically, the "BIN-delta blind-puts" optimization described + below is made possible. +

      + We say that a record operation (insertion, update, or deletion) is performed + blindly in a BIN-delta when the delta does not contain a slot with the + operation's key and we don't need to access the full BIN to check whether + such a slot exists there or to extract any information from the full-BIN + slot, if it exists. Performing a blind operation involves inserting the + record in the BIN-delta, and in case of deletion, marking the BIN slot as + deleted. When the delta and the full BIN are merged at a later time, the + blind operation will be translated to an insertion, update, or delete + depending on whether the full BIN contained the record or not. +

      + Normally, blind puts are not possible: we need to know whether the put + is actually an update or an insertion, i.e., whether the key exists in + the full BIN or not. Furthermore, in case of update we also need to + know the location of the previous record version to make the current + update abortable. However, it is possible to answer at least the key + existence question by adding a small amount of extra information in + the deltas. If we do so, puts that are actual insertions can be done + blindly. +

      + To answer whether a key exists in a full BIN or not, each BIN-delta + stores a bloom filter, which is a very compact, approximate + representation of the set of keys in the full BIN. Bloom filters can + answer set membership questions with no false negatives and very low + probability of false positives. As a result, put operation that are + actual insertions can almost always be performed blindly. +

      + Because bloom filters work by applying hash functions on keys (where each + key byte participates in the hash computation), an additional requirement + for blind puts is that a database uses "binary equality" comparators, that + is, a comparator that considers two keys to be equal if and only if they + have the same length and they are equal byte-per-byte. Inheriting from the + BinaryEqualityComparator interface marks an actual comparator as having the + "binary equality" property. +

      + Comparators are configured using + DatabaseConfig.setBtreeComparator(java.util.Comparator) or + DatabaseConfig.setBtreeComparator(Class), and + DatabaseConfig.setDuplicateComparator(java.util.Comparator) or + DatabaseConfig.setDuplicateComparator(Class). +

      + As described in the javadoc for these methods, comparators must be used + with great caution, since a badly behaved comparator can cause B-tree + corruption.

      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/je/BtreeStats.html b/docs/java/com/sleepycat/je/BtreeStats.html new file mode 100644 index 0000000..85671e4 --- /dev/null +++ b/docs/java/com/sleepycat/je/BtreeStats.html @@ -0,0 +1,668 @@ + + + + + +BtreeStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.je
    +

    Class BtreeStats

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable
      +
      +
      +
      +
      public class BtreeStats
      +extends DatabaseStats
      +
      The BtreeStats object is used to return Btree database statistics.
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        BtreeStats() 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods Deprecated Methods 
        Modifier and TypeMethod and Description
        long[]getBINEntriesHistogram() +
        Returns an array representing a histogram of the number of Bottom + Internal Nodes with various percentages of non-deleted entry counts.
        +
        long[]getBINsByLevel() +
        Returns the count of Bottom Internal Nodes per level, indexed by level.
        +
        longgetBottomInternalNodeCount() +
        Returns the number of Bottom Internal Nodes in the database tree.
        +
        long[]getDBINsByLevel() +
        Deprecated.  +
        as of 5.0, returns an empty array.
        +
        +
        longgetDeletedLeafNodeCount() +
        Returns the number of deleted data records in the database tree that + are pending removal by the compressor.
        +
        long[]getDINsByLevel() +
        Deprecated.  +
        as of 5.0, returns an empty array.
        +
        +
        longgetDupCountLeafNodeCount() +
        Deprecated.  +
        as of 5.0, returns zero.
        +
        +
        longgetDuplicateBottomInternalNodeCount() +
        Deprecated.  +
        as of 5.0, returns zero.
        +
        +
        longgetDuplicateInternalNodeCount() +
        Deprecated.  +
        as of 5.0, returns zero.
        +
        +
        intgetDuplicateTreeMaxDepth() +
        Deprecated.  +
        as of 5.0, returns zero.
        +
        +
        long[]getINsByLevel() +
        Returns the count of Internal Nodes per level, indexed by level.
        +
        longgetInternalNodeCount() +
        Returns the number of Internal Nodes in the database tree.
        +
        longgetLeafNodeCount() +
        Returns the number of leaf nodes in the database tree, which can equal + the number of records.
        +
        intgetMainTreeMaxDepth() +
        Returns the maximum depth of the main database tree.
        +
        longgetRelatches() +
        Returns the number of latch upgrades (relatches) required while + operating on this database's BTree.
        +
        intgetRootSplits() +
        The number of times the root of the BTree was split.
        +
        java.lang.StringtoString() +
        For convenience, the BtreeStats class has a toString method that lists + all the data fields.
        +
        java.lang.StringtoStringVerbose() 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BtreeStats

          +
          public BtreeStats()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getBottomInternalNodeCount

          +
          public long getBottomInternalNodeCount()
          +
          Returns the number of Bottom Internal Nodes in the database tree. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          number of Bottom Internal Nodes in the database tree.
          +
          +
        • +
        + + + +
          +
        • +

          getDuplicateBottomInternalNodeCount

          +
          public long getDuplicateBottomInternalNodeCount()
          +
          Deprecated. as of 5.0, returns zero.
          +
        • +
        + + + +
          +
        • +

          getDeletedLeafNodeCount

          +
          public long getDeletedLeafNodeCount()
          +
          Returns the number of deleted data records in the database tree that + are pending removal by the compressor. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          number of deleted data records in the database tree that are + pending removal by the compressor.
          +
          +
        • +
        + + + +
          +
        • +

          getDupCountLeafNodeCount

          +
          public long getDupCountLeafNodeCount()
          +
          Deprecated. as of 5.0, returns zero.
          +
        • +
        + + + +
          +
        • +

          getInternalNodeCount

          +
          public long getInternalNodeCount()
          +
          Returns the number of Internal Nodes in the database tree. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          number of Internal Nodes in the database tree.
          +
          +
        • +
        + + + +
          +
        • +

          getDuplicateInternalNodeCount

          +
          public long getDuplicateInternalNodeCount()
          +
          Deprecated. as of 5.0, returns zero.
          +
        • +
        + + + +
          +
        • +

          getLeafNodeCount

          +
          public long getLeafNodeCount()
          +
          Returns the number of leaf nodes in the database tree, which can equal + the number of records. This is calculated without locks or transactions, + and therefore is only an accurate count of the current number of records + when the database is quiescent. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          number of leaf nodes in the database tree, which can equal the + number of records. This is calculated without locks or transactions, and + therefore is only an accurate count of the current number of records + when the database is quiescent.
          +
          +
        • +
        + + + +
          +
        • +

          getMainTreeMaxDepth

          +
          public int getMainTreeMaxDepth()
          +
          Returns the maximum depth of the main database tree. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          maximum depth of the main database tree.
          +
          +
        • +
        + + + +
          +
        • +

          getDuplicateTreeMaxDepth

          +
          public int getDuplicateTreeMaxDepth()
          +
          Deprecated. as of 5.0, returns zero.
          +
        • +
        + + + +
          +
        • +

          getINsByLevel

          +
          public long[] getINsByLevel()
          +
          Returns the count of Internal Nodes per level, indexed by level. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          count of Internal Nodes per level, indexed by level.
          +
          +
        • +
        + + + +
          +
        • +

          getBINsByLevel

          +
          public long[] getBINsByLevel()
          +
          Returns the count of Bottom Internal Nodes per level, indexed by level. + +

          The information is included only if the Database.getStats call was not + configured by the StatsConfig.setFast method.

          +
          +
          Returns:
          +
          count of Bottom Internal Nodes per level, indexed by level.
          +
          +
        • +
        + + + +
          +
        • +

          getBINEntriesHistogram

          +
          public long[] getBINEntriesHistogram()
          +
          Returns an array representing a histogram of the number of Bottom + Internal Nodes with various percentages of non-deleted entry counts. + The array is 10 elements and each element represents a range of 10%. + +
          + element [0]: # BINs with 0% to 9% entries used by non-deleted values
          + element [1]: # BINs with 10% to 19% entries used by non-deleted values
          + element [2]: # BINs with 20% to 29% entries used by non-deleted values
          + ...
          + element [0]: # BINs with 90% to 100% entries used by non-deleted values
          + 
          +
          +
          Returns:
          +
          an array representing a histogram of the number of BINs with + various percentages of non-deleted entries.
          +
          +
        • +
        + + + +
          +
        • +

          getDINsByLevel

          +
          public long[] getDINsByLevel()
          +
          Deprecated. as of 5.0, returns an empty array.
          +
        • +
        + + + +
          +
        • +

          getDBINsByLevel

          +
          public long[] getDBINsByLevel()
          +
          Deprecated. as of 5.0, returns an empty array.
          +
        • +
        + + + +
          +
        • +

          getRelatches

          +
          public long getRelatches()
          +
          Returns the number of latch upgrades (relatches) required while + operating on this database's BTree. Latch upgrades are required when an + operation assumes that a shared (read) latch will be sufficient but + later determines that an exclusive (write) latch will actually be + required.
          +
          +
          Returns:
          +
          number of latch upgrades (relatches) required.
          +
          +
        • +
        + + + +
          +
        • +

          getRootSplits

          +
          public int getRootSplits()
          +
          The number of times the root of the BTree was split.
          +
          +
          Returns:
          +
          number of times the root was split.
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          For convenience, the BtreeStats class has a toString method that lists + all the data fields.
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          +
        • +
        + + + +
          +
        • +

          toStringVerbose

          +
          public java.lang.String toStringVerbose()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + +

    Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

    + + diff --git a/docs/java/com/sleepycat/je/CacheMode.html b/docs/java/com/sleepycat/je/CacheMode.html new file mode 100644 index 0000000..60bc902 --- /dev/null +++ b/docs/java/com/sleepycat/je/CacheMode.html @@ -0,0 +1,723 @@ + + + + + +CacheMode (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
    + + + + + + + +
    Berkeley DB Java Edition
    version 7.5.11 +
    +
    + + + +
    +
    com.sleepycat.je
    +

    Enum CacheMode

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<CacheMode>
      • +
      • +
          +
        • com.sleepycat.je.CacheMode
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<CacheMode>
      +
      +
      +
      +
      public enum CacheMode
      +extends java.lang.Enum<CacheMode>
      +
      Modes that can be specified for control over caching of records in the JE + in-memory cache. When a record is stored or retrieved, the cache mode + determines how long the record is subsequently retained in the JE in-memory + cache, relative to other records in the cache. + +

      When the cache overflows, JE must evict some records from the cache. By + default, JE uses a Least Recently Used (LRU) algorithm for determining which + records to evict. With the LRU algorithm, JE makes a best effort to evict + the "coldest" (least recently used or accessed) records and to retain the + "hottest" records in the cache for as long as possible.

      + +

      When an off-heap + cache is configured, records evicted from the main cache are placed in + the off-heap cache, and a separate LRU is used to determine when to evict + a record from the off-heap cache.

      + +

      JE uses an approximate LRU approach with some exceptions and special + cases.

      +
        +
      • + Individual records (LNs or Leaf Nodes) do not appear on the LRU + list, i.e., their "hotness" is not explicitly tracked. Instead, + their containing Btree node (BIN or bottom internal node) appears on + the LRU list. Each BIN contains roughly 100 LNs + (see EnvironmentConfig.NODE_MAX_ENTRIES). + When an LN is accessed, its BIN is moved to the hot end of the LRU + list, implying that all other LNs in the same BIN also are treated + as if they are hot. The same applies if the BIN is moved to the cold + end of the LRU list. The above statement applies to the off-heap + cache also, when one is configured. +
      • +
      • + When a BIN contains LNs and the BIN reaches the cold end of the LRU + list, memory can be reclaimed by evicting the LNs, and eviction of + the BIN is deferred. The empty BIN is moved to the hot end of the + LRU list. When an off-heap cache is configured, the eviction of LNs + in this manner occurs independently in both caches. +
      • +
      • + When a BIN contains no LNs, it may be evicted entirely. When the + BINs parent node becomes empty, it may also be evicted, and so on. + The BINs and INs are evicted on the basis of an LRU, but with two + exceptions: +

        + 1) Dirty BINs and INs are evicted only after eviction of all + non-dirty BINs and INs. This is important to reduce logging and + associated cleaning costs. When an off-heap cache is configured, + BINs and INs are evicted from the main cache without regard to + whether they are dirty. Dirty BINs and INs are evicted last, as + just described, only from the off-heap cache. +

        + 2) A BIN may be mutated to a BIN-delta to reclaim memory, rather + then being evicted entirely. A BIN-delta contains only the dirty + entries (for LNs recently logged). A BIN-delta is used when its + size relative to the full BIN will be small enough so that it will + be more efficient, both on disk and in memory, to store the delta + rather than the full BIN. + (see EnvironmentConfig.TREE_BIN_DELTA). + The advantage of keeping a BIN-delta in cache is that some + operations, particularly record insertions, can be performed using + the delta without having the complete BIN in cache. When a BIN is + mutated to a BIN-delta to reclaim memory, it is placed at the hot + end of the LRU list. When an off-heap cache is configured, BINs are + not mutated to BIN-deltas in the main cache, but rather this is done + only in the off-heap cache. +

      • +
      • + To reduce contention among threads on the LRU list, multiple LRU + lists may be configured. See + EnvironmentConfig.EVICTOR_N_LRU_LISTS. + As described in the javadoc for this parameter, there is a trade-off + between thread contention and the accuracy of the LRU. This + parameter determines the number of main cache LRU lists as well as + the number of off-heap cache LRU lists, when an off-heap cache is + configured. +
      • +
      • + A non-default cache mode may be explicitly specified to override + the LRU behavior. See the CacheMode enumeration values for details. + the normal LRU behavior described above. See the CacheMode + enumeration values for details. The behavior of each CacheMode + when an off-heap cache is configured is also described. +
      • +
      + +

      When no cache mode is explicitly specified, the default cache mode is + DEFAULT. The default mode causes the normal LRU algorithm to be + used.

      + +

      An explicit cache mode may be specified as an Environment property, a Database property, a Cursor property, or on a per-operation basis using + ReadOptions.setCacheMode(CacheMode) or WriteOptions.setCacheMode(CacheMode). If none are specified, DEFAULT is used. If more than one non-null property is specified, the + Cursor property overrides the Database and Environment properties, and the + Database property overrides the Environment property.

      + +

      When all records in a given Database, or all Databases, should be treated + the same with respect to caching, using the Database and/or Environment + cache mode properties is sufficient. For applications that need finer + grained control, the Cursor cache mode property can be used to provide a + specific cache mode for individual records or operations. The Cursor cache + mode property can be changed at any time, and the cache mode specified will + apply to subsequent operations performed with that Cursor.

      + +

      In a Replicated Environment where a non-default cache mode is desired, + the cache mode can be configured on the Master node as described above. + However, it is important to configure the cache mode on the Replica nodes + using an Environment property. That way, the cache mode will apply to + write operations that are replayed on the Replica for all + Databases, even if the Databases are not open by the application on the + Replica. Since all nodes may be Replicas at some point in their life cycle, + it is recommended to configure the desired cache mode as an Environment + property on all nodes in a Replicated Environment.

      + +

      On a Replica, per-Database control over the cache mode for write + operations is possible by opening the Database on the Replica and + configuring the cache mode. Per-Cursor control (meaning per-record or + per-operation) control of the cache mode is not possible on a Replica for + write operations. For read operations, both per-Database + and per-Cursor control is possible on the Replica, as described above.

      +

      + The cache related stats in EnvironmentStats can provide some measure + of the effectiveness of the cache mode choice.

      +
      +
      See Also:
      +
      Cache Statistics: + Sizing
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Summary

        + + + + + + + + + + + + + + + + + + + + + + + +
        Enum Constants 
        Enum Constant and Description
        DEFAULT +
        The record's hotness is changed to "most recently used" by the + operation.
        +
        EVICT_BIN +
        The record's BIN (and its LNs) are evicted after the operation.
        +
        EVICT_LN +
        The record's LN is evicted after the operation, and the containing + BIN is moved to the hot end of the LRU list.
        +
        KEEP_HOT +
        Deprecated.  +
        please use DEFAULT instead. As of JE 4.0, this mode + functions exactly as if DEFAULT were specified.
        +
        +
        MAKE_COLD +
        Deprecated.  +
        please use UNCHANGED instead. As of JE 4.0, this + mode functions exactly as if UNCHANGED were specified.
        +
        +
        UNCHANGED +
        The record's hotness or coldness is unchanged by the operation where + this cache mode is specified.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static CacheModevalueOf(java.lang.String name) +
        Returns the enum constant of this type with the specified name.
        +
        static CacheMode[]values() +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Detail

        + + + +
          +
        • +

          DEFAULT

          +
          public static final CacheMode DEFAULT
          +
          The record's hotness is changed to "most recently used" by the + operation. + +

          This cache mode is used when the application does not need explicit + control over the cache and a standard LRU approach is sufficient.

          + +

          Note that null may be specified to use the DEFAULT + mode.

          + +

          Specifically: +

            +
          • The BIN containing the record's LN will remain in the main + cache, and it is moved to the hot end of its LRU list.
          • + +
          • When an off-heap cache is configured, the record's LN and BIN + will be loaded into the main cache only. They will be removed from + the off-heap cache, if they were present there. However, if other + LNs belonging to this BIN were present in the off-heap cache, they + will remain there.
          • +
            +
          • +
          + + + +
            +
          • +

            KEEP_HOT

            +
            public static final CacheMode KEEP_HOT
            +
            Deprecated. please use DEFAULT instead. As of JE 4.0, this mode + functions exactly as if DEFAULT were specified.
            +
          • +
          + + + +
            +
          • +

            UNCHANGED

            +
            public static final CacheMode UNCHANGED
            +
            The record's hotness or coldness is unchanged by the operation where + this cache mode is specified. + +

            This cache mode is normally used when the application prefers that + the operation should not perturb the cache, for example, when scanning + over all records in a database.

            + +

            Specifically: +

              +
            • A record's LN and BIN must be loaded into the main cache in + order to perform the operation. However, they may be removed from + the main cache after the operation, to avoid a net change to the + cache, according to the rules below.
            • + +
            • If the record's LN was not present in the main cache prior to + the operation, then the LN will be evicted from the main cache + after the operation. The LN will not be added to, or removed from, + the off-heap cache.
            • + +
            • When the LN is to be evicted from the main cache (according to + the above rules) and the operation is not performed via a cursor, + the LN is evicted when the operation is complete. When a cursor is + used, the LN is evicted when the cursor is moved to a different + record or closed.
            • + +
            • If the record's BIN was not present in the main cache prior to + the operation, the action taken depends on whether the BIN is dirty + and whether an off-heap cache is configured. +
                +
              • When the BIN is not dirty, the BIN (and LN) will be evicted + from the main cache after the operation. The BIN (and LN) will + not be added to, or removed from, the off-heap cache.
              • + +
              • When the BIN is dirty and an off-heap cache is + not configured, the BIN will not be evicted from the + main cache and will be moved to the hot end of its main cache + LRU list. This is done to reduce logging.
              • + +
              • When the BIN is dirty and an off-heap cache is + configured, we evict the BIN from the main cache even when it + is dirty because the BIN (and LN) will be stored in the off-heap + cache and the BIN will not be logged. The BIN will be placed at + the hot end of its off-heap LRU list.
              • + +
              • Note that when this operation loaded the BIN and the BIN + becomes dirty, it is normally because this operation is a write + operation. However, other concurrent threads can also dirty the + BIN.
              • +
              + +
            • When the BIN is to be evicted from the main cache (according + to the above rules) and the operation is not performed via a + cursor, the BIN is evicted when the operation is complete. When a + cursor is used, the BIN is evicted only when the cursor moves to a + different BIN or is closed. Because of the way BINs are evicted, + when multiple operations are performed using a single cursor and + not perturbing the cache is desired, it is important to use this + cache mode for all of the operations.
            • + +
            • When the BIN was present in the main cache prior to the + operation, its position in the LRU list will not be changed. Its + position in the off-heap LRU list, if it is present in the off-heap + cache, will also not be changed.
            • +
            +
          • +
          + + + +
            +
          • +

            MAKE_COLD

            +
            public static final CacheMode MAKE_COLD
            +
            Deprecated. please use UNCHANGED instead. As of JE 4.0, this + mode functions exactly as if UNCHANGED were specified.
            +
          • +
          + + + +
            +
          • +

            EVICT_LN

            +
            public static final CacheMode EVICT_LN
            +
            The record's LN is evicted after the operation, and the containing + BIN is moved to the hot end of the LRU list. + +

            This cache mode is normally used when not all LNs will fit into the + main cache, and the application prefers to read the LN from the log file + or load it from the off-heap cache when the record is accessed again, + rather than have it take up space in the main cache and potentially + cause expensive Java GC. By using this mode, the file system cache or + off-heap cache can be relied on for holding LNs, which complements the + use of the JE cache to hold BINs and INs.

            + +

            Note that using this mode for all operations will prevent the cache + from filling, if all internal nodes fit in cache.

            + +

            Specifically: +

              +
            • The record's LN will be evicted from the main cache after the + operation. The LN will be added to the off-heap cache, if it is not + already present and an off-heap cache is configured.
            • + +
            • When the operation is not performed via a cursor, the LN is + evicted when the operation is complete. When a cursor is used, the + LN is evicted when the cursor is moved to a different record or + closed.
            • +
            +
            +
            Since:
            +
            3.3.98
            +
            +
          • +
          + + + +
            +
          • +

            EVICT_BIN

            +
            public static final CacheMode EVICT_BIN
            +
            The record's BIN (and its LNs) are evicted after the operation. + +

            This cache mode is normally used when not all BINs will fit into the + main cache, and the application prefers to read the LN and BIN from the + log file or load it from the off-heap cache when the record is accessed + again, rather than have them take up space in the JE cache and + potentially cause expensive Java GC.

            + +

            Because this mode evicts all LNs in the BIN, even if they are "hot" + from the perspective of a different accessor, this mode should be used + with caution. One valid use case is where all accessors use this mode; + in this case the cache mode might be set on a per-Database or + per-Environment basis.

            + +

            Note that using this mode for all operations will prevent the cache + from filling, if all upper internal nodes fit in cache.

            + +

            Specifically: +

              +
            • The record's LN will be evicted from the main cache after the + operation. The LN will be added to the off-heap cache, if it is not + already present and an off-heap cache is configured.
            • + +
            • When the operation is not performed via a cursor, the LN is + evicted when the operation is complete. When a cursor is used, the + LN is evicted when the cursor is moved to a different record or + closed.
            • + +
            • Whether the BIN is evicted depends on whether the BIN is dirty + and whether an off-heap cache is configured. +
                +
              • When the BIN is not dirty, the BIN (and LN) will be evicted + from the main cache after the operation. The BIN (and LN) will + be added to the off-heap cache, if they are not already present + and an off-heap cache is configured. The BIN will be placed at + the hot end of its off-heap LRU list.
              • + +
              • When the BIN is dirty and an off-heap cache is + not configured, the BIN will not be evicted from the + main cache and will be moved to the hot end of its main cache + LRU list. This is done to reduce logging.
              • + +
              • When the BIN is dirty and an off-heap cache is + configured, we evict the BIN from the main cache even when it + is dirty because the BIN (and LN) will be stored in the off-heap + cache and the BIN will not be logged. The BIN will be placed at + the hot end of its off-heap LRU list.
              • + +
              • Note that BIN may have been dirtied by this operation, if + it is a write operation, or by earlier write operations.
              • +
              + +
            • When the BIN is to be evicted from the main cache (according + to the above rules) and the operation is not performed via a + cursor, the BIN is evicted when the operation is complete. When a + cursor is used, the BIN is evicted only when the cursor moves to a + different BIN or is closed. Because of the way BINs are evicted, + when multiple operations are performed using a single cursor and + not perturbing the cache is desired, it is important to use this + cache mode for all of the operations.
            • +
            +
            +
            Since:
            +
            4.0.97
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static CacheMode[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (CacheMode c : CacheMode.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static CacheMode valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/CheckpointConfig.html b/docs/java/com/sleepycat/je/CheckpointConfig.html new file mode 100644 index 0000000..2ea633e --- /dev/null +++ b/docs/java/com/sleepycat/je/CheckpointConfig.html @@ -0,0 +1,541 @@ + + + + + +CheckpointConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class CheckpointConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.CheckpointConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class CheckpointConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of a checkpoint operation invoked from Environment.checkpoint.
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          CheckpointConfig() +
          An instance created using the default constructor is initialized with + the system's default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          CheckpointConfigclone() +
          Returns a copy of this configuration object.
          +
          booleangetForce() +
          Returns the configuration of the checkpoint force option.
          +
          intgetKBytes() +
          Returns the checkpoint log data threshold, in kilobytes.
          +
          booleangetMinimizeRecoveryTime() +
          Returns the configuration of the minimize recovery time option.
          +
          intgetMinutes() +
          Returns the checkpoint time threshold, in minutes.
          +
          CheckpointConfigsetForce(boolean force) +
          Configures the checkpoint force option.
          +
          CheckpointConfigsetKBytes(int kBytes) +
          Configures the checkpoint log data threshold, in kilobytes.
          +
          CheckpointConfigsetMinimizeRecoveryTime(boolean minimizeRecoveryTime) +
          Configures the minimize recovery time option.
          +
          CheckpointConfigsetMinutes(int minutes) +
          Configures the checkpoint time threshold, in minutes.
          +
          java.lang.StringtoString() +
          Returns the values for each configuration attribute.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            CheckpointConfig

            +
            public CheckpointConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setKBytes

            +
            public CheckpointConfig setKBytes(int kBytes)
            +
            Configures the checkpoint log data threshold, in kilobytes. + +

            The default is 0 for this class and the database environment.

            +
            +
            Parameters:
            +
            kBytes - If the kBytes parameter is non-zero, a checkpoint will + be performed if more than kBytes of log data have been written since + the last checkpoint.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getKBytes

            +
            public int getKBytes()
            +
            Returns the checkpoint log data threshold, in kilobytes. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The checkpoint log data threshold, in kilobytes.
            +
            +
          • +
          + + + +
            +
          • +

            setMinutes

            +
            public CheckpointConfig setMinutes(int minutes)
            +
            Configures the checkpoint time threshold, in minutes. + +

            The default is 0 for this class and the database environment.

            +
            +
            Parameters:
            +
            minutes - If the minutes parameter is non-zero, a checkpoint is + performed if more than min minutes have passed since the last + checkpoint.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getMinutes

            +
            public int getMinutes()
            +
            Returns the checkpoint time threshold, in minutes.
            +
            +
            Returns:
            +
            The checkpoint time threshold, in minutes.
            +
            +
          • +
          + + + +
            +
          • +

            setForce

            +
            public CheckpointConfig setForce(boolean force)
            +
            Configures the checkpoint force option. + +

            The default is false for this class and the BDB JE environment.

            +
            +
            Parameters:
            +
            force - If set to true, force a checkpoint, even if there has + been no activity since the last checkpoint.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getForce

            +
            public boolean getForce()
            +
            Returns the configuration of the checkpoint force option.
            +
            +
            Returns:
            +
            The configuration of the checkpoint force option.
            +
            +
          • +
          + + + +
            +
          • +

            setMinimizeRecoveryTime

            +
            public CheckpointConfig setMinimizeRecoveryTime(boolean minimizeRecoveryTime)
            +
            Configures the minimize recovery time option. + +

            The default is false for this class and the BDB JE environment.

            +
            +
            Parameters:
            +
            minimizeRecoveryTime - If set to true, the checkpoint will itself + take longer but will cause a subsequent recovery (Environment.open) to + finish more quickly.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getMinimizeRecoveryTime

            +
            public boolean getMinimizeRecoveryTime()
            +
            Returns the configuration of the minimize recovery time option.
            +
            +
            Returns:
            +
            The configuration of the minimize recovery time option.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public CheckpointConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/CommitToken.html b/docs/java/com/sleepycat/je/CommitToken.html new file mode 100644 index 0000000..9ce8716 --- /dev/null +++ b/docs/java/com/sleepycat/je/CommitToken.html @@ -0,0 +1,352 @@ + + + + + +CommitToken (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class CommitToken

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.CommitToken
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<CommitToken>
        +
        +
        +
        +
        public class CommitToken
        +extends java.lang.Object
        +implements java.io.Serializable, java.lang.Comparable<CommitToken>
        +
        Defines an opaque token that can be used to identify a specific transaction + commit in a replicated environment. It's unique relative to its environment. +

        + Since CommitTokens identify a point in the serialized transaction schedule + created on the master, it's meaningful to compare commit tokens, + as described in the compareTo(CommitToken) method below. + CommitTokens are obtained from Transaction.getCommitToken()

        +
        +
        See Also:
        +
        CommitPointConsistencyPolicy, +Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getRepenvUUID

            +
            public java.util.UUID getRepenvUUID()
            +
          • +
          + + + +
            +
          • +

            getVLSN

            +
            public long getVLSN()
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object obj)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            compareTo

            +
            public int compareTo(CommitToken other)
            +
            Implements the Comparable interface. Note that it's not meaningful to + compare commit tokens across environments, since they represent + states in unrelated serialized transaction streams. +

            + CommitToken(1) < CommitToken(2) implies that CommitToken(1) represents + a state of the database that preceded the state defined by + CommitToken(2).

            +
            +
            Specified by:
            +
            compareTo in interface java.lang.Comparable<CommitToken>
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if two tokens from different + environments are compared.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Cursor.html b/docs/java/com/sleepycat/je/Cursor.html new file mode 100644 index 0000000..6d1e399 --- /dev/null +++ b/docs/java/com/sleepycat/je/Cursor.html @@ -0,0 +1,1975 @@ + + + + + +Cursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class Cursor

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.Cursor
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ForwardCursor, java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        Direct Known Subclasses:
        +
        SecondaryCursor
        +
        +
        +
        +
        public class Cursor
        +extends java.lang.Object
        +implements ForwardCursor
        +
        A database cursor. Cursors are used for operating on collections of records, + for iterating over a database, and for saving handles to individual records, + so that they can be modified after they have been read. + +

        Cursors which are opened with a transaction instance are transactional + cursors and may be used by multiple threads, but only serially. That is, + the application must serialize access to the handle. Non-transactional + cursors, opened with a null transaction instance, may not be used by + multiple threads.

        + +

        If the cursor is to be used to perform operations on behalf of a + transaction, the cursor must be opened and closed within the context of that + single transaction.

        + +

        Once the cursor close() method has been called, the handle may not + be accessed again, regardless of the close method's success or + failure, with one exception: the close method itself may be called + any number of times to simplify error handling.

        + +

        To obtain a cursor with default attributes:

        + +
        +     Cursor cursor = myDatabase.openCursor(txn, null);
        + 
        + +

        To customize the attributes of a cursor, use a CursorConfig object.

        + +
        +     CursorConfig config = new CursorConfig();
        +     config.setReadUncommitted(true);
        +     Cursor cursor = myDatabase.openCursor(txn, config);
        + 
        + +

        Modifications to the database during a sequential scan will be reflected + in the scan; that is, records inserted behind a cursor will not be returned + while records inserted in front of a cursor will be returned.

        + +

        By default, a cursor is "sticky", meaning that the prior position is + maintained by cursor movement operations, and the cursor stays at the + prior position when the operation does not succeed. However, it is possible + to configure a cursor as non-sticky to enable certain performance benefits. + See CursorConfig.setNonSticky(boolean) for details.

        + +

        Using Null and Partial DatabaseEntry + Parameters

        + +

        Null can be passed for DatabaseEntry output parameters if the value is + not needed. The DatabaseEntry Partial + property can also be used to optimize in certain cases. These provide + varying degrees of performance benefits that depend on the specific + operation, as described below.

        + +

        When retrieving a record with a Database or Cursor + method, if only the key is needed by the application then the retrieval of + the data item can be suppressed by passing null. If null is passed as + the data parameter, the data item will not be returned by the Database or Cursor method.

        + +

        Suppressing the return of the data item potentially has a large + performance benefit. In this case, if the record data is not already in the + JE cache, it will not be read from disk. The performance benefit is + potentially large because random access disk reads may be reduced. Examples + use cases are:

        +
          +
        • Scanning all records in key order, when the data is not needed.
        • +
        • Skipping over records quickly with READ_UNCOMMITTED isolation to + select records for further processing by examining the key value.
        • +
        + +

        Note that by "record data" we mean both the data parameter for a + regular or primary DB, and the pKey parameter for a secondary DB. + However, the performance advantage of a key-only operation does not apply to + databases configured for duplicates. For a duplicates DB, the data is always + available along with the key and does not have to be fetched separately.

        + +

        The Partial property may also be used to retrieve or update only a + portion of a data item. This avoids copying the entire record between the + JE cache and the application data parameter. However, this feature has less + of a performance benefit than one might assume, since the entire record is + always read or written to the database, and the entire record is cached. A + partial update may be performed only with + Cursor.putCurrent.

        + +

        A null or partial DatabaseEntry output parameter may also be used in + other cases, for example, to retrieve a partial key item. However, in + practice this has limited value since the entire key is usually needed by + the application, and the benefit of copying a portion of the key is + generally very small.

        + +

        Historical note: Prior to JE 7.0, null could not be passed for output + parameters. Instead, DatabaseEntry.setPartial(0, 0, true) was called + for a data parameter to avoid reading the record's data. Now, null can be + passed instead.

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDatabase

            +
            public Database getDatabase()
            +
            Returns the Database handle associated with this Cursor.
            +
            +
            Specified by:
            +
            getDatabase in interface ForwardCursor
            +
            Returns:
            +
            The Database handle associated with this Cursor.
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public CursorConfig getConfig()
            +
            Returns this cursor's configuration. + +

            This may differ from the configuration used to open this object if + the cursor existed previously.

            +
            +
            Returns:
            +
            This cursor's configuration.
            +
            +
          • +
          + + + +
            +
          • +

            getCacheMode

            +
            public CacheMode getCacheMode()
            +
            Returns the default CacheMode used for subsequent operations + performed using this cursor. If setCacheMode(com.sleepycat.je.CacheMode) has not been + called with a non-null value, the configured Database or Environment + default is returned.
            +
            +
            Returns:
            +
            the CacheMode default used for subsequent operations + using this cursor.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            close

            +
            public void close()
            +
            Discards the cursor. + +

            The cursor handle may not be used again after this method has been + called, regardless of the method's success or failure, with one + exception: the close method itself may be called any number of + times.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface ForwardCursor
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          + + + +
            +
          • +

            dup

            +
            public Cursor dup(boolean samePosition)
            +
            Returns a new cursor with the same transaction and locker ID as the + original cursor. + +

            This is useful when an application is using locking and requires + two or more cursors in the same thread of control.

            +
            +
            Parameters:
            +
            samePosition - If true, the newly created cursor is initialized + to refer to the same position in the database as the original cursor + (if any) and hold the same locks (if any). If false, or the original + cursor does not hold a database position and locks, the returned + cursor is uninitialized and will behave like a newly created cursor.
            +
            Returns:
            +
            A new cursor with the same transaction and locker ID as the + original cursor.
            +
            Throws:
            +
            DatabasePreemptedException - in a replicated + environment if the master has truncated, removed or renamed the + database.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            delete

            +
            public OperationResult delete(WriteOptions options)
            +
            Deletes the record to which the cursor refers. When the database has + associated secondary databases, this method also deletes the associated + index records. + +

            The cursor position is unchanged after a delete, and subsequent calls + to cursor functions expecting the cursor to refer to an existing record + will fail.

            +
            +
            Parameters:
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is deleted, else null if the + record at the cursor position has already been deleted.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is transactional + but this cursor was not opened with a non-null transaction parameter, + or the database is read-only.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            delete

            +
            public OperationStatus delete()
            +
            Deletes the record to which the cursor refers. When the database has + associated secondary databases, this method also deletes the associated + index records. + +

            The cursor position is unchanged after a delete, and subsequent calls + to cursor functions expecting the cursor to refer to an existing record + will fail.

            + +

            Calling this method is equivalent to calling delete(WriteOptions).

            +
            +
            Returns:
            +
            OperationStatus.KEYEMPTY if the record at the cursor position has + already been deleted; otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is transactional + but this cursor was not opened with a non-null transaction parameter, + or the database is read-only.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            +
          • +
          + + + +
            +
          • +

            put

            +
            public OperationResult put(DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Put putType,
            +                           WriteOptions options)
            +
            Inserts or updates a record according to the specified Put + type. + +

            If the operation succeeds, the record will be locked according to the + lock mode specified, the cursor will + be positioned on the record, and a non-null OperationResult will be + returned. If the operation fails because the record already exists (or + does not exist, depending on the putType), null is returned.

            + +

            When the database has associated secondary databases, this method + also inserts or deletes associated index records as necessary.

            + +

            The following table lists each allowed operation. See the individual + Put operations for more information.

            + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Put operationDescriptionReturns null when?Other special rules
            Put.OVERWRITEInserts or updates a record depending on whether a matching + record is already present.Never returns null.Without duplicates, a matching record is one with the same key; + with duplicates, it is one with the same key and data.
            Put.NO_OVERWRITEInserts a record if a record with a matching key is not already + present.When an existing record matches.If the database has duplicate keys, a record is inserted only if + there are no records with a matching key.
            Put.NO_DUP_DATAInserts a record in a database with duplicate keys if a record + with a matching key and data is not already present.When an existing record matches.Without duplicates, this operation is not allowed.
            Put.CURRENTUpdates the data of the record at the cursor position.When the record at the cursor position has been deleted.With duplicates, the data must be considered equal by the + duplicate comparator, meaning that changing the data is only + possible if a custom duplicate comparator is configured. +

            + Cannot be used to update the key of an existing record and in + fact the key parameter must be null. +

            + A partial data item may be + specified to optimize for partial data update. +

            +
            +
            Parameters:
            +
            key - the key used as + input. Must be null when + putType is Put.CURRENT.
            +
            data - the data used as + input. May be partial only when + putType is Put.CURRENT.
            +
            putType - the Put operation type. May not be null.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is written, else null.
            +
            Throws:
            +
            DuplicateDataException - if putType is Put.CURRENT and the old and + new data are not equal according to the configured duplicate comparator + or default comparator.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is transactional + but this cursor was not opened with a non-null transaction parameter, + or the database is read-only, or putType is Put.NO_DUP_DATA and the + database is not configured for duplicates.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null putType, a null input key/data parameter, + an input key/data parameter with a null data array, a partial key/data + input parameter.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            put

            +
            public OperationStatus put(DatabaseEntry key,
            +                           DatabaseEntry data)
            +
            Stores a key/data pair into the database. + +

            Calling this method is equivalent to calling put(DatabaseEntry, DatabaseEntry, Put, WriteOptions) with + Put.OVERWRITE.

            + +

            If the put method succeeds, the cursor is positioned to refer to the + newly inserted item.

            + +

            If the key already appears in the database and duplicates are + supported, the new data value is inserted at the correct sorted + location, unless the new data value also appears in the database + already. In the later case, although the given key/data pair compares + equal to an existing key/data pair, the two records may not be identical + if custom comparators are used, in which case the existing record will + be replaced with the new record. If the key already appears in the + database and duplicates are not supported, the data associated with + the key will be replaced.

            +
            +
            Parameters:
            +
            key - the key used as + input..
            +
            data - the data used as + input.
            +
            Returns:
            +
            OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is transactional + but this cursor was not opened with a non-null transaction parameter, + or the database is read-only.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            putNoDupData

            +
            public OperationStatus putNoDupData(DatabaseEntry key,
            +                                    DatabaseEntry data)
            +
            Stores a key/data pair into the database. The database must be + configured for duplicates. + +

            Calling this method is equivalent to calling put(DatabaseEntry, DatabaseEntry, Put, WriteOptions) with + Put.NO_DUP_DATA.

            + +

            If the putNoDupData method succeeds, the cursor is positioned to + refer to the newly inserted item.

            + +

            Insert the specified key/data pair into the database, unless a + key/data pair comparing equally to it already exists in the database. + If a matching key/data pair already exists in the database, OperationStatus.KEYEXIST is + returned.

            +
            +
            Parameters:
            +
            key - the key used as + input..
            +
            data - the data used as + input.
            +
            Returns:
            +
            OperationStatus.KEYEXIST if the key/data pair already appears in the + database, else OperationStatus.SUCCESS
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is transactional + but this cursor was not opened with a non-null transaction parameter, or + the database is read-only, or the database is not configured for + duplicates.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            putCurrent

            +
            public OperationStatus putCurrent(DatabaseEntry data)
            +
            Replaces the data in the key/data pair at the current cursor position. + +

            Calling this method is equivalent to calling put(DatabaseEntry, DatabaseEntry, Put, WriteOptions) with + Put.CURRENT.

            + +

            Overwrite the data of the key/data pair to which the cursor refers + with the specified data item. This method will return + OperationStatus.NOTFOUND if the cursor currently refers to an + already-deleted key/data pair.

            + +

            For a database that does not support duplicates, the data may be + changed by this method. If duplicates are supported, the data may be + changed only if a custom partial comparator is configured and the + comparator considers the old and new data to be equal (that is, the + comparator returns zero). For more information on partial comparators + see DatabaseConfig.setDuplicateComparator(java.util.Comparator<byte[]>).

            + +

            If the old and new data are unequal according to the comparator, a + DuplicateDataException is thrown. Changing the data in this + case would change the sort order of the record, which would change the + cursor position, and this is not allowed. To change the sort order of a + record, delete it and then re-insert it.

            +
            +
            Parameters:
            +
            data - the data used as + input. + A partial data item may be + specified to optimize for partial data update.
            +
            Returns:
            +
            OperationStatus.KEYEMPTY if the key/pair at the cursor position has + been deleted; otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            DuplicateDataException - if the old and new data are not equal + according to the configured duplicate comparator or default comparator.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is transactional + but this cursor was not opened with a non-null transaction parameter, + or the database is read-only.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationResult get(DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Moves the cursor to a record according to the specified Get + type. + +

            If the operation succeeds, the record at the resulting cursor + position will be locked according to the lock mode specified, the key and/or data will + be returned via the (non-null) DatabaseEntry parameters, and a non-null + OperationResult will be returned. If the operation fails because the + record requested is not found, null is returned.

            + +

            The following table lists each allowed operation and whether the key + and data parameters are input or + output parameters. Also specified is whether the cursor must be + initialized (positioned on a record) before calling this method. See the + individual Get operations for more information.

            + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Get operationDescription'key' parameter'data' parameterCursor position
            must be initialized?
            Get.SEARCHSearches using an exact match by key.inputoutputno
            Get.SEARCH_BOTHSearches using an exact match by key and data.inputinputno
            Get.SEARCH_GTESearches using a GTE match by key.input/outputoutputno
            Get.SEARCH_BOTH_GTESearches using an exact match by key and a GTE match by data.inputinput/outputno
            Get.CURRENTAccesses the current recordoutputoutputyes
            Get.FIRSTFinds the first record in the database.outputoutputno
            Get.LASTFinds the last record in the database.outputoutputno
            Get.NEXTMoves to the next record.outputoutputno**
            Get.NEXT_DUPMoves to the next record with the same key.outputoutputyes
            Get.NEXT_NO_DUPMoves to the next record with a different key.outputoutputno**
            Get.PREVMoves to the previous record.outputoutputno**
            Get.PREV_DUPMoves to the previous record with the same key.outputoutputyes
            Get.PREV_NO_DUPMoves to the previous record with a different key.outputoutputno**
            + +

            ** - For these 'next' and 'previous' operations the cursor may be + uninitialized, in which case the cursor will be moved to the first or + last record, respectively.

            +
            +
            Specified by:
            +
            get in interface ForwardCursor
            +
            Parameters:
            +
            key - the key input or output parameter, depending on getType.
            +
            data - the data input or output parameter, depending on getType.
            +
            getType - the Get operation type. May not be null.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + the cursor is uninitialized (not positioned on a record) and this is not + permitted (see above), or the non-transactional cursor was created in a + different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null getType, a null input key/data parameter, + an input key/data parameter with a null data array, a partial key/data + input parameter, and specifying a lock mode of READ_COMMITTED.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + + + + + + + + + + + + + + + + + + + + + +
            +
          • +

            getNextNoDup

            +
            public OperationStatus getNextNoDup(DatabaseEntry key,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Moves the cursor to the next non-duplicate key/data pair and returns + that pair. If the matching key has duplicate values, the first data + item in the set of duplicates is returned. + +

            Calling this method is equivalent to calling get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.NEXT_NO_DUP.

            + +

            If the cursor is not yet initialized, move the cursor to the first + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the next non-duplicate key of the database, and that + key/data pair is returned.

            +
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            getPrev

            +
            public OperationStatus getPrev(DatabaseEntry key,
            +                               DatabaseEntry data,
            +                               LockMode lockMode)
            +
            Moves the cursor to the previous key/data pair and returns that pair. + +

            Calling this method is equivalent to calling get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.PREV.

            + +

            If the cursor is not yet initialized, move the cursor to the last + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the previous key/data pair of the database, and that + pair is returned. In the presence of duplicate key values, the value of + the key may not change.

            +
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getPrevNoDup

            +
            public OperationStatus getPrevNoDup(DatabaseEntry key,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Moves the cursor to the previous non-duplicate key/data pair and returns + that pair. If the matching key has duplicate values, the last data item + in the set of duplicates is returned. + +

            Calling this method is equivalent to calling get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.PREV_NO_DUP.

            + +

            If the cursor is not yet initialized, move the cursor to the last + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the previous non-duplicate key of the database, and + that key/data pair is returned.

            +
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            skipNext

            +
            public long skipNext(long maxCount,
            +                     DatabaseEntry key,
            +                     DatabaseEntry data,
            +                     LockMode lockMode)
            +
            Skips forward a given number of key/data pairs and returns the number by + which the cursor is moved. + +

            Without regard to performance, calling this method is equivalent to + repeatedly calling getNext with LockMode.READ_UNCOMMITTED to skip over the desired number of key/data + pairs, and then calling getCurrent with the lockMode parameter to return the final key/data pair.

            + +

            With regard to performance, this method is optimized to skip over + key/value pairs using a smaller number of Btree operations. When there + is no contention on the bottom internal nodes (BINs) and all BINs are in + cache, the number of Btree operations is reduced by roughly two orders + of magnitude, where the exact number depends on the EnvironmentConfig.NODE_MAX_ENTRIES setting. When there is contention + on BINs or fetching BINs is required, the scan is broken up into smaller + operations to avoid blocking other threads for long time periods.

            + +

            If the returned count is greater than zero, then the key/data pair at + the new cursor position is also returned. If zero is returned, then + there are no key/value pairs that follow the cursor position and a + key/data pair is not returned.

            +
            +
            Parameters:
            +
            maxCount - the maximum number of key/data pairs to skip, i.e., the + maximum number by which the cursor should be moved; must be greater + than zero.
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            the number of key/data pairs skipped, i.e., the number by which + the cursor has moved; if zero is returned, the cursor position is + unchanged and the key/data pair is not returned.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            skipPrev

            +
            public long skipPrev(long maxCount,
            +                     DatabaseEntry key,
            +                     DatabaseEntry data,
            +                     LockMode lockMode)
            +
            Skips backward a given number of key/data pairs and returns the number + by which the cursor is moved. + +

            Without regard to performance, calling this method is equivalent to + repeatedly calling getPrev with LockMode.READ_UNCOMMITTED to skip over the desired number of key/data + pairs, and then calling getCurrent with the lockMode parameter to return the final key/data pair.

            + +

            With regard to performance, this method is optimized to skip over + key/value pairs using a smaller number of Btree operations. When there + is no contention on the bottom internal nodes (BINs) and all BINs are in + cache, the number of Btree operations is reduced by roughly two orders + of magnitude, where the exact number depends on the EnvironmentConfig.NODE_MAX_ENTRIES setting. When there is contention + on BINs or fetching BINs is required, the scan is broken up into smaller + operations to avoid blocking other threads for long time periods.

            + +

            If the returned count is greater than zero, then the key/data pair at + the new cursor position is also returned. If zero is returned, then + there are no key/value pairs that follow the cursor position and a + key/data pair is not returned.

            + +

            In a replicated environment, an explicit transaction must have been + specified when opening the cursor, unless read-uncommitted isolation is + specified via the CursorConfig or LockMode + parameter.

            +
            +
            Parameters:
            +
            maxCount - the maximum number of key/data pairs to skip, i.e., the + maximum number by which the cursor should be moved; must be greater + than zero.
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            the number of key/data pairs skipped, i.e., the number by which + the cursor has moved; if zero is returned, the cursor position is + unchanged and the key/data pair is not returned.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getSearchKeyRange

            +
            public OperationStatus getSearchKeyRange(DatabaseEntry key,
            +                                         DatabaseEntry data,
            +                                         LockMode lockMode)
            +
            Moves the cursor to the closest matching key of the database, and + returns the data item associated with the matching key. If the matching + key has duplicate values, the first data item in the set of duplicates + is returned. + +

            Calling this method is equivalent to calling get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.SEARCH_GTE.

            + +

            The returned key/data pair is for the smallest key greater than or + equal to the specified key (as determined by the key comparison + function), permitting partial key matches and range searches.

            +
            +
            Parameters:
            +
            key - the key used as + input and returned as output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes + are used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getSearchBothRange

            +
            public OperationStatus getSearchBothRange(DatabaseEntry key,
            +                                          DatabaseEntry data,
            +                                          LockMode lockMode)
            +
            Moves the cursor to the specified key and closest matching data item of + the database. + +

            Calling this method is equivalent to calling get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.SEARCH_BOTH_GTE.

            + +

            In the case of any database supporting sorted duplicate sets, the + returned key/data pair is for the smallest data item greater than or + equal to the specified data item (as determined by the duplicate + comparison function), permitting partial matches and range searches in + duplicate data sets.

            + +

            In the case of databases that do not support sorted duplicate sets, + this method is equivalent to getSearchBoth.

            +
            +
            Parameters:
            +
            key - the key used as + input.
            +
            data - the data used as + input and returned as output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            public int count()
            +
            Returns a count of the number of data items for the key to which the + cursor refers. + +

            If the database is configured for duplicates, the database is scanned + internally, without taking any record locks, to count the number of + non-deleted entries. Although the internal scan is more efficient under + some conditions, the result is the same as if a cursor were used to + iterate over the entries using LockMode.READ_UNCOMMITTED.

            + +

            If the database is not configured for duplicates, the count returned + is always zero or one, depending on the record at the cursor position is + deleted or not.

            + +

            The cost of this method is directly proportional to the number of + records scanned.

            +
            +
            Returns:
            +
            A count of the number of data items for the key to which the + cursor refers.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            +
          • +
          + + + +
            +
          • +

            countEstimate

            +
            public long countEstimate()
            +
            Returns a rough estimate of the count of the number of data items for + the key to which the cursor refers. + +

            If the database is configured for duplicates, a quick estimate of the + number of records is computed using information in the Btree. Because + the Btree is unbalanced, in some cases the estimate may be off by a + factor of two or more. The estimate is accurate when the number of + records is less than the configured NodeMaxEntries.

            + +

            If the database is not configured for duplicates, the count returned + is always zero or one, depending on the record at the cursor position is + deleted or not.

            + +

            The cost of this method is fixed, rather than being proportional to + the number of records scanned. Because its accuracy is variable, this + method should normally be used when accuracy is not required, such as + for query optimization, and a fixed cost operation is needed. For + example, this method is used internally for determining the index + processing order in a JoinCursor.

            +
            +
            Returns:
            +
            an estimate of the count of the number of data items for the key + to which the cursor refers.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/CursorConfig.html b/docs/java/com/sleepycat/je/CursorConfig.html new file mode 100644 index 0000000..d083ead --- /dev/null +++ b/docs/java/com/sleepycat/je/CursorConfig.html @@ -0,0 +1,608 @@ + + + + + +CursorConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class CursorConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.CursorConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class CursorConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of database cursor. An instance created with the + default constructor is initialized with the system's default settings.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static CursorConfigDEFAULT +
          Default configuration used if null is passed to methods that create a + cursor.
          +
          static CursorConfigREAD_COMMITTED +
          A convenience instance to configure a cursor for read committed + isolation.
          +
          static CursorConfigREAD_UNCOMMITTED +
          A convenience instance to configure read operations performed by the + cursor to return modified but not yet committed data.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          CursorConfig() +
          An instance created using the default constructor is initialized with + the system's default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          CursorConfigclone() +
          Returns a copy of this configuration object.
          +
          booleangetNonSticky() +
          Returns the non-sticky setting.
          +
          booleangetReadCommitted() +
          Returns true if read operations performed by the cursor are configured + to obey read committed isolation.
          +
          booleangetReadUncommitted() +
          Returns true if read operations performed by the cursor are configured + to return modified but not yet committed data.
          +
          CursorConfigsetNonSticky(boolean nonSticky) +
          Configures the behavior of the cursor when a cursor movement operation + returns OperationStatus.NOTFOUND.
          +
          CursorConfigsetReadCommitted(boolean readCommitted) +
          Configures read operations performed by the cursor to obey read + committed isolation.
          +
          CursorConfigsetReadUncommitted(boolean readUncommitted) +
          Configures read operations performed by the cursor to return modified + but not yet committed data.
          +
          java.lang.StringtoString() +
          Returns the values for each configuration attribute.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final CursorConfig DEFAULT
            +
            Default configuration used if null is passed to methods that create a + cursor.
            +
          • +
          + + + +
            +
          • +

            READ_UNCOMMITTED

            +
            public static final CursorConfig READ_UNCOMMITTED
            +
            A convenience instance to configure read operations performed by the + cursor to return modified but not yet committed data.
            +
          • +
          + + + +
            +
          • +

            READ_COMMITTED

            +
            public static final CursorConfig READ_COMMITTED
            +
            A convenience instance to configure a cursor for read committed + isolation. + + This ensures the stability of the current data item read by the cursor + but permits data read by this cursor to be modified or deleted prior to + the commit of the transaction.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            CursorConfig

            +
            public CursorConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setReadUncommitted

            +
            public CursorConfig setReadUncommitted(boolean readUncommitted)
            +
            Configures read operations performed by the cursor to return modified + but not yet committed data.
            +
            +
            Parameters:
            +
            readUncommitted - If true, configure read operations performed by + the cursor to return modified but not yet committed data.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            LockMode.READ_UNCOMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            getReadUncommitted

            +
            public boolean getReadUncommitted()
            +
            Returns true if read operations performed by the cursor are configured + to return modified but not yet committed data.
            +
            +
            Returns:
            +
            true if read operations performed by the cursor are configured + to return modified but not yet committed data.
            +
            See Also:
            +
            LockMode.READ_UNCOMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            setReadCommitted

            +
            public CursorConfig setReadCommitted(boolean readCommitted)
            +
            Configures read operations performed by the cursor to obey read + committed isolation. Read committed isolation provides for cursor + stability but not repeatable reads. Data items which have been + previously read by this transaction may be deleted or modified by other + transactions before the cursor is closed or the transaction completes.
            +
            +
            Parameters:
            +
            readCommitted - If true, configure read operations performed by + the cursor to obey read committed isolation.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            LockMode.READ_COMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            getReadCommitted

            +
            public boolean getReadCommitted()
            +
            Returns true if read operations performed by the cursor are configured + to obey read committed isolation.
            +
            +
            Returns:
            +
            true if read operations performed by the cursor are configured + to obey read committed isolation.
            +
            See Also:
            +
            LockMode.READ_COMMITTED
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getNonSticky

            +
            public boolean getNonSticky()
            +
            Returns the non-sticky setting.
            +
            +
            See Also:
            +
            setNonSticky(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public CursorConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/CustomStats.html b/docs/java/com/sleepycat/je/CustomStats.html new file mode 100644 index 0000000..06e1f73 --- /dev/null +++ b/docs/java/com/sleepycat/je/CustomStats.html @@ -0,0 +1,264 @@ + + + + + +CustomStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface CustomStats

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface CustomStats
        +
        A custom statistics object. Custom statistics allow for customization + of statistics that are written at periodic intervals to the je.stats.csv + file. The field names returned from the getFieldNames() method are used as + column headers in the je.stat.csv file. The getFieldNames() method is only + called once when the environment is opened. The field values are associated + with the field names in the order of the returned array. The + getFieldValues() method is called when a row is written to the statistics + file. The semantic for the values are implementation specific. The values + may represent totals, incremental (since the last getFieldValues() call), or + stateless (computed at the time the statistic is requested).
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          java.lang.String[]getFieldNames() +
          The field names that are output to the je.stats.csv file.
          +
          java.lang.String[]getFieldValues() +
          The field values that are output to the je.stats.csv file.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getFieldNames

            +
            java.lang.String[] getFieldNames()
            +
            The field names that are output to the je.stats.csv file.
            +
            +
            Returns:
            +
            Array of strings that represent the field values.
            +
            +
          • +
          + + + +
            +
          • +

            getFieldValues

            +
            java.lang.String[] getFieldValues()
            +
            The field values that are output to the je.stats.csv file.
            +
            +
            Returns:
            +
            Array of strings that represent a value for the + associated field name.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Database.html b/docs/java/com/sleepycat/je/Database.html new file mode 100644 index 0000000..697221d --- /dev/null +++ b/docs/java/com/sleepycat/je/Database.html @@ -0,0 +1,1550 @@ + + + + + +Database (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class Database

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.Database
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        Direct Known Subclasses:
        +
        SecondaryDatabase
        +
        +
        +
        +
        public class Database
        +extends java.lang.Object
        +implements java.io.Closeable
        +
        A database handle. + +

        Database attributes are specified in the DatabaseConfig class. Database handles are + free-threaded and may be used concurrently by multiple threads.

        + +

        To open an existing database with default attributes:

        + +
        +     Environment env = new Environment(home, null);
        +     Database myDatabase = env.openDatabase(null, "mydatabase", null);
        + 
        + +

        To create a transactional database that supports duplicates:

        + +
        +     DatabaseConfig dbConfig = new DatabaseConfig();
        +     dbConfig.setTransactional(true);
        +     dbConfig.setAllowCreate(true);
        +     dbConfig.setSortedDuplicates(true);
        +     Database db = env.openDatabase(txn, "mydatabase", dbConfig);
        + 
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            close

            +
            public void close()
            +
            Discards the database handle. +

            + When closing the last open handle for a deferred-write database, any + cached database information is flushed to disk as if sync() were + called. +

            + The database handle should not be closed while any other handle that + refers to it is not yet closed; for example, database handles should not + be closed while cursor handles into the database remain open, or + transactions that include operations on the database have not yet been + committed or aborted. Specifically, this includes Cursor and Transaction handles. +

            + When multiple threads are using the Database handle concurrently, only a single thread may call this + method. +

            + When called on a database that is the primary database for a secondary + index, the primary database should be closed only after all secondary + indices which reference it have been closed. +

            + The database handle may not be accessed again after this method is + called, regardless of the method's success or failure, with one + exception: the close method itself may be called any number of + times.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if cursors associated with this database + are still open.
            +
            See Also:
            +
            DatabaseConfig.setDeferredWrite
            +
            +
          • +
          + + + +
            +
          • +

            sync

            +
            public void sync()
            +
            Flushes any cached information for this database to disk; only + applicable for deferred-write databases. +

            Note that deferred-write databases are automatically flushed to disk + when the close() method is called.

            +
            +
            Throws:
            +
            DatabasePreemptedException - in a replicated + environment if the master has truncated, removed or renamed the + database.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is not a deferred-write + database, or this database is read-only.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            See Also:
            +
            DatabaseConfig.setDeferredWrite
            +
            +
          • +
          + + + +
            +
          • +

            openSequence

            +
            public Sequence openSequence(Transaction txn,
            +                             DatabaseEntry key,
            +                             SequenceConfig config)
            +
            Opens a sequence in the database.
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may + be specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - The key DatabaseEntry of the sequence.
            +
            config - The sequence attributes. If null, default attributes are + used.
            +
            Returns:
            +
            a new Sequence handle.
            +
            Throws:
            +
            SequenceExistsException - if the sequence record already exists + and the SequenceConfig ExclusiveCreate parameter is true.
            +
            SequenceNotFoundException - if the sequence record does not exist + and the SequenceConfig AllowCreate parameter is false.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs. If the sequence does not exist and the AllowCreate parameter is true, then one + of the Write + Operation Failures may also occur.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this database is read-only, or + this database is configured for duplicates.
            +
            java.lang.IllegalStateException - if the Sequence record is deleted by + another thread during this method invocation, or the database has been + closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid SequenceConfig parameter.
            +
            +
          • +
          + + + +
            +
          • +

            removeSequence

            +
            public void removeSequence(Transaction txn,
            +                           DatabaseEntry key)
            +
            Removes the sequence from the database. This method should not be + called if there are open handles on this sequence.
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - The key DatabaseEntry of the sequence.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this database is read-only.
            +
            +
          • +
          + + + +
            +
          • +

            openCursor

            +
            public Cursor openCursor(Transaction txn,
            +                         CursorConfig cursorConfig)
            +
            Returns a cursor into the database.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the database is non-transactional, null must be + specified. For a transactional database, the transaction is optional + for read-only access and required for read-write access.
            +
            cursorConfig - The cursor attributes. If null, default attributes + are used.
            +
            Returns:
            +
            A database cursor.
            +
            Throws:
            +
            DatabasePreemptedException - in a replicated + environment if the master has truncated, removed or renamed the + database.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid CursorConfig parameter.
            +
            +
          • +
          + + + +
            +
          • +

            openCursor

            +
            public DiskOrderedCursor openCursor(DiskOrderedCursorConfig cursorConfig)
            +
            Create a DiskOrderedCursor to iterate over the records in 'this' + Database. Because the retrieval is based on Log Sequence Number (LSN) + order rather than key order, records are returned in unsorted order in + exchange for generally faster retrieval. LSN order approximates disk + sector order. +

            + See DiskOrderedCursor for more details and a description of the + consistency guarantees provided by the scan. +

            + WARNING: After calling this method, deletion of log files by + the JE log cleaner will be disabled until DiskOrderedCursor.close() is called. To prevent unbounded growth of + disk usage, be sure to call DiskOrderedCursor.close() to + re-enable log file deletion.

            +
          • +
          + + + +
            +
          • +

            delete

            +
            public OperationResult delete(Transaction txn,
            +                              DatabaseEntry key,
            +                              WriteOptions options)
            +
            Removes records with a given key from the database. In the presence of + duplicate keys, all records associated with the given key will be + removed. When the database has associated secondary databases, this + method also deletes the associated index records.
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may + be specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is deleted, else null if the + given key was not found in the database.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this database is read-only.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null input key parameter, an input key parameter + with a null data array, or a partial key input parameter.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            delete

            +
            public OperationStatus delete(Transaction txn,
            +                              DatabaseEntry key)
            +
            Removes records with a given key from the database. In the presence of + duplicate keys, all records associated with the given key will be + removed. When the database has associated secondary databases, this + method also deletes the associated index records. + +

            Calling this method is equivalent to calling delete(Transaction, DatabaseEntry, WriteOptions).

            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may + be specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input.
            +
            Returns:
            +
            The method will return OperationStatus.NOTFOUND if + the given key is not found in the database; otherwise OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this database is read-only.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null input key parameter, an input key parameter + with a null data array, or a partial key input parameter.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationResult get(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Retrieves a record according to the specified Get type. + +

            If the operation succeeds, the record will be locked according to the + lock mode specified, the key and/or + data will be returned via the (non-null) DatabaseEntry parameters, and a + non-null OperationResult will be returned. If the operation fails + because the record requested is not found, null is returned.

            + +

            The following table lists each allowed operation and whether the key + and data parameters are input or + output parameters. See the individual Get operations for + more information.

            + +
            + + + + + + + + + + + + + + + + + + +
            Get operationDescription'key' parameter'data' parameter
            Get.SEARCHSearches using an exact match by key.inputoutput
            Get.SEARCH_BOTHSearches using an exact match by key and data.inputinput
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified to transaction-protect the operation, or null may be specified + to perform the operation without transaction protection. For a + non-transactional database, null must be specified.
            +
            key - the key input parameter.
            +
            data - the data input or output parameter, depending on getType.
            +
            getType - the Get operation type. May not be null.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null getType, a null input key/data parameter, + an input key/data parameter with a null data array, and a partial + key/data input parameter.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            put

            +
            public OperationResult put(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Put putType,
            +                           WriteOptions options)
            +
            Inserts or updates a record according to the specified Put + type. + +

            If the operation succeeds, the record will be locked according to the + lock mode specified, the cursor will + be positioned on the record, and a non-null OperationResult will be + returned. If the operation fails because the record already exists (or + does not exist, depending on the putType), null is returned.

            + +

            When the database has associated secondary databases, this method + also inserts or deletes associated index records as necessary.

            + +

            The following table lists each allowed operation. See the individual + Put operations for more information.

            + +
            + + + + + + + + + + + + + + + + + + + + + + + + +
            Put operationDescriptionReturns null when?Other special rules
            Put.OVERWRITEInserts or updates a record depending on whether a matching + record is already present.Never returns null.Without duplicates, a matching record is one with the same key; + with duplicates, it is one with the same key and data.
            Put.NO_OVERWRITEInserts a record if a record with a matching key is not already + present.When an existing record matches.If the database has duplicate keys, a record is inserted only if + there are no records with a matching key.
            Put.NO_DUP_DATAInserts a record in a database with duplicate keys if a record + with a matching key and data is not already present.When an existing record matches.Without duplicates, this operation is not allowed.
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input.
            +
            data - the data used as + input.
            +
            putType - the Put operation type. May not be null.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is written, else null.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if the database is read-only, or + putType is Put.NO_DUP_DATA and the database is not configured for + duplicates.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null putType, a null input key/data parameter, + an input key/data parameter with a null data array, a partial key/data + input parameter, or when putType is Put.CURRENT.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + + + + + + + + + + + + + +
            +
          • +

            join

            +
            public JoinCursor join(Cursor[] cursors,
            +                       JoinConfig config)
            +
            Creates a specialized join cursor for use in performing equality or + natural joins on secondary indices. + +

            Each cursor in the cursors array must have been + initialized to refer to the key on which the underlying database should + be joined. Typically, this initialization is done by calling Cursor.getSearchKey.

            + +

            Once the cursors have been passed to this method, they should not be + accessed or modified until the newly created join cursor has been + closed, or else inconsistent results may be returned. However, the + position of the cursors will not be changed by this method or by the + methods of the join cursor.

            +
            +
            Parameters:
            +
            cursors - an array of cursors associated with this primary + database.
            +
            config - The join attributes. If null, default attributes are + used.
            +
            Returns:
            +
            a specialized cursor that returns the results of the equality + join operation.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid JoinConfig parameter.
            +
            See Also:
            +
            JoinCursor
            +
            +
          • +
          + + + +
            +
          • +

            preload

            +
            public void preload(long maxBytes)
            +
            Deprecated. As of JE 2.0.83, replaced by preload(PreloadConfig).

            +
            Preloads the cache. This method should only be called when there are no + operations being performed on the database in other threads. Executing + preload during concurrent updates may result in some or all of the tree + being loaded into the JE cache. Executing preload during any other + types of operations may result in JE exceeding its allocated cache + size. preload() effectively locks the entire database and therefore will + lock out the checkpointer, cleaner, and compressor, as well as not allow + eviction to occur.
            +
            +
            Parameters:
            +
            maxBytes - The maximum number of bytes to load. If maxBytes is 0, + je.evictor.maxMemory is used.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            preload

            +
            public void preload(long maxBytes,
            +                    long maxMillisecs)
            +
            Deprecated. As of JE 2.0.101, replaced by preload(PreloadConfig).

            +
            Preloads the cache. This method should only be called when there are no + operations being performed on the database in other threads. Executing + preload during concurrent updates may result in some or all of the tree + being loaded into the JE cache. Executing preload during any other + types of operations may result in JE exceeding its allocated cache + size. preload() effectively locks the entire database and therefore will + lock out the checkpointer, cleaner, and compressor, as well as not allow + eviction to occur.
            +
            +
            Parameters:
            +
            maxBytes - The maximum number of bytes to load. If maxBytes is 0, + je.evictor.maxMemory is used.
            +
            maxMillisecs - The maximum time in milliseconds to use when + preloading. Preloading stops once this limit has been reached. If + maxMillisecs is 0, preloading can go on indefinitely or until maxBytes + (if non-0) is reached.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            preload

            +
            public PreloadStats preload(PreloadConfig config)
            +
            Preloads the cache. This method should only be called when there are no + operations being performed on the database in other threads. Executing + preload during concurrent updates may result in some or all of the tree + being loaded into the JE cache. Executing preload during any other + types of operations may result in JE exceeding its allocated cache + size. preload() effectively locks the entire database and therefore will + lock out the checkpointer, cleaner, and compressor, as well as not allow + eviction to occur. If the database is replicated and the environment is + in the replica state, then the replica may become temporarily + disconnected from the master if the replica needs to replay changes + against the database and is locked out because the time taken by the + preload operation exceeds ReplicationConfig.FEEDER_TIMEOUT. +

            + While this method preloads a single database, Environment.preload(com.sleepycat.je.Database[], com.sleepycat.je.PreloadConfig) lets you preload multiple databases.

            +
            +
            Parameters:
            +
            config - The PreloadConfig object that specifies the parameters + of the preload.
            +
            Returns:
            +
            A PreloadStats object with various statistics about the + preload() operation.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if PreloadConfig.getMaxBytes is + greater than size of the JE cache.
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            public long count()
            +
            Counts the key/data pairs in the database. This operation is faster than + obtaining a count from a cursor based scan of the database, and will not + perturb the current contents of the cache. However, the count is not + guaranteed to be accurate if there are concurrent updates. Note that + this method does scan a significant portion of the database and should + be considered a fairly expensive operation. +

            + This operation uses the an internal infrastructure and algorithm that is + similar to the one used for the DiskOrderedCursor. Specifically, + it will disable deletion of log files by the JE log cleaner during its + execution and will consume a certain amount of memory (but without + affecting the memory that is available for the JE cache). To avoid + excessive memory consumption (and a potential OutOfMemoryError) + this method places an internal limit on its memory consumption. If this + limit is reached, the method will still work properly, but its + performance will degrade. To specify a different memory limit than the + one used by this method, use the + count(long memoryLimit) method. +

            + Currently, the internal memory limit is calculated as 10% of the + difference between the max JVM memory (the value returned by + Runtime.getRuntime().maxMemory()) and the configured JE cache size.

            +
            +
            Returns:
            +
            The count of key/data pairs in the database.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            See Also:
            +
            Cache + Statistics: Unexpected Sizes
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            public long count(long memoryLimit)
            +
            Counts the key/data pairs in the database. This operation is faster than + obtaining a count from a cursor based scan of the database, and will not + perturb the current contents of the cache. However, the count is not + guaranteed to be accurate if there are concurrent updates. Note that + this method does scan a significant portion of the database and should + be considered a fairly expensive operation. +

            + This operation uses the an internal infrastructure and algorithm that is + similar to the one used for the DiskOrderedCursor. Specifically, + it will disable deletion of log files by the JE log cleaner during its + execution and will consume a certain amount of memory (but without + affecting the memory that is available for the JE cache). To avoid + excessive memory consumption (and a potential OutOfMemoryError) + this method takes as input an upper bound on the memory it may consume. + If this limit is reached, the method will still work properly, but its + performance will degrade.

            +
            +
            Parameters:
            +
            memoryLimit - The maximum memory (in bytes) that may be consumed + by this method.
            +
            Returns:
            +
            The count of key/data pairs in the database.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            See Also:
            +
            Cache + Statistics: Unexpected Sizes
            +
            +
          • +
          + + + +
            +
          • +

            getStats

            +
            public DatabaseStats getStats(StatsConfig config)
            +
            Returns database statistics. + +

            If this method has not been configured to avoid expensive operations + (using the StatsConfig.setFast method), it will access some of or all the pages in + the database, incurring a severe performance penalty as well as possibly + flushing the underlying cache.

            + +

            In the presence of multiple threads or processes accessing an active + database, the information returned by this method may be + out-of-date.

            +
            +
            Parameters:
            +
            config - The statistics returned; if null, default statistics are + returned.
            +
            Returns:
            +
            Database statistics.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            verify

            +
            public DatabaseStats verify(VerifyConfig config)
            +
            Verifies the integrity of the database. + +

            Verification is an expensive operation that should normally only be + used for troubleshooting and debugging.

            +
            +
            Parameters:
            +
            config - Configures the verify operation; if null, the default + operation is performed.
            +
            Returns:
            +
            Database statistics.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if a corruption is detected, or if + an unexpected, internal or environment-wide failure occurs. If a + persistent corruption is detected, + EnvironmentFailureException.isCorrupted() will return true.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            getDatabaseName

            +
            public java.lang.String getDatabaseName()
            +
            Returns the database name. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The database name.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public DatabaseConfig getConfig()
            +
            Returns this Database object's configuration. + +

            This may differ from the configuration used to open this object if + the database existed previously.

            + +

            Unlike most Database methods, this method may be called after the + database is closed.

            +
            +
            Returns:
            +
            This Database object's configuration.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            getEnvironment

            +
            public Environment getEnvironment()
            +
            Returns the Environment handle for + the database environment underlying the Database. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The Environment handle + for the database environment underlying the Database.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryDatabases

            +
            public java.util.List<SecondaryDatabase> getSecondaryDatabases()
            +
            Returns a list of all SecondaryDatabase objects associated with a primary database. + +

            If no secondaries are associated with this database, an empty list is + returned.

            +
          • +
          + + + +
            +
          • +

            compareKeys

            +
            public int compareKeys(DatabaseEntry entry1,
            +                       DatabaseEntry entry2)
            +
            Compares two keys using either the default comparator if no BTree + comparator has been set or the BTree comparator if one has been set.
            +
            +
            Returns:
            +
            -1 if entry1 compares less than entry2, + 0 if entry1 compares equal to entry2, + 1 if entry1 compares greater than entry2
            +
            Throws:
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if either entry is a partial + DatabaseEntry, or is null.
            +
            +
          • +
          + + + +
            +
          • +

            compareDuplicates

            +
            public int compareDuplicates(DatabaseEntry entry1,
            +                             DatabaseEntry entry2)
            +
            Compares two data elements using either the default comparator if no + duplicate comparator has been set or the duplicate comparator if one has + been set.
            +
            +
            Returns:
            +
            -1 if entry1 compares less than entry2, + 0 if entry1 compares equal to entry2, + 1 if entry1 compares greater than entry2
            +
            Throws:
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if either entry is a partial + DatabaseEntry, or is null.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseComparator.html b/docs/java/com/sleepycat/je/DatabaseComparator.html new file mode 100644 index 0000000..b69cce5 --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseComparator.html @@ -0,0 +1,254 @@ + + + + + +DatabaseComparator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface DatabaseComparator

      +
      +
      +
      +
        +
      • +
        +
        All Superinterfaces:
        +
        java.util.Comparator<byte[]>, java.io.Serializable
        +
        +
        +
        +
        public interface DatabaseComparator
        +extends java.util.Comparator<byte[]>, java.io.Serializable
        +
        Implemented by btree and duplicate comparators that need to be initialized + before they are used or need access to the environment's ClassLoader + property.
        +
        +
        Since:
        +
        5.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          voidinitialize(java.lang.ClassLoader loader) +
          Called to initialize a comparator object after it is instantiated or + deserialized, and before it is used.
          +
          +
            +
          • + + +

            Methods inherited from interface java.util.Comparator

            +compare, comparing, comparing, comparingDouble, comparingInt, comparingLong, equals, naturalOrder, nullsFirst, nullsLast, reversed, reverseOrder, thenComparing, thenComparing, thenComparing, thenComparingDouble, thenComparingInt, thenComparingLong
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            initialize

            +
            void initialize(java.lang.ClassLoader loader)
            +
            Called to initialize a comparator object after it is instantiated or + deserialized, and before it is used.
            +
            +
            Parameters:
            +
            loader - is the environment's ClassLoader property.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseConfig.html b/docs/java/com/sleepycat/je/DatabaseConfig.html new file mode 100644 index 0000000..7caa9b2 --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseConfig.html @@ -0,0 +1,1737 @@ + + + + + +DatabaseConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DatabaseConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.DatabaseConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        Direct Known Subclasses:
        +
        SecondaryConfig
        +
        +
        +
        +
        public class DatabaseConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +

        Specifies the attributes of a database.

        + +

        There are two groups of database attributes: per-database handle + attributes, and database-wide attributes. An attribute may be + persistent/transient or mutable/immutable:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        ScopeMutablePersistentAttribute
        Database-wide attributeTrueTruebtree comparator
        + duplicate comparator
        + key prefixing
        + nodeMaxEntries
        + +
        TrueFalsedeferred write
        + transactional
        FalseTrue + sorted duplicates
        +
        FalseFalsetemporary
        Per-database handle attributesFalseFalseallow create
        + exclusive create
        + read only
        + getCacheMode() read only}
        + use existing config
        +
        +

        + +

        Persistent attributes will be saved in the log and remain in effect + every time the environment is reopened. Transient attributes only remain + in effect until:

        + +
          +
        • the database configuration is updated
        • +
        • the database handle(per-database handle attributes) is closed, or all + handles for this database (database-wide attributes) are closed.
        • +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final DatabaseConfig DEFAULT
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DatabaseConfig

            +
            public DatabaseConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setAllowCreate

            +
            public DatabaseConfig setAllowCreate(boolean allowCreate)
            +
            Configures the Environment.openDatabase method to create the database if it does not + already exist.
            +
            +
            Parameters:
            +
            allowCreate - If true, configure the Environment.openDatabase + method to create the database if it does not already exist.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getAllowCreate

            +
            public boolean getAllowCreate()
            +
            Returns true if the Environment.openDatabase method is configured to create the database + if it does not already exist. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Environment.openDatabase method is configured to create the database + if it does not already exist.
            +
            +
          • +
          + + + +
            +
          • +

            setExclusiveCreate

            +
            public DatabaseConfig setExclusiveCreate(boolean exclusiveCreate)
            +
            Configure the Environment.openDatabase method to fail if the database already exists. + +

            The exclusiveCreate mode is only meaningful if specified with the + allowCreate mode.

            +
            +
            Parameters:
            +
            exclusiveCreate - If true, configure the Environment.openDatabase + method to fail if the database already exists.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getExclusiveCreate

            +
            public boolean getExclusiveCreate()
            +
            Returns true if the Environment.openDatabase method is configured to fail if the database + already exists. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Environment.openDatabase method is configured to fail if the database + already exists.
            +
            +
          • +
          + + + +
            +
          • +

            setSortedDuplicates

            +
            public DatabaseConfig setSortedDuplicates(boolean sortedDuplicates)
            +
            Configures the database to support records with duplicate keys. + +

            When duplicate keys are configured for a database, key prefixing is + also implicitly configured. Without key prefixing, databases with + duplicates would store keys inefficiently. Key prefixing is therefore + mandatory for databases with duplicates.

            + +

            Although two records may have the same key, they may not also have + the same data item. Two identical records, that have the same key and + data, may not be stored in a database.

            + +

            The ordering of duplicates in the database is determined by the + duplicate comparison function. See setDuplicateComparator(java.util.Comparator<byte[]>). If + the application does not specify a duplicate comparison function, a + default lexical comparison will be used.

            + +

            If a primary database is to be associated with one or more secondary + databases, it may not be configured for duplicates.

            + +

            Calling this method affects the database, including all threads of + control accessing the database.

            + +

            If the database already exists when the database is opened, any + database configuration specified by this method must be the same as the + existing database or an error will be returned.

            +
            +
            Parameters:
            +
            sortedDuplicates - If true, configure the database to support + duplicate data items. A value of false is illegal to this method, that + is, once set, the configuration cannot be cleared.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getSortedDuplicates

            +
            public boolean getSortedDuplicates()
            +
            Returns true if the database is configured to support records with + duplicate keys. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the database is configured to support records with + duplicate keys.
            +
            +
          • +
          + + + +
            +
          • +

            getKeyPrefixing

            +
            public boolean getKeyPrefixing()
            +
            Returns the key prefixing configuration. Note that key prefixing is + always enabled for a database with duplicates configured.
            +
            +
            Returns:
            +
            true if key prefixing has been enabled in this database.
            +
            +
          • +
          + + + +
            +
          • +

            setKeyPrefixing

            +
            public DatabaseConfig setKeyPrefixing(boolean keyPrefixing)
            +
            Configure the database to support key prefixing. + +

            Key prefixing causes the representation of keys in the b-tree + internal nodes to be split in each BIN (bottom internal node) between + the common prefix of all keys and the suffixes. Using this often + results in a more space-efficient representation in both the + in-memory and on-disk formats. In general the cost of maintaining + the prefix separately is low compared to the benefit, and therefore + enabling key prefixing is strongly recommended.

            + +

            When duplicate keys are configured for a database, key prefixing is + also implicitly configured. Without key prefixing, databases with + duplicates would store keys inefficiently. Key prefixing is therefore + mandatory for databases with duplicates.

            +
            +
            Parameters:
            +
            keyPrefixing - If true, enables keyPrefixing for the database.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalStateException - if the keyPrefixing argument is false and + setSortedDuplicates(boolean) has been called to configure duplicates. + Key prefixing is therefore mandatory for databases with duplicates.
            +
            See Also:
            +
            Cache + Statistics: Size Optimizations
            +
            +
          • +
          + + + +
            +
          • +

            setTransactional

            +
            public DatabaseConfig setTransactional(boolean transactional)
            +
            Encloses the database open within a transaction. + +

            If the call succeeds, the open operation will be recoverable. If the + call fails, no database will have been created.

            + +

            All future operations on this database, which are not explicitly + enclosed in a transaction by the application, will be enclosed in in a + transaction within the library.

            +
            +
            Parameters:
            +
            transactional - If true, enclose the database open within a + transaction.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getTransactional

            +
            public boolean getTransactional()
            +
            Returns true if the database open is enclosed within a transaction. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the database open is enclosed within a transaction.
            +
            +
          • +
          + + + +
            +
          • +

            setReadOnly

            +
            public DatabaseConfig setReadOnly(boolean readOnly)
            +
            Configures the database in read-only mode. + +

            Any attempt to modify items in the database will fail, regardless of + the actual permissions of any underlying files.

            +
            +
            Parameters:
            +
            readOnly - If true, configure the database in read-only mode.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getReadOnly

            +
            public boolean getReadOnly()
            +
            Returns true if the database is configured in read-only mode. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the database is configured in read-only mode.
            +
            +
          • +
          + + + +
            +
          • +

            setNodeMaxEntries

            +
            public DatabaseConfig setNodeMaxEntries(int nodeMaxEntries)
            +
            Configures the Environment.openDatabase method to have a B+Tree fanout of + nodeMaxEntries. + +

            The nodeMaxEntries parameter is only meaningful if specified with the + allowCreate mode. See EnvironmentConfig.NODE_MAX_ENTRIES for the + valid value range, and the default value.

            +
            +
            Parameters:
            +
            nodeMaxEntries - The maximum children per B+Tree node.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            setNodeMaxDupTreeEntries

            +
            public DatabaseConfig setNodeMaxDupTreeEntries(int nodeMaxDupTreeEntries)
            +
            Deprecated. this property no longer has any effect; setNodeMaxEntries(int) should be used instead.
            +
          • +
          + + + +
            +
          • +

            getNodeMaxEntries

            +
            public int getNodeMaxEntries()
            +
            Returns the maximum number of children a B+Tree node can have. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The maximum number of children a B+Tree node can have.
            +
            +
          • +
          + + + +
            +
          • +

            getNodeMaxDupTreeEntries

            +
            public int getNodeMaxDupTreeEntries()
            +
            Deprecated. this property no longer has any effect and zero is always + returned; getNodeMaxEntries() should be used instead.
            +
          • +
          + + + +
            +
          • +

            setBtreeComparator

            +
            public DatabaseConfig setBtreeComparator(java.util.Comparator<byte[]> btreeComparator)
            +
            By default, a byte by byte lexicographic comparison is used for btree + keys. To customize the comparison, supply a different Comparator. + +

            Note that there are two ways to set the comparator: by specifying the + class or by specifying a serializable object. This method is used to + specify a serializable object. The comparator class must implement + java.util.Comparator and must be serializable. JE will serialize the + Comparator and deserialize it when subsequently opening the + database.

            + +

            If a comparator needs to be initialized before it is used or needs + access to the environment's ClassLoader property, it may implement the + DatabaseComparator interface.

            + +

            The Comparator.compare() method is passed the byte arrays that are + stored in the database. If you know how your data is organized in the + byte array, then you can write a comparison routine that directly + examines the contents of the arrays. Otherwise, you have to reconstruct + your original objects, and then perform the comparison. See the Getting Started Guide for examples.

            + +

            WARNING: There are several special considerations that must + be taken into account when implementing a comparator.

            +

              +
            • Comparator instances are shared by multiple threads and comparator + methods are called without any special synchronization. Therefore, + comparators must be thread safe. In general no shared state should be + used and any caching of computed values must be done with proper + synchronization.
            • + +
            • Because records are stored in the order determined by the + Comparator, the Comparator's behavior must not change over time and + therefore should not be dependent on any state that may change over + time. In addition, although it is possible to change the comparator + for an existing database, care must be taken that the new comparator + provides compatible results with the previous comparator, or database + corruption will occur.
            • + +
            • JE uses comparators internally in a wide variety of circumstances, + so custom comparators must be sure to return valid values for any two + arbitrary keys. The user must not make any assumptions about the + range of key values that might be compared. For example, it's possible + for the comparator may be used against previously deleted values.
            • +
            + +

            A special type of comparator is a partial comparator, which + allows for the keys of a database to be updated, but only if the updates + do not change the relative order of the keys. For example, if a database + uses strings as keys and a case-insensitive comparator, it is possible + to change the case of characters in the keys, as this will not change + the ordering of the keys. Another example is when the keys contain + multiple fields but uniquely identify each record with a single field. + The partial comparator could then compare only the single identifying + field, allowing the rest of the fields to be updated. A query + (Cursor.getSearchKey, for example) could + then be performed by passing a partial key that contains only the + identifying field. + +

            WARNING: To allow for key updates in situations + like those described above, all partial comparators must implement the + PartialComparator tag interface. Otherwise, BDB JE will raise + an exception if an attempt is made to update a key in a database whose + comparators do not implement PartialComparator. See "Upgrading from JE + 5.0 or earlier" in the change log and the PartialComparator + javadoc for more information.

            +

            + Another special type of comparator is a binary equality + comparator, which considers two keys to be equal if and only if they + have the same length and they are equal byte-per-byte. All binary + equality comparators must implement the BinaryEqualityComparator + interface. The significance of binary equality comparators is that they + make possible certain internal optimizations, like the "blind puts" + optimization, described in + BinaryEqualityComparator +

            + The comparator for an existing database will not be overridden unless + setOverrideBtreeComparator() is set to true.

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            setBtreeComparator

            +
            public DatabaseConfig setBtreeComparator(java.lang.Class<? extends java.util.Comparator<byte[]>> btreeComparatorClass)
            +
            By default, a byte by byte lexicographic comparison is used for btree + keys. To customize the comparison, supply a different Comparator. + +

            Note that there are two ways to set the comparator: by specifying the + class or by specifying a serializable object. This method is used to + specify a Comparator class. The comparator class must implement + java.util.Comparator and must have a public zero-parameter constructor. + JE will store the class name and instantiate the Comparator by class + name (using Class.forName and newInstance) + when subsequently opening the database. Because the Comparator is + instantiated using its default constructor, it should not be dependent + on other constructor parameters.

            + +

            The Comparator.compare() method is passed the byte arrays that are + stored in the database. If you know how your data is organized in the + byte array, then you can write a comparison routine that directly + examines the contents of the arrays. Otherwise, you have to reconstruct + your original objects, and then perform the comparison. See the Getting Started Guide for examples.

            + +

            If a comparator needs to be initialized before it is used or needs + access to the environment's ClassLoader property, it may implement the + DatabaseComparator interface.

            + +

            WARNING: There are several special considerations that must + be taken into account when implementing a comparator.

            +

              +
            • Comparator instances are shared by multiple threads and comparator + methods are called without any special synchronization. Therefore, + comparators must be thread safe. In general no shared state should be + used and any caching of computed values must be done with proper + synchronization.
            • + +
            • Because records are stored in the order determined by the + Comparator, the Comparator's behavior must not change over time and + therefore should not be dependent on any state that may change over + time. In addition, although it is possible to change the comparator + for an existing database, care must be taken that the new comparator + provides compatible results with the previous comparator, or database + corruption will occur.
            • + +
            • JE uses comparators internally in a wide variety of circumstances, + so custom comparators must be sure to return valid values for any two + arbitrary keys. The user must not make any assumptions about the + range of key values that might be compared. For example, it's possible + for the comparator may be used against previously deleted values.
            • +
            + +

            A special type of comparator is a partial comparator, which + allows for the keys of a database to be updated, but only if the updates + do not change the relative order of the keys. For example, if a database + uses strings as keys and a case-insensitive comparator, it is possible + to change the case of characters in the keys, as this will not change the + ordering of the keys. Another example is when the keys contain multiple + fields but uniquely identify each record with a single field. The + partial comparator could then compare only the single identifying field, + allowing the rest of the fields to be updated. A query + (Cursor.getSearchKey, for example) could + then be performed by passing a partial key that contains only the + identifying field. + +

            WARNING: To allow for key updates in situations + like those described above, all partial comparators must implement the + PartialComparator tag interface. See "Upgrading from JE 5.0 + or earlier" in the change log and the PartialComparator javadoc + for more information.

            + + Another special type of comparator is a binary equality + comparator, which considers two keys to be equal if and only if they + have the same length and they are equal byte-per-byte. All binary + equality comparators must implement the BinaryEqualityComparator + interface. The significance of binary equality comparators is that they + make possible certain internal optimizations, like the "blind puts" + optimization, described in + BinaryEqualityComparator +

            + The comparator for an existing database will not be overridden unless + setOverrideBtreeComparator() is set to true.

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getBtreeComparator

            +
            public java.util.Comparator<byte[]> getBtreeComparator()
            +
            Returns the Comparator used for key comparison on this database.
            +
          • +
          + + + +
            +
          • +

            getBtreeComparatorByClassName

            +
            public boolean getBtreeComparatorByClassName()
            +
            Returns true if the btree comparator is set by class name, not by + serializable Comparator object
            +
            +
            Returns:
            +
            true if the comparator is set by class name, not by serializable + Comparator object.
            +
            +
          • +
          + + + +
            +
          • +

            setOverrideBtreeComparator

            +
            public DatabaseConfig setOverrideBtreeComparator(boolean override)
            +
            Sets to true if the database exists and the btree comparator specified + in this configuration object should override the current comparator.
            +
            +
            Parameters:
            +
            override - Set to true to override the existing comparator.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getOverrideBtreeComparator

            +
            public boolean getOverrideBtreeComparator()
            +
            Returns the override setting for the btree comparator.
            +
          • +
          + + + +
            +
          • +

            setDuplicateComparator

            +
            public DatabaseConfig setDuplicateComparator(java.util.Comparator<byte[]> duplicateComparator)
            +
            By default, a byte by byte lexicographic comparison is used for + duplicate data items in a duplicate set. To customize the comparison, + supply a different Comparator. + +

            Note that there are two ways to set the comparator: by specifying the + class or by specifying a serializable object. This method is used to + specify a serializable object. The comparator class must implement + java.util.Comparator and must be serializable. JE will serialize the + Comparator and deserialize it when subsequently opening the + database.

            + +

            The Comparator.compare() method is passed the byte arrays that are + stored in the database. If you know how your data is organized in the + byte array, then you can write a comparison routine that directly + examines the contents of the arrays. Otherwise, you have to reconstruct + your original objects, and then perform the comparison. See the Getting Started Guide for examples.

            + +

            If a comparator needs to be initialized before it is used or needs + access to the environment's ClassLoader property, it may implement the + DatabaseComparator interface.

            + +

            WARNING: There are several special considerations that must + be taken into account when implementing a comparator.

            +

              +
            • Comparator instances are shared by multiple threads and comparator + methods are called without any special synchronization. Therefore, + comparators must be thread safe. In general no shared state should be + used and any caching of computed values must be done with proper + synchronization.
            • + +
            • Because records are stored in the order determined by the + Comparator, the Comparator's behavior must not change over time and + therefore should not be dependent on any state that may change over + time. In addition, although it is possible to change the comparator + for an existing database, care must be taken that the new comparator + provides compatible results with the previous comparator, or database + corruption will occur.
            • + +
            • JE uses comparators internally in a wide variety of circumstances, + so custom comparators must be sure to return valid values for any two + arbitrary keys. The user must not make any assumptions about the + range of key values that might be compared. For example, it's possible + for the comparator may be used against previously deleted values.
            • +
            + +

            A special type of comparator is a partial comparator, which + allows for the keys of a database to be updated, but only if the updates + do not change the relative order of the keys. For example, if a database + uses strings as keys and a case-insensitive comparator, it is possible to + change the case of characters in the keys, as this will not change the + ordering of the keys. Another example is when the keys contain multiple + fields but uniquely identify each record with a single field. The + partial comparator could then compare only the single identifying field, + allowing the rest of the fields to be updated. A query + (Cursor.getSearchKey, for example) could + then be performed by passing a partial key that contains only the + identifying field. + +

            When using a partial duplicates comparator, it is possible to update + the data for a duplicate record, as long as only the non-identifying + fields in the data are changed. See + Cursor.putCurrent for more information.

            + +

            WARNING: To allow for key updates in situations + like those described above, all partial comparators must implement the + PartialComparator tag interface. See "Upgrading from JE 5.0 + or earlier" in the change log and the PartialComparator javadoc + for more information.

            + +

            + Another special type of comparator is a binary equality + comparator, which considers two keys to be equal if and only if they + have the same length and they are equal byte-per-byte. All binary + equality comparators must implement the BinaryEqualityComparator + interface. The significance of binary equality comparators is that they + make possible certain internal optimizations, like the "blind puts" + optimization, described in + BinaryEqualityComparator +

            + The comparator for an existing database will not be overridden unless + setOverrideDuplicateComparator() is set to true.

            +
          • +
          + + + +
            +
          • +

            setDuplicateComparator

            +
            public DatabaseConfig setDuplicateComparator(java.lang.Class<? extends java.util.Comparator<byte[]>> duplicateComparatorClass)
            +
            By default, a byte by byte lexicographic comparison is used for + duplicate data items in a duplicate set. To customize the comparison, + supply a different Comparator. + +

            Note that there are two ways to set the comparator: by specifying the + class or by specifying a serializable object. This method is used to + specify a Comparator class. The comparator class must implement + java.util.Comparator and must have a public zero-parameter constructor. + JE will store the class name and instantiate the Comparator by class + name (using Class.forName and newInstance) + when subsequently opening the database. Because the Comparator is + instantiated using its default constructor, it should not be dependent + on other constructor parameters.

            + +

            The Comparator.compare() method is passed the byte arrays that are + stored in the database. If you know how your data is organized in the + byte array, then you can write a comparison routine that directly + examines the contents of the arrays. Otherwise, you have to reconstruct + your original objects, and then perform the comparison. See the Getting Started Guide for examples.

            + +

            If a comparator needs to be initialized before it is used or needs + access to the environment's ClassLoader property, it may implement the + DatabaseComparator interface.

            + +

            WARNING: There are several special considerations that must + be taken into account when implementing a comparator.

            +

              +
            • Comparator instances are shared by multiple threads and comparator + methods are called without any special synchronization. Therefore, + comparators must be thread safe. In general no shared state should be + used and any caching of computed values must be done with proper + synchronization.
            • + +
            • Because records are stored in the order determined by the + Comparator, the Comparator's behavior must not change over time and + therefore should not be dependent on any state that may change over + time. In addition, although it is possible to change the comparator + for an existing database, care must be taken that the new comparator + provides compatible results with the previous comparator, or database + corruption will occur.
            • + +
            • JE uses comparators internally in a wide variety of circumstances, + so custom comparators must be sure to return valid values for any two + arbitrary keys. The user must not make any assumptions about the + range of key values that might be compared. For example, it's possible + for the comparator may be used against previously deleted values.
            • +
            + +

            A special type of comparator is a partial comparator, which + allows for the keys of a database to be updated, but only if the updates + do not change the relative order of the keys. For example, if a database + uses strings as keys and a case-insensitive comparator, it is possible to + change the case of characters in the keys, as this will not change the + ordering of the keys. Another example is when the keys contain multiple + fields but uniquely identify each record with a single field. The + partial comparator could then compare only the single identifying field, + allowing the rest of the fields to be updated. A query + (Cursor.getSearchKey, for example) could + then be performed by passing a partial key that contains only the + identifying field. + +

            When using a partial duplicates comparator, it is possible to update + the data for a duplicate record, as long as only the non-identifying + fields in the data are changed. See + Cursor.putCurrent for more information.

            + +

            WARNING: To allow for key updates in situations + like those described above, all partial comparators must implement the + PartialComparator tag interface. See "Upgrading from JE 5.0 + or earlier" in the change log and the PartialComparator javadoc + for more information.

            +

            + Another special type of comparator is a binary equality + comparator, which considers two keys to be equal if and only if they + have the same length and they are equal byte-per-byte. All binary + equality comparators must implement the BinaryEqualityComparator + interface. The significance of binary equality comparators is that they + make possible certain internal optimizations, like the "blind puts" + optimization, described in + BinaryEqualityComparator +

            + The comparator for an existing database will not be overridden unless + setOverrideDuplicateComparator() is set to true.

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getDuplicateComparator

            +
            public java.util.Comparator<byte[]> getDuplicateComparator()
            +
            Returns the Comparator used for duplicate record comparison on this + database.
            +
          • +
          + + + +
            +
          • +

            getDuplicateComparatorByClassName

            +
            public boolean getDuplicateComparatorByClassName()
            +
            Returns true if the duplicate comparator is set by class name, not by + serializable Comparator object.
            +
            +
            Returns:
            +
            true if the duplicate comparator is set by class name, not by + serializable Comparator object.
            +
            +
          • +
          + + + +
            +
          • +

            setOverrideDuplicateComparator

            +
            public DatabaseConfig setOverrideDuplicateComparator(boolean override)
            +
            Sets to true if the database exists and the duplicate comparator + specified in this configuration object should override the current + comparator.
            +
            +
            Parameters:
            +
            override - Set to true to override the existing comparator.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getOverrideDuplicateComparator

            +
            public boolean getOverrideDuplicateComparator()
            +
            Returns the override setting for the duplicate comparator.
            +
          • +
          + + + +
            +
          • +

            setTemporary

            +
            public DatabaseConfig setTemporary(boolean temporary)
            +
            Sets the temporary database option. + +

            Temporary databases operate internally in deferred-write mode to + provide reduced disk I/O and increased concurrency. But unlike an + ordinary deferred-write database, the information in a temporary + database is not durable or persistent. + +

            A temporary database is not flushed to disk when the database is + closed or when a checkpoint is performed, and the Database.sync method + may not be called. When all handles for a temporary database are + closed, the database is automatically removed. If a crash occurs before + closing a temporary database, the database will be automatically removed + when the environment is re-opened. + +

            Note that although temporary databases can page to disk if the cache + is not large enough to hold the databases, they are much more efficient + if the database remains in memory. See the JE FAQ on the Oracle + Technology Network site for information on how to estimate the cache + size needed by a given database. + +

            + See the Getting + Started Guide, Database chapter for a full description of temporary + databases. +

            +
            +
            Parameters:
            +
            temporary - if true, the database will be opened as a temporary + database.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getTemporary

            +
            public boolean getTemporary()
            +
            Returns the temporary database option.
            +
            +
            Returns:
            +
            boolean if true, the database is temporary.
            +
            +
          • +
          + + + +
            +
          • +

            setDeferredWrite

            +
            public DatabaseConfig setDeferredWrite(boolean deferredWrite)
            +
            Sets the deferred-write option. + +

            Deferred-write databases have reduced disk I/O and improved + concurrency. Disk I/O is reduced when data records are frequently + modified or deleted. The information in a deferred-write database is + not guaranteed to be durable or persistent until Database.close() + or Database.sync() is called, or a checkpoint is performed. Since + the usual write ahead logging system is relaxed in order to improve + performance, if the environment crashes before a Database.sync() + or Database.close(), none, all, or a unpredictable set of the + operations previously done may be persistent. + +

            After a deferred-write database is closed it may be re-opened as an + ordinary transactional or non-transactional database. For example, this + can be used to initially load a large data set in deferred-write mode + and then switch to transactional mode for subsequent operations. + +

            Note that although deferred-write databases can page to disk if the + cache is not large enough to hold the databases, they are much more + efficient if the database remains in memory. See the JE FAQ on the + Oracle Technology Network site for information on how to estimate the + cache size needed by a given database. + +

            + See the Getting + Started Guide, Database chapter for a full description + of deferred-write databases. + +

            +
            +
            Parameters:
            +
            deferredWrite - if true, the database will be opened as a + deferred-write database.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getDeferredWrite

            +
            public boolean getDeferredWrite()
            +
            Returns the deferred-write option.
            +
            +
            Returns:
            +
            boolean if true, deferred-write is enabled.
            +
            +
          • +
          + + + +
            +
          • +

            setUseExistingConfig

            +
            public DatabaseConfig setUseExistingConfig(boolean useExistingConfig)
            +
            Setting useExistingConfig to true allows a program to open a database + without knowing a prior what its configuration is. For example, if you + want to open a database without knowing whether it contains sorted + duplicates or not, you can set this property to true. In general, this + is used by the JE utilities, to avoid having to know the configuration + of a database. The databases should be opened readOnly when this + property is set to true.
            +
            +
            Parameters:
            +
            useExistingConfig - true if this Database should be opened using + the existing configuration.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getUseExistingConfig

            +
            public boolean getUseExistingConfig()
            +
            Return the value of the useExistingConfig property.
            +
            +
            Returns:
            +
            the value of the useExistingConfig property.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getCacheMode

            +
            public CacheMode getCacheMode()
            +
            Returns the default CacheMode used for operations performed on + this database, or null if the environment default is used.
            +
            +
            Returns:
            +
            the default CacheMode used for operations performed on + this database, or null if the environment default is used.
            +
            Since:
            +
            4.0.97
            +
            See Also:
            +
            setCacheMode(com.sleepycat.je.CacheMode)
            +
            +
          • +
          + + + +
            +
          • +

            setReplicated

            +
            public DatabaseConfig setReplicated(boolean replicated)
            +
            Configures a database to be replicated or non-replicated, in a + replicated Environment. By default this property is true, meaning that + by default a database is replicated in a replicated Environment. +

            + In a non-replicated Environment, this property is ignored. All + databases are non-replicated in a non-replicated Environment.

            +
            +
            See Also:
            +
            Non-replicated + Databases in a Replicated Environment
            +
            +
          • +
          + + + +
            +
          • +

            getReplicated

            +
            public boolean getReplicated()
            +
            Returns the replicated property for the database. +

            + This method returns true by default. However, in a non-replicated + Environment, this property is ignored. All databases are non-replicated + in a non-replicated Environment.

            +
            +
            See Also:
            +
            setReplicated(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            cloneConfig

            +
            public DatabaseConfig cloneConfig()
            +
            Deprecated. As of JE 4.0.13, replaced by clone().

            +
            Returns a copy of this configuration object.
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public DatabaseConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseEntry.html b/docs/java/com/sleepycat/je/DatabaseEntry.html new file mode 100644 index 0000000..b89d90b --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseEntry.html @@ -0,0 +1,908 @@ + + + + + +DatabaseEntry (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DatabaseEntry

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.DatabaseEntry
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class DatabaseEntry
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Encodes database key and data items as a byte array. + +

        Storage and retrieval for the Database + and Cursor methods are based on key/data + pairs. Both key and data items are represented by DatabaseEntry objects. + Key and data byte arrays may refer to arrays of zero length up to arrays of + essentially unlimited length.

        + +

        The DatabaseEntry class provides simple access to an underlying object + whose elements can be examined or changed. DatabaseEntry objects can be + subclassed, providing a way to associate with it additional data or + references to other structures.

        + +

        Access to DatabaseEntry objects is not re-entrant. In particular, if + multiple threads simultaneously access the same DatabaseEntry object using + Database or Cursor methods, the results are undefined.

        + +

        DatabaseEntry objects may be used in conjunction with the object mapping + support provided in the com.sleepycat.bind package.

        + +

        Input and Output Parameters

        + +

        DatabaseEntry objects are used for both input values (for example, when + writing to a database or specifying a search parameter) and output values + (for example, when reading from a database). For every CRUD method + (get, put, etc), each of the method's DatabaseEntry + parameters (key, data, etc) may be input or output + parameters, and this is specified by the method's documentation.

        + +

        Input Parameters

        + +

        An input parameter is required by the JE method. The parameter may not be + null, and the caller is also responsible for initializing the data of the + DatabaseEntry to a non-null byte array.

        + +

        Input parameters normally may not be partial. However, this is allowed under certain circumstances, namely + the Cursor.putCurrent(com.sleepycat.je.DatabaseEntry) method allows specifying a partial data + parameter in order to update only part of the record's data value. Input + parameters are NOT allowed to be partial unless this is explicitly stated in + the method documentation.

        + +

        Although an input parameter is always used for input, in some cases it + may be also used for output. For example, the Cursor.getSearchKeyRange(com.sleepycat.je.DatabaseEntry, com.sleepycat.je.DatabaseEntry, com.sleepycat.je.LockMode) method is passed a key parameter that is used as + input, but since a record with a different key (greater or equal to the key + given) may be found, the key parameter is also used to return the key + that was found. Such parameters are documented as "input/output" + parameters.

        + +

        Another example is when a custom key comparator is used and a key + parameter is passed to a search method. The input parameter may match a + record's key even if the bytes are not equal, and the key of the record + found will be returned via the parameter. The same thing is true of data (or + primary key) parameters when a custom duplicate comparator is used. Because + of this, all input parameters of "get" methods can potentially be used for + output, however, they are not explicitly documented to be input/output + parameters.

        + +

        Output Parameters

        + +

        An output parameter is not required by the JE method. It is used to + optionally return a value to the caller. Null may be passed for the + parameter if no returned value is needed. Passing null is a common way to + optimize read operations when only the record's key, and not the record's + data, is required. By passing null for the data parameter, a read from + disk can be avoided when the data is not already cached. In addition, all + output parameters may be partial to + allow only returning a part of the data byte array. See Using Null and Partial DatabaseEntry + Parameters for more information.

        + +

        For output parameters, the byte array specified by the caller will not be + used and may be null. The JE method will will always allocate a new byte + array. Therefore, after calling a method that returns output parameters, + the application can safely keep a reference to the byte array returned by + getData() without danger that the array will be overwritten in a + subsequent call.

        + +

        Historical note: Prior to JE 7.0, null could not be passed for output + parameters. Instead, DatabaseEntry.setPartial(0, 0, true) was called + for a data parameter to avoid reading the record's data. Now, null can be + passed instead.

        + +

        Offset and Size Properties

        + +

        By default the Offset property is zero and the Size property is the + length of the byte array. However, to allow for optimizations involving the + partial use of a byte array, the Offset and Size may be set to non-default + values.

        + +

        For output parameters, the Size will always be set to the length of the + byte array and the Offset will always be set to zero.

        + +

        However, for input parameters the Offset and Size are set to non-default + values by the built-in tuple and serial bindings. For example, with a tuple + or serial binding the byte array is grown dynamically as data is output, and + the Size is set to the number of bytes actually used. For a serial binding, + the Offset is set to a non-zero value in order to implement an optimization + having to do with the serialization stream header.

        + +

        WARNING: In callbacks that are passed DatabaseEntry parameters, the + application should always honor the Size and Offset properties, rather than + assuming they have default values.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          DatabaseEntry() +
          Constructs a DatabaseEntry with null data.
          +
          DatabaseEntry(byte[] data) +
          Constructs a DatabaseEntry with a given byte array.
          +
          DatabaseEntry(byte[] data, + int offset, + int size) +
          Constructs a DatabaseEntry with a given byte array, offset and size.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object o) +
          Compares the data of two entries for byte-by-byte equality.
          +
          byte[]getData() +
          Returns the byte array.
          +
          intgetOffset() +
          Returns the byte offset into the data array.
          +
          booleangetPartial() +
          Returns whether this DatabaseEntry is configured to read or write + partial records.
          +
          intgetPartialLength() +
          Returns the byte length of the partial record being read or written by + the application, in bytes.
          +
          intgetPartialOffset() +
          Returns the offset of the partial record being read or written by the + application, in bytes.
          +
          intgetSize() +
          Returns the byte size of the data array.
          +
          inthashCode() +
          Returns a hash code based on the data value.
          +
          voidsetData(byte[] data) +
          Sets the byte array.
          +
          voidsetData(byte[] data, + int offset, + int size) +
          Sets the byte array, offset and size.
          +
          voidsetOffset(int offset) +
          Sets the byte offset into the data array.
          +
          voidsetPartial(boolean partial) +
          Configures this DatabaseEntry to read or write partial records.
          +
          voidsetPartial(int doff, + int dlen, + boolean partial) +
          Configures this DatabaseEntry to read or write partial records.
          +
          voidsetPartialLength(int dlen) +
          Sets the byte length of the partial record being read or written by the + application, in bytes.
          +
          voidsetPartialOffset(int doff) +
          Sets the offset of the partial record being read or written by the + application, in bytes.
          +
          voidsetSize(int size) +
          Sets the byte size of the data array.
          +
          java.lang.StringtoString() +
          Returns all the attributes of the database entry in text form, including + the underlying data.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DatabaseEntry

            +
            public DatabaseEntry()
            +
            Constructs a DatabaseEntry with null data. The offset and size are set + to zero.
            +
          • +
          + + + +
            +
          • +

            DatabaseEntry

            +
            public DatabaseEntry(byte[] data)
            +
            Constructs a DatabaseEntry with a given byte array. The offset is set + to zero; the size is set to the length of the array, or to zero if null + is passed.
            +
            +
            Parameters:
            +
            data - Byte array wrapped by the DatabaseEntry.
            +
            +
          • +
          + + + +
            +
          • +

            DatabaseEntry

            +
            public DatabaseEntry(byte[] data,
            +                     int offset,
            +                     int size)
            +
            Constructs a DatabaseEntry with a given byte array, offset and size.
            +
            +
            Parameters:
            +
            data - Byte array wrapped by the DatabaseEntry.
            +
            offset - Offset in the first byte in the byte array to be included.
            +
            size - Number of bytes in the byte array to be included.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns all the attributes of the database entry in text form, including + the underlying data. The maximum number of bytes that will be formatted + is taken from the static variable DatabaseEntry.MAX_DUMP_BYTES, which + defaults to 100. MAX_DUMP_BYTES may be changed by an application if it + wishes to cause more bytes to be formatted.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            getData

            +
            public byte[] getData()
            +
            Returns the byte array. + +

            For a DatabaseEntry that is used as an output parameter, the byte + array will always be a newly allocated array. The byte array specified + by the caller will not be used and may be null.

            +
            +
            Returns:
            +
            The byte array.
            +
            +
          • +
          + + + +
            +
          • +

            setData

            +
            public void setData(byte[] data)
            +
            Sets the byte array. The offset is set to zero; the size is set to the + length of the array, or to zero if null is passed.
            +
            +
            Parameters:
            +
            data - Byte array wrapped by the DatabaseEntry.
            +
            +
          • +
          + + + +
            +
          • +

            setData

            +
            public void setData(byte[] data,
            +                    int offset,
            +                    int size)
            +
            Sets the byte array, offset and size.
            +
            +
            Parameters:
            +
            data - Byte array wrapped by the DatabaseEntry.
            +
            offset - Offset in the first byte in the byte array to be included.
            +
            size - Number of bytes in the byte array to be included.
            +
            +
          • +
          + + + +
            +
          • +

            setPartial

            +
            public void setPartial(int doff,
            +                       int dlen,
            +                       boolean partial)
            +
            Configures this DatabaseEntry to read or write partial records. + +

            By default the specified data (byte array, offset and size) + corresponds to the full stored key or data item. Optionally, the + Partial property can be set to true, and the PartialOffset and + PartialLength properties are used to specify the portion of the key or + data item to be read or written.

            + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method, nor will they every be + set by bindings. Therefore, the application can assume that the Partial + properties are not set, unless the application itself sets them + explicitly.

            + +

            All {partial. However, this is allowed under + certain circumstances, namely the Cursor.putCurrent(com.sleepycat.je.DatabaseEntry) method + allows specifying a partial data parameter in order to update only part + of the record's data value. Input parameters are NOT allowed to be + partial unless this is explicitly stated in the method + documentation.

            + +

            For storing an item using a partial parameter, length bytes specified + by dlen, starting at the offset set by doff bytes from + the beginning of the specified key's data item are replaced by the data + specified by the DatabaseEntry. If the partial length is smaller than + the data, the record will grow; if the partial length is larger than the + data, the record will shrink. If the partial offset is greater than the + length of the data, the record will be extended using zero bytes as + necessary, and the store will succeed.

            +
            +
            Parameters:
            +
            doff - The offset of the partial record being read or written by + the application, in bytes.
            +
            dlen - The byte length of the partial record being read or written + by the application, in bytes.
            +
            partial - Whether this DatabaseEntry is configured to read or write + partial records.
            +
            +
          • +
          + + + +
            +
          • +

            getPartialLength

            +
            public int getPartialLength()
            +
            Returns the byte length of the partial record being read or written by + the application, in bytes. + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method.

            +
            +
            Returns:
            +
            The byte length of the partial record being read or written by + the application, in bytes.
            +
            See Also:
            +
            setPartial(int,int,boolean)
            +
            +
          • +
          + + + +
            +
          • +

            setPartialLength

            +
            public void setPartialLength(int dlen)
            +
            Sets the byte length of the partial record being read or written by the + application, in bytes. + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method.

            +
            +
            Parameters:
            +
            dlen - The byte length of the partial record being read or written + by the
            +
            See Also:
            +
            setPartial(int,int,boolean)
            +
            +
          • +
          + + + +
            +
          • +

            getPartialOffset

            +
            public int getPartialOffset()
            +
            Returns the offset of the partial record being read or written by the + application, in bytes. + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method.

            +
            +
            Returns:
            +
            The offset of the partial record being read or written by the + application, in bytes.
            +
            See Also:
            +
            setPartial(int,int,boolean)
            +
            +
          • +
          + + + +
            +
          • +

            setPartialOffset

            +
            public void setPartialOffset(int doff)
            +
            Sets the offset of the partial record being read or written by the + application, in bytes. + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method.

            +
            +
            Parameters:
            +
            doff - The offset of the partial record being read or written by + the application, in bytes.
            +
            See Also:
            +
            setPartial(int,int,boolean)
            +
            +
          • +
          + + + +
            +
          • +

            getPartial

            +
            public boolean getPartial()
            +
            Returns whether this DatabaseEntry is configured to read or write + partial records. + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method.

            +
            +
            Returns:
            +
            Whether this DatabaseEntry is configured to read or write + partial records.
            +
            See Also:
            +
            setPartial(int,int,boolean)
            +
            +
          • +
          + + + +
            +
          • +

            setPartial

            +
            public void setPartial(boolean partial)
            +
            Configures this DatabaseEntry to read or write partial records. + +

            Note that the Partial properties are set only by the caller. They + will never be set by a Database or Cursor method.

            +
            +
            Parameters:
            +
            partial - Whether this DatabaseEntry is configured to read or write + partial records.
            +
            See Also:
            +
            setPartial(int,int,boolean)
            +
            +
          • +
          + + + +
            +
          • +

            getOffset

            +
            public int getOffset()
            +
            Returns the byte offset into the data array. + +

            For a DatabaseEntry that is used as an output parameter, the offset + will always be zero.

            +
            +
            Returns:
            +
            Offset in the first byte in the byte array to be included.
            +
            +
          • +
          + + + +
            +
          • +

            setOffset

            +
            public void setOffset(int offset)
            +
            Sets the byte offset into the data array. + + ArrayIndexOutOfBoundsException if the data, offset, and size parameters + refer to elements of the data array which do not exist. Note that this + exception will not be thrown by setSize() or setOffset(), but will be + thrown by varous JE methods if "this" is inconsistent and is used as an + input parameter to those methods. It is the caller's responsibility to + ensure that size, offset, and data.length are consistent.
            +
            +
            Parameters:
            +
            offset - Offset in the first byte in the byte array to be included.
            +
            +
          • +
          + + + +
            +
          • +

            getSize

            +
            public int getSize()
            +
            Returns the byte size of the data array. + +

            For a DatabaseEntry that is used as an output parameter, the size + will always be the length of the data array.

            +
            +
            Returns:
            +
            Number of bytes in the byte array to be included.
            +
            +
          • +
          + + + +
            +
          • +

            setSize

            +
            public void setSize(int size)
            +
            Sets the byte size of the data array. + + ArrayIndexOutOfBoundsException if the data, offset, and size parameters + refer to elements of the data array which do not exist. Note that this + exception will not be thrown by setSize() or setOffset(), but will be + thrown by varous JE methods if "this" is inconsistent and is used as an + input parameter to those methods. It is the caller's responsibility to + ensure that size, offset, and data.length are consistent.
            +
            +
            Parameters:
            +
            size - Number of bytes in the byte array to be included.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object o)
            +
            Compares the data of two entries for byte-by-byte equality. + +

            In either entry, if the offset is non-zero or the size is not equal + to the data array length, then only the data bounded by these values is + compared. The data array length and offset need not be the same in both + entries for them to be considered equal.

            + +

            If the data array is null in one entry, then to be considered equal + both entries must have a null data array.

            + +

            If the partial property is set in either entry, then to be considered + equal both entries must have the same partial properties: partial, + partialOffset and partialLength.

            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            Returns a hash code based on the data value.
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseException.html b/docs/java/com/sleepycat/je/DatabaseException.html new file mode 100644 index 0000000..16f559f --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseException.html @@ -0,0 +1,309 @@ + + + + + +DatabaseException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DatabaseException

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • +
            +
          • java.lang.Exception
          • +
          • +
              +
            • java.lang.RuntimeException
            • +
            • +
                +
              • com.sleepycat.je.DatabaseException
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        OperationFailureException, RunRecoveryException
        +
        +
        +
        +
        public abstract class DatabaseException
        +extends java.lang.RuntimeException
        +
        The root of all BDB JE-defined exceptions. + +

        Exceptions thrown by BDB JE fall into three categories.

        +
          +
        1. When a method is used incorrectly as the result of an application + programming error, a standard Java runtime exception is thrown: IllegalArgumentException, IllegalStateException or UnsupportedOperationException. These exceptions have the standard meaning + defined by their javadoc. Note that JE throws IllegalArgumentException rather than NullPointerException when a + required parameter is null. +
        2. +
        3. When an operation failure occurs, OperationFailureException or + one of its subclasses is thrown. See OperationFailureException for + details. +
        4. +
        5. When an Environment failure occurs, EnvironmentFailureException or one of its subclasses is thrown. See EnvironmentFailureException for details. +
        6. +
        + +

        OperationFailureException and EnvironmentFailureException + are the only two direct subclasses of DatabaseException.

        + +

        (Actually the above statement is not strictly correct. EnvironmentFailureException extends RunRecoveryException which + extends DatabaseException. RunRecoveryException exists for + backward compatibility and has been deprecated. EnvironmentFailureException should be used instead.)

        + +

        Note that in some cases, certain methods return status values without + issuing an exception. This occurs in situations that are not normally + considered an error, but when some informational status is returned. For + example, Database.get returns OperationStatus.NOTFOUND when a + requested key does not appear in the database.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetMessage() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getMessage

            +
            public java.lang.String getMessage()
            +
            +
            Overrides:
            +
            getMessage in class java.lang.Throwable
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseExistsException.html b/docs/java/com/sleepycat/je/DatabaseExistsException.html new file mode 100644 index 0000000..f5f8438 --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseExistsException.html @@ -0,0 +1,258 @@ + + + + + +DatabaseExistsException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DatabaseExistsException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseNotFoundException.html b/docs/java/com/sleepycat/je/DatabaseNotFoundException.html new file mode 100644 index 0000000..2dcc409 --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseNotFoundException.html @@ -0,0 +1,254 @@ + + + + + +DatabaseNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DatabaseNotFoundException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class DatabaseNotFoundException
        +extends OperationFailureException
        +
        Thrown when an operation requires a database and that database does not + exist. + +

        The Transaction handle is not invalidated as a result of + this exception.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DatabaseStats.html b/docs/java/com/sleepycat/je/DatabaseStats.html new file mode 100644 index 0000000..daf3185 --- /dev/null +++ b/docs/java/com/sleepycat/je/DatabaseStats.html @@ -0,0 +1,258 @@ + + + + + +DatabaseStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DatabaseStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.DatabaseStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        BtreeStats
        +
        +
        +
        +
        public abstract class DatabaseStats
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Statistics for a single database.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + +
          Constructors 
          ModifierConstructor and Description
          protected DatabaseStats() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DatabaseStats

            +
            protected DatabaseStats()
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DeadlockException.html b/docs/java/com/sleepycat/je/DeadlockException.html new file mode 100644 index 0000000..b429965 --- /dev/null +++ b/docs/java/com/sleepycat/je/DeadlockException.html @@ -0,0 +1,291 @@ + + + + + +DeadlockException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DeadlockException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        LockNotGrantedException
        +
        +
        +
        +
        public class DeadlockException
        +extends LockConflictException
        +
        Thrown when a deadlock is detected. When this exception is thrown, JE + detected a deadlock and chose one transaction (or non-transactional + operation), the "victim", to invalidate in order to break the deadlock. + Note that this is different than a lock + timeout or TransactionTimeoutException, which occur for other + reasons. + +

        For more information on deadlock detection, see + EnvironmentConfig.LOCK_DEADLOCK_DETECT. As described there, a + DeadlockException is normally thrown when a random victim is + selected; in this case the exception message will contain the string: + This locker was chosen randomly as the victim. If the deadlock + exception is thrown in a non-victim thread, due to live lock or an + unresponsive thread, the message will contain the string: + Unable to break deadlock using random victim selection within the + timeout interval.

        + +

        TODO: describe how to debug using info included with the exception.

        + +

        Normally, applications should catch the base class LockConflictException rather than catching one of its subclasses. All lock + conflicts are typically handled in the same way, which is normally to abort + and retry the transaction. See LockConflictException for more + information.

        + +

        The Transaction handle is invalidated as a result of this + exception.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DeleteConstraintException.html b/docs/java/com/sleepycat/je/DeleteConstraintException.html new file mode 100644 index 0000000..ba659d4 --- /dev/null +++ b/docs/java/com/sleepycat/je/DeleteConstraintException.html @@ -0,0 +1,286 @@ + + + + + +DeleteConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DeleteConstraintException

      +
      +
      + +
      + +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DiskLimitException.html b/docs/java/com/sleepycat/je/DiskLimitException.html new file mode 100644 index 0000000..2467b1e --- /dev/null +++ b/docs/java/com/sleepycat/je/DiskLimitException.html @@ -0,0 +1,257 @@ + + + + + +DiskLimitException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DiskLimitException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DiskOrderedCursor.html b/docs/java/com/sleepycat/je/DiskOrderedCursor.html new file mode 100644 index 0000000..ea0d49f --- /dev/null +++ b/docs/java/com/sleepycat/je/DiskOrderedCursor.html @@ -0,0 +1,552 @@ + + + + + +DiskOrderedCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DiskOrderedCursor

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.DiskOrderedCursor
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ForwardCursor, java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class DiskOrderedCursor
        +extends java.lang.Object
        +implements ForwardCursor
        +
        DiskOrderedCursor returns records in unsorted order in exchange for + generally faster retrieval times. Instead of key order, an approximation of + disk order is used, which results in less I/O. This can be useful when the + application needs to scan all records in one or more databases, and will be + applying filtering logic which does not need key ordered retrieval. + A DiskOrderedCursor is created using the Database.openCursor(DiskOrderedCursorConfig) method or the Environment.openDiskOrderedCursor(Database[], DiskOrderedCursorConfig) + method. +

        + WARNING: After opening a DiskOrderedCursor, deletion of log files + by the JE log cleaner will be disabled until close() is called. To + prevent unbounded growth of disk usage, be sure to call close() to + re-enable log file deletion. +

        + Optional configurations: the following options are available to + tune the DiskOrderedCursor. +

        + The DiskOrderedCursor creates a background producer thread which prefetches + some target records and inserts them in a queue for use by the cursor. The + parameter EnvironmentConfig.DOS_PRODUCER_QUEUE_TIMEOUT applies to + this background thread, and controls the timeout which governs the blocking + queue. +

        + See DiskOrderedCursorConfig for additional options. +

        +

        Consistency Guarantees

        +

        + The consistency guarantees provided by a DiskOrderedCursor are, at best, the + same as those provided by READ_UNCOMMITTED (see LockMode). With + READ_UNCOMMITTED, changes made by all transactions, including uncommitted + transactions, may be returned by the scan. Also, a record returned by the + scan is not locked, and may be modified or deleted by the application after + it is returned, including modification or deletion of the record at the + cursor position. +

        + In other words, the records returned by the scan correspond to the state + of the database (as if READ_UNCOMMITTED were used) at the beginning of the + scan plus some, but not all, changes made by the application after the start + of the scan. The user should not rely on the scan returning any changes + made after the start of the scan. For example, if the record referred to by + the DiskOrderedCursor is deleted after the DiskOrderedCursor is positioned + at that record, getCurrent() will still return the key and value of that + record and OperationStatus.SUCCESS. + + If a transactionally correct data set is required (as defined by + READ_COMMITTED), the application must ensure that all transactions that + write to the database are committed before the beginning of the scan. + During the scan, no records in the database of the scan may be + inserted, deleted, or modified. While this is possible, it is not the + expected use case for a DiskOrderedCursor. +

        +

        Performance Considerations

        +

        + The internal algorithm used to approximate disk ordered reads is as follows. + For simplicity, the algorithm description assumes that a single database is + being scanned, but the algorithm is almost the same when multiple databases + are involved. + An internal producer thread is used to scan the database. This thread is + created and started when the DiskOrderedCursor is created, and is + destroyed by close(). Scanning consists of two + phases. In phase I the in-cache Btree of the scanned database is traversed + in key order. The LSNs (physical record addresses) of the data to be + fetched are accumulated in a memory buffer. Btree latches are held during + the traversal, but only for short durations. In phase II the accumulated + LSNs are sorted into disk order, fetched one at a time in that order, and + the fetched data is added to a blocking queue. The getNext method + in this class removes the next entry from the queue. This approach allows + concurrent access to the Database during both phases of the scan, including + access by the application's consumer thread (the thread calling getNext). +

        + Phase I does not always process the entire Btree. During phase I if the + accumulation of LSNs causes the internal memory limit or + LSN batch size to be + exceeded, phase I is ended and phase II begins. In this case, after phase + II finishes, phase I resumes where it left off in the Btree traversal. + Phase I and II are repeated until the entire database is scanned. +

        + By default, the internal memory limit and LSN batch size are unbounded (see + DiskOrderedCursorConfig). For a database with a large number of + records, this could cause an OutOfMemoryError. Therefore, it is + strongly recommended that either the internal memory limit or LSN batch size + is configured to limit the use of memory during the scan. On the other + hand, the efficiency of the scan is proportional to the amount of memory + used. If enough memory is available, the ideal case would be that the + database is scanned in in a single iteration of phase I and II. The more + iterations, the more random IO will occur. +

        + Another factor is the queue + size. During the phase I Btree traversal, data that is resident in the JE + cache will be added to the queue immediately, rather than waiting until + phase II and fetching it, but only if the queue is not full. Therefore, + increasing the size of the queue can avoid fetching data that is resident in + the JE cache. Also, increasing the queue size can improve parallelism of + the work done by the producer and consumer threads. +

        + Also note that a keys-only scan + is much more efficient than the default keys-and-data scan. With a + keys-only scan, only the BINs (bottom internal nodes) of the Btree need to + be fetched; the LNs (leaf nodes) do not. This is also true of databases + configured for duplicates, even + for a keys-and-data scan, since internally the key and data are both + contained in the BIN.

        +
        +
        Since:
        +
        5.0
        +
        +
      • +
      +
      +
      + +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DiskOrderedCursorConfig.html b/docs/java/com/sleepycat/je/DiskOrderedCursorConfig.html new file mode 100644 index 0000000..d84661b --- /dev/null +++ b/docs/java/com/sleepycat/je/DiskOrderedCursorConfig.html @@ -0,0 +1,698 @@ + + + + + +DiskOrderedCursorConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DiskOrderedCursorConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.DiskOrderedCursorConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class DiskOrderedCursorConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of a DiskOrderedCursor.
        +
        +
        Since:
        +
        5.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static DiskOrderedCursorConfigDEFAULT +
          Default configuration used if null is passed to methods that create a + cursor.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DiskOrderedCursorConfig() +
          An instance created using the default constructor is initialized with + the system's default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          DiskOrderedCursorConfigclone() +
          Returns a copy of this configuration object.
          +
          booleangetBINsOnly() +
          Returns true if the DiskOrderedCursor is configured to scan BINs only, + returning all record keys and only those record data that are embedded + in the BINs.
          +
          longgetInternalMemoryLimit() +
          Returns the maximum amount of JE Cache Memory that the + DiskOrderedScan can use at one time.
          +
          booleangetKeysOnly() +
          Returns true if the DiskOrderedCursor is configured to return only + keys.
          +
          longgetLSNBatchSize() +
          Returns the maximum number of LSNs to be sorted that this + DiskOrderedCursor is configured for.
          +
          longgetMaxSeedMillisecs() +
          Deprecated.  +
          this method returns zero and will be removed in a future + release.
          +
          +
          longgetMaxSeedNodes() +
          Deprecated.  +
          this method returns zero and will be removed in a future + release.
          +
          +
          intgetQueueSize() +
          Returns the maximum number of entries in the queue before the + DiskOrderedCursor producer thread blocks.
          +
          DiskOrderedCursorConfigsetBINsOnly(boolean binsOnly) +
          Specify whether the DiskOrderedCursor should scan the BINs only.
          +
          DiskOrderedCursorConfigsetInternalMemoryLimit(long internalMemoryLimit) +
          Set the maximum amount of JE Cache Memory that the DiskOrderedScan + can use at one time.
          +
          DiskOrderedCursorConfigsetKeysOnly(boolean keysOnly) +
          Specify whether the DiskOrderedCursor should return only the key or key + + data.
          +
          DiskOrderedCursorConfigsetLSNBatchSize(long lsnBatchSize) +
          Set the maximum number of LSNs to gather and sort at any one time.
          +
          DiskOrderedCursorConfigsetMaxSeedMillisecs(long maxSeedMillisecs) +
          Deprecated.  +
          this method has no effect and will be removed in a future + release.
          +
          +
          DiskOrderedCursorConfigsetMaxSeedNodes(long maxSeedNodes) +
          Deprecated.  +
          this method has no effect and will be removed in a future + release.
          +
          +
          DiskOrderedCursorConfigsetQueueSize(int queueSize) +
          Set the queue size for entries being passed between the + DiskOrderedCursor producer thread and the application's consumer + thread.
          +
          java.lang.StringtoString() +
          Returns the values for each configuration attribute.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final DiskOrderedCursorConfig DEFAULT
            +
            Default configuration used if null is passed to methods that create a + cursor.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DiskOrderedCursorConfig

            +
            public DiskOrderedCursorConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setKeysOnly

            +
            public DiskOrderedCursorConfig setKeysOnly(boolean keysOnly)
            +
            Specify whether the DiskOrderedCursor should return only the key or key + + data. The default value is false (key + data). If keyOnly is true, + the performance of the disk ordered scan will be better, because the + Cursor only descends to the BIN level.
            +
            +
            Parameters:
            +
            keysOnly - If true, return only keys from this cursor.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getKeysOnly

            +
            public boolean getKeysOnly()
            +
            Returns true if the DiskOrderedCursor is configured to return only + keys. Returns false if it is configured to return keys + data.
            +
            +
            Returns:
            +
            true if the DiskOrderedCursor is configured to return keys only.
            +
            +
          • +
          + + + +
            +
          • +

            setBINsOnly

            +
            public DiskOrderedCursorConfig setBINsOnly(boolean binsOnly)
            +
            Specify whether the DiskOrderedCursor should scan the BINs only. If + true, the performance of the disk ordered scan will be better, because + LNs are not read from disk. However, in this case, the data portion + of a record will be returned only if it is embedded in the BIN; + otherwise only the key will be returned.
            +
            +
            Parameters:
            +
            binsOnly - If true, return keys and, if available, the associated + embedded data.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getBINsOnly

            +
            public boolean getBINsOnly()
            +
            Returns true if the DiskOrderedCursor is configured to scan BINs only, + returning all record keys and only those record data that are embedded + in the BINs.
            +
            +
            Returns:
            +
            true if the DiskOrderedCursor is configured to scan BINs only.
            +
            +
          • +
          + + + +
            +
          • +

            setLSNBatchSize

            +
            public DiskOrderedCursorConfig setLSNBatchSize(long lsnBatchSize)
            +
            Set the maximum number of LSNs to gather and sort at any one time. The + default is an unlimited number of LSNs. Setting this lower causes the + DiskOrderedScan to use less memory, but it sorts and processes LSNs more + frequently thereby causing slower performance. Setting this higher will + in general improve performance at the expense of memory. Each LSN uses + 16 bytes of memory.
            +
            +
            Parameters:
            +
            lsnBatchSize - the maximum number of LSNs to accumulate and sort + per batch.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getLSNBatchSize

            +
            public long getLSNBatchSize()
            +
            Returns the maximum number of LSNs to be sorted that this + DiskOrderedCursor is configured for.
            +
            +
            Returns:
            +
            the maximum number of LSNs to be sorted that this + DiskOrderedCursor is configured for.
            +
            +
          • +
          + + + +
            +
          • +

            setInternalMemoryLimit

            +
            public DiskOrderedCursorConfig setInternalMemoryLimit(long internalMemoryLimit)
            +
            Set the maximum amount of JE Cache Memory that the DiskOrderedScan + can use at one time. The default is an unlimited amount of memory. + Setting this lower causes the DiskOrderedScan to use less memory, but it + sorts and processes LSNs more frequently thereby generally causing slower + performance. Setting this higher will in general improve performance at + the expense of JE cache memory.
            +
            +
            Parameters:
            +
            internalMemoryLimit - the maximum number of non JE Cache bytes to + use.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            Cache + Statistics: Unexpected Sizes
            +
            +
          • +
          + + + +
            +
          • +

            getInternalMemoryLimit

            +
            public long getInternalMemoryLimit()
            +
            Returns the maximum amount of JE Cache Memory that the + DiskOrderedScan can use at one time.
            +
            +
            Returns:
            +
            the maximum amount of non JE Cache Memory that preload can use at + one time.
            +
            +
          • +
          + + + +
            +
          • +

            setQueueSize

            +
            public DiskOrderedCursorConfig setQueueSize(int queueSize)
            +
            Set the queue size for entries being passed between the + DiskOrderedCursor producer thread and the application's consumer + thread. If the queue size reaches this number of entries, the producer + thread will block until the application thread removes one or more + entries (by calling ForwardCursor.getNext(). The default is 1000.
            +
            +
            Parameters:
            +
            queueSize - the maximum number of entries the queue can hold before + the producer thread blocks.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getQueueSize

            +
            public int getQueueSize()
            +
            Returns the maximum number of entries in the queue before the + DiskOrderedCursor producer thread blocks.
            +
            +
            Returns:
            +
            the maximum number of entries in the queue before the + DiskOrderedCursor producer thread blocks.
            +
            +
          • +
          + + + +
            +
          • +

            setMaxSeedMillisecs

            +
            public DiskOrderedCursorConfig setMaxSeedMillisecs(long maxSeedMillisecs)
            +
            Deprecated. this method has no effect and will be removed in a future + release.
            +
          • +
          + + + +
            +
          • +

            getMaxSeedMillisecs

            +
            public long getMaxSeedMillisecs()
            +
            Deprecated. this method returns zero and will be removed in a future + release.
            +
          • +
          + + + +
            +
          • +

            setMaxSeedNodes

            +
            public DiskOrderedCursorConfig setMaxSeedNodes(long maxSeedNodes)
            +
            Deprecated. this method has no effect and will be removed in a future + release.
            +
          • +
          + + + +
            +
          • +

            getMaxSeedNodes

            +
            public long getMaxSeedNodes()
            +
            Deprecated. this method returns zero and will be removed in a future + release.
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public DiskOrderedCursorConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DiskOrderedCursorProducerException.html b/docs/java/com/sleepycat/je/DiskOrderedCursorProducerException.html new file mode 100644 index 0000000..fe6fa20 --- /dev/null +++ b/docs/java/com/sleepycat/je/DiskOrderedCursorProducerException.html @@ -0,0 +1,254 @@ + + + + + +DiskOrderedCursorProducerException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DiskOrderedCursorProducerException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/DuplicateDataException.html b/docs/java/com/sleepycat/je/DuplicateDataException.html new file mode 100644 index 0000000..20fb3e4 --- /dev/null +++ b/docs/java/com/sleepycat/je/DuplicateDataException.html @@ -0,0 +1,262 @@ + + + + + +DuplicateDataException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class DuplicateDataException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class DuplicateDataException
        +extends OperationFailureException
        +
        Thrown by Cursor.putCurrent if the old and new + data are not equal according to the configured duplicate comparator or + default comparator. + +

        If the old and new data are unequal according to the comparator, this + would change the sort order of the record, which would change the cursor + position, and this is not allowed. To change the sort order of a record, + delete it and then re-insert it.

        + +

        The Transaction handle is not invalidated as a result of + this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Durability.ReplicaAckPolicy.html b/docs/java/com/sleepycat/je/Durability.ReplicaAckPolicy.html new file mode 100644 index 0000000..f44f4eb --- /dev/null +++ b/docs/java/com/sleepycat/je/Durability.ReplicaAckPolicy.html @@ -0,0 +1,422 @@ + + + + + +Durability.ReplicaAckPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum Durability.ReplicaAckPolicy

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<Durability.ReplicaAckPolicy>
        +
        +
        +
        Enclosing class:
        +
        Durability
        +
        +
        +
        +
        public static enum Durability.ReplicaAckPolicy
        +extends java.lang.Enum<Durability.ReplicaAckPolicy>
        +
        A replicated environment makes it possible to increase an application's + transaction commit guarantees by committing changes to its replicas on + the network. ReplicaAckPolicy defines the policy for how such network + commits are handled. +

        + The choice of a ReplicaAckPolicy must be consistent across all the + replicas in a replication group, to ensure that the policy is + consistently enforced in the event of an election. + +

        Note that SECONDARY nodes are not included in the set of replicas + that must acknowledge transaction commits.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ALL +
          All ELECTABLE replicas must acknowledge that they have committed the + transaction.
          +
          NONE +
          No transaction commit acknowledgments are required and the master + will never wait for replica acknowledgments.
          +
          SIMPLE_MAJORITY +
          A simple majority of ELECTABLE replicas must acknowledge that they + have committed the transaction.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intminAckNodes(int groupSize) +
          Returns the minimum number of ELECTABLE replicas required to + implement the ReplicaAckPolicy for a given replication group size.
          +
          static Durability.ReplicaAckPolicyvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static Durability.ReplicaAckPolicy[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            ALL

            +
            public static final Durability.ReplicaAckPolicy ALL
            +
            All ELECTABLE replicas must acknowledge that they have committed the + transaction. This policy should be selected only if your replication + group has a small number of ELECTABLE replicas, and those replicas + are on extremely reliable networks and servers.
            +
          • +
          + + + +
            +
          • +

            NONE

            +
            public static final Durability.ReplicaAckPolicy NONE
            +
            No transaction commit acknowledgments are required and the master + will never wait for replica acknowledgments. In this case, + transaction durability is determined entirely by the type of commit + that is being performed on the master.
            +
          • +
          + + + +
            +
          • +

            SIMPLE_MAJORITY

            +
            public static final Durability.ReplicaAckPolicy SIMPLE_MAJORITY
            +
            A simple majority of ELECTABLE replicas must acknowledge that they + have committed the transaction. This acknowledgment policy, in + conjunction with an election policy which requires at least a simple + majority, ensures that the changes made by the transaction remains + durable if a new election is held. +

            + This is the default.

            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static Durability.ReplicaAckPolicy[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (Durability.ReplicaAckPolicy c : Durability.ReplicaAckPolicy.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static Durability.ReplicaAckPolicy valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            minAckNodes

            +
            public int minAckNodes(int groupSize)
            +
            Returns the minimum number of ELECTABLE replicas required to + implement the ReplicaAckPolicy for a given replication group size.
            +
            +
            Parameters:
            +
            groupSize - the number of ELECTABLE replicas in the replication + group
            +
            Returns:
            +
            the number of ELECTABLE replicas needed
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Durability.SyncPolicy.html b/docs/java/com/sleepycat/je/Durability.SyncPolicy.html new file mode 100644 index 0000000..e8575f6 --- /dev/null +++ b/docs/java/com/sleepycat/je/Durability.SyncPolicy.html @@ -0,0 +1,394 @@ + + + + + +Durability.SyncPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum Durability.SyncPolicy

      +
      +
      +
        +
      • java.lang.Object
      • +
      • + +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<Durability.SyncPolicy>
        +
        +
        +
        Enclosing class:
        +
        Durability
        +
        +
        +
        +
        public static enum Durability.SyncPolicy
        +extends java.lang.Enum<Durability.SyncPolicy>
        +
        Defines the synchronization policy to be used when committing a + transaction. High levels of synchronization offer a greater guarantee + that the transaction is persistent to disk, but trade that off for + lower performance.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          NO_SYNC +
          Do not write or synchronously flush the log on transaction commit.
          +
          SYNC +
          Write and synchronously flush the log on transaction commit.
          +
          WRITE_NO_SYNC +
          Write but do not synchronously flush the log on transaction commit.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static Durability.SyncPolicyvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static Durability.SyncPolicy[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            SYNC

            +
            public static final Durability.SyncPolicy SYNC
            +
            Write and synchronously flush the log on transaction commit. + Transactions exhibit all the ACID (atomicity, consistency, + isolation, and durability) properties. +

            + This is the default.

            +
          • +
          + + + +
            +
          • +

            NO_SYNC

            +
            public static final Durability.SyncPolicy NO_SYNC
            +
            Do not write or synchronously flush the log on transaction commit. + Transactions exhibit the ACI (atomicity, consistency, and isolation) + properties, but not D (durability); that is, database integrity will + be maintained, but if the application or system fails, it is + possible some number of the most recently committed transactions may + be undone during recovery. The number of transactions at risk is + governed by how many log updates can fit into the log buffer, how + often the operating system flushes dirty buffers to disk, and how + often the log is checkpointed.
            +
          • +
          + + + +
            +
          • +

            WRITE_NO_SYNC

            +
            public static final Durability.SyncPolicy WRITE_NO_SYNC
            +
            Write but do not synchronously flush the log on transaction commit. + Transactions exhibit the ACI (atomicity, consistency, and isolation) + properties, but not D (durability); that is, database integrity will + be maintained, but if the operating system fails, it is possible + some number of the most recently committed transactions may be + undone during recovery. The number of transactions at risk is + governed by how often the operating system flushes dirty buffers to + disk, and how often the log is checkpointed.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static Durability.SyncPolicy[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (Durability.SyncPolicy c : Durability.SyncPolicy.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static Durability.SyncPolicy valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Durability.html b/docs/java/com/sleepycat/je/Durability.html new file mode 100644 index 0000000..cea2be6 --- /dev/null +++ b/docs/java/com/sleepycat/je/Durability.html @@ -0,0 +1,590 @@ + + + + + +Durability (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class Durability

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.Durability
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class Durability
        +extends java.lang.Object
        +
        Durability defines the overall durability characteristics associated with a + transaction. When operating on a local environment the durability of a + transaction is completely determined by the local Durability.SyncPolicy that is + in effect. When using replication, the overall durability is a function of + the local Durability.SyncPolicy plus the Durability.ReplicaAckPolicy used by the + master and the Durability.SyncPolicy in effect at each Replica.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Nested Class Summary

          + + + + + + + + + + + + + + +
          Nested Classes 
          Modifier and TypeClass and Description
          static class Durability.ReplicaAckPolicy +
          A replicated environment makes it possible to increase an application's + transaction commit guarantees by committing changes to its replicas on + the network.
          +
          static class Durability.SyncPolicy +
          Defines the synchronization policy to be used when committing a + transaction.
          +
          +
        • +
        + + + + + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object obj) 
          Durability.SyncPolicygetLocalSync() +
          Returns the transaction synchronization policy to be used locally when + committing a transaction.
          +
          Durability.ReplicaAckPolicygetReplicaAck() +
          Returns the replica acknowledgment policy used by the master when + committing changes to a replicated environment.
          +
          Durability.SyncPolicygetReplicaSync() +
          Returns the transaction synchronization policy to be used by the replica + as it replays a transaction that needs an acknowledgment.
          +
          inthashCode() 
          static Durabilityparse(java.lang.String durabilityString) +
          Parses the string and returns the durability it represents.
          +
          java.lang.StringtoString() +
          Returns the string representation of durability in the format defined + by string form of the Durability constructor.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            COMMIT_SYNC

            +
            public static final Durability COMMIT_SYNC
            +
            A convenience constant that defines a durability policy with COMMIT_SYNC + for local commit synchronization. + + The replicated environment policies default to COMMIT_NO_SYNC for + commits of replicated transactions that need acknowledgment and + SIMPLE_MAJORITY for the acknowledgment policy.
            +
          • +
          + + + +
            +
          • +

            COMMIT_NO_SYNC

            +
            public static final Durability COMMIT_NO_SYNC
            +
            A convenience constant that defines a durability policy with + COMMIT_NO_SYNC for local commit synchronization. + + The replicated environment policies default to COMMIT_NO_SYNC for + commits of replicated transactions that need acknowledgment and + SIMPLE_MAJORITY for the acknowledgment policy.
            +
          • +
          + + + +
            +
          • +

            COMMIT_WRITE_NO_SYNC

            +
            public static final Durability COMMIT_WRITE_NO_SYNC
            +
            A convenience constant that defines a durability policy with + COMMIT_WRITE_NO_SYNC for local commit synchronization. + + The replicated environment policies default to COMMIT_NO_SYNC for + commits of replicated transactions that need acknowledgment and + SIMPLE_MAJORITY for the acknowledgment policy.
            +
          • +
          + + + +
            +
          • +

            READ_ONLY_TXN

            +
            public static final Durability READ_ONLY_TXN
            +
            Deprecated. use TransactionConfig.setReadOnly(boolean) instead.
            +
            A convenience constant that defines a durability policy, with + ReplicaAckPolicy.NONE for use with a read only transaction. + A read only transaction on a Master, using this Durability, will thus + not be held up, or throw InsufficientReplicasException, if + the Master is not in contact with a sufficient number of Replicas at the + time the transaction was initiated.

            + + It's worth noting that since the transaction is read only, the sync + policies, although specified as NO_SYNC, do not really + matter.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Durability

            +
            public Durability(Durability.SyncPolicy localSync,
            +                  Durability.SyncPolicy replicaSync,
            +                  Durability.ReplicaAckPolicy replicaAck)
            +
            Creates an instance of a Durability specification.
            +
            +
            Parameters:
            +
            localSync - the SyncPolicy to be used when committing the + transaction locally.
            +
            replicaSync - the SyncPolicy to be used remotely, as part of a + transaction acknowledgment, at a Replica node.
            +
            replicaAck - the acknowledgment policy used when obtaining + transaction acknowledgments from Replicas.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            parse

            +
            public static Durability parse(java.lang.String durabilityString)
            +
            Parses the string and returns the durability it represents. The string + must have the following format: +

            + + SyncPolicy[,SyncPolicy[,ReplicaAckPolicy]] + +

            + The first SyncPolicy in the above format applies to the Master, and the + optional second SyncPolicy to the replica. Specific SyncPolicy or + ReplicaAckPolicy values are denoted by the name of the enumeration + value. +

            + For example, the string:sync,sync,quorum describes a durability + policy where the master and replica both use Durability.SyncPolicy.SYNC + to commit transactions and Durability.ReplicaAckPolicy.SIMPLE_MAJORITY to + acknowledge a transaction commit. +

            + Durability.SyncPolicy.NO_SYNC, is the default value for a node's + SyncPolicy. +

            + Durability.ReplicaAckPolicy.SIMPLE_MAJORITY is the default for the + ReplicaAckPolicy.

            +
            +
            Parameters:
            +
            durabilityString - the durability string in the above format
            +
            Returns:
            +
            the Durability resulting from the parse, or null if the + durabilityString argument was itself null.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the durabilityString is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the string representation of durability in the format defined + by string form of the Durability constructor.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            See Also:
            +
            parse(String)
            +
            +
          • +
          + + + +
            +
          • +

            getLocalSync

            +
            public Durability.SyncPolicy getLocalSync()
            +
            Returns the transaction synchronization policy to be used locally when + committing a transaction.
            +
          • +
          + + + +
            +
          • +

            getReplicaSync

            +
            public Durability.SyncPolicy getReplicaSync()
            +
            Returns the transaction synchronization policy to be used by the replica + as it replays a transaction that needs an acknowledgment.
            +
          • +
          + + + +
            +
          • +

            getReplicaAck

            +
            public Durability.ReplicaAckPolicy getReplicaAck()
            +
            Returns the replica acknowledgment policy used by the master when + committing changes to a replicated environment.
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object obj)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Environment.html b/docs/java/com/sleepycat/je/Environment.html new file mode 100644 index 0000000..0fd56eb --- /dev/null +++ b/docs/java/com/sleepycat/je/Environment.html @@ -0,0 +1,1749 @@ + + + + + +Environment (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class Environment

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.Environment
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        Direct Known Subclasses:
        +
        ReplicatedEnvironment, XAEnvironment
        +
        +
        +
        +
        public class Environment
        +extends java.lang.Object
        +implements java.io.Closeable
        +
        A database environment. Environments include support for some or all of + caching, locking, logging and transactions. + +

        To open an existing environment with default attributes the application + may use a default environment configuration object or null: +

        +
        +      // Open an environment handle with default attributes.
        +     Environment env = new Environment(home, new EnvironmentConfig());
        +     
        +
        + or +
        +     Environment env = new Environment(home, null);
        + 
        +

        Note that many Environment objects may access a single environment.

        +

        To create an environment or customize attributes, the application should + customize the configuration class. For example:

        +
        +     EnvironmentConfig envConfig = new EnvironmentConfig();
        +     envConfig.setTransactional(true);
        +     envConfig.setAllowCreate(true);
        +     envConfig.setCacheSize(1000000);
        +     Environment newlyCreatedEnv = new Environment(home, envConfig);
        + 
        + +

        Note that environment configuration parameters can also be set through + the <environment home>/je.properties file. This file takes precedence + over any programmatically specified configuration parameters so that + configuration changes can be made without recompiling. Environment + configuration follows this order of precedence:

        + +
          +
        1. Configuration parameters specified in + <environment home>/je.properties take first precedence. +
        2. Configuration parameters set in the EnvironmentConfig object used at + Environment construction e tameters not set by the application are set to + system defaults, described along with the parameter name String constants + in the EnvironmentConfig class. +
        + +

        An environment handle is an Environment instance. More than one + Environment instance may be created for the same physical directory, which + is the same as saying that more than one Environment handle may be open at + one time for a given environment.

        + + The Environment handle should not be closed while any other handle remains + open that is using it as a reference (for example, Database or Transaction. Once Environment.close is called, this object may not be accessed again.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Environment

            +
            public Environment(java.io.File envHome,
            +                   EnvironmentConfig configuration)
            +            throws EnvironmentNotFoundException,
            +                   EnvironmentLockedException,
            +                   VersionMismatchException,
            +                   DatabaseException,
            +                   java.lang.IllegalArgumentException
            +
            Creates a database environment handle.
            +
            +
            Parameters:
            +
            envHome - The database environment's home directory.
            +
            configuration - The database environment attributes. If null, + default attributes are used.
            +
            Throws:
            +
            EnvironmentNotFoundException - if the environment does not exist + (does not contain at least one log file) and the EnvironmentConfig AllowCreate parameter is false.
            +
            EnvironmentLockedException - when an environment cannot be opened + for write access because another process has the same environment open + for write access. Warning: This exception should be + handled when an environment is opened by more than one process.
            +
            VersionMismatchException - when the existing log is not compatible + with the version of JE that is running. This occurs when a later + version of JE was used to create the log. Warning: + This exception should be handled when more than one version of JE may be + used to access an environment.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this environment was previously + opened for replication and is not being opened read-only.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid EnvironmentConfig parameter.
            +
            DatabaseException
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws DatabaseException
            +
            The Environment.close method closes the Berkeley DB environment. + +

            When the last environment handle is closed, allocated resources are + freed, and daemon threads are stopped, even if they are performing work. + For example, if the cleaner is still cleaning the log, it will be + stopped at the next reasonable opportunity and perform no more cleaning + operations. After stopping background threads, a final checkpoint is + performed by this method, in order to reduce the time to recover the + next time the environment is opened.

            + +

            When minimizing recovery time is desired, it is often useful to stop + all application activity and perform an additional checkpoint prior to + calling close. This additional checkpoint will write most of + dirty Btree information, so that that the final checkpoint is very + small (and recovery is fast). To ensure that recovery time is minimized, + the log cleaner threads should also be stopped prior to the extra + checkpoint. This prevents log cleaning from dirtying the Btree, which + can make the final checkpoint larger (and recovery time longer). The + recommended procedure for minimizing recovery time is:

            + +
            +     // Stop/finish all application operations that are using JE.
            +     ...
            +
            +     // Stop the cleaner daemon threads.
            +     EnvironmentMutableConfig config = env.getMutableConfig();
            +     config.setConfigParam(EnvironmentConfig.ENV_RUN_CLEANER, "false");
            +     env.setMutableConfig(config);
            +
            +     // Perform an extra checkpoint
            +     env.checkpoint(new CheckpointConfig().setForce(true));
            +
            +     // Finally, close the environment.
            +     env.close();
            + 
            + +

            The Environment handle should not be closed while any other handle + that refers to it is not yet closed; for example, database environment + handles must not be closed while database handles remain open, or + transactions in the environment have not yet committed or aborted. + Specifically, this includes Database, + and Transaction handles.

            + +

            If this handle has already been closed, this method does nothing and + returns without throwing an exception.

            + +

            In multithreaded applications, only a single thread should call + Environment.close.

            + +

            The environment handle may not be used again after this method has + been called, regardless of the method's success or failure, with one + exception: the close method itself may be called any number of + times.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            EnvironmentWedgedException - when the current process must be + shut down and restarted before re-opening the Environment.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DiskLimitException - if the final checkpoint cannot be performed + because a disk limit has been violated. The Environment will be closed, + but this exception will be thrown so that the application is aware that + a checkpoint was not performed.
            +
            java.lang.IllegalStateException - if any open databases or transactions + refer to this handle. The Environment will be closed, but this exception + will be thrown so that the application is aware that not all databases + and transactions were closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            openDatabase

            +
            public Database openDatabase(Transaction txn,
            +                             java.lang.String databaseName,
            +                             DatabaseConfig dbConfig)
            +                      throws DatabaseNotFoundException,
            +                             DatabaseExistsException,
            +                             java.lang.IllegalArgumentException,
            +                             java.lang.IllegalStateException
            +
            Opens, and optionally creates, a Database.
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            databaseName - The name of the database.
            +
            dbConfig - The database attributes. If null, default attributes + are used.
            +
            Returns:
            +
            Database handle.
            +
            Throws:
            +
            DatabaseExistsException - if the database already exists and the + DatabaseConfig ExclusiveCreate parameter is true.
            +
            DatabaseNotFoundException - if the database does not exist and the + DatabaseConfig AllowCreate parameter is false.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs. If the database does not exist and the AllowCreate parameter is true, then one + of the Write + Operation Failures may also occur.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid DatabaseConfig property.
            +
            java.lang.IllegalStateException - if DatabaseConfig properties are changed + and there are other open handles for this database.
            +
            +
          • +
          + + + +
            +
          • +

            openSecondaryDatabase

            +
            public SecondaryDatabase openSecondaryDatabase(Transaction txn,
            +                                               java.lang.String databaseName,
            +                                               Database primaryDatabase,
            +                                               SecondaryConfig dbConfig)
            +                                        throws DatabaseNotFoundException,
            +                                               DatabaseExistsException,
            +                                               DatabaseException,
            +                                               java.lang.IllegalArgumentException,
            +                                               java.lang.IllegalStateException
            +
            Opens and optionally creates a SecondaryDatabase. + +

            Note that the associations between primary and secondary databases + are not stored persistently. Whenever a primary database is opened for + write access by the application, the appropriate associated secondary + databases should also be opened by the application. This is necessary + to ensure data integrity when changes are made to the primary + database.

            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            databaseName - The name of the database.
            +
            primaryDatabase - the primary database with which the secondary + database will be associated. The primary database must not be + configured for duplicates.
            +
            dbConfig - The secondary database attributes. If null, default + attributes are used.
            +
            Returns:
            +
            Database handle.
            +
            Throws:
            +
            DatabaseExistsException - if the database already exists and the + DatabaseConfig ExclusiveCreate parameter is true.
            +
            DatabaseNotFoundException - if the database does not exist and the + DatabaseConfig AllowCreate parameter is false.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs. If the database does not exist and the AllowCreate parameter is true, then one + of the Write + Operation Failures may also occur.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid SecondaryConfig property.
            +
            java.lang.IllegalStateException - if DatabaseConfig properties are changed + and there are other open handles for this database.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            removeDatabase

            +
            public void removeDatabase(Transaction txn,
            +                           java.lang.String databaseName)
            +                    throws DatabaseNotFoundException
            +
            Removes a database from the environment, discarding all records in the + database and removing the database name itself. + +

            Compared to deleting all the records in a database individually, + removeDatabase is a very efficient operation. Some internal + housekeeping information is updated, but the database records are not + read or written, and very little I/O is needed.

            + +

            When called on a database configured with secondary indices, the + application is responsible for also removing all associated secondary + indices. To guarantee integrity, a primary database and all of its + secondary databases should be removed atomically using a single + transaction.

            + +

            Applications should not remove a database with open Database handles. If the database is open with the same transaction as + passed in the txn parameter, IllegalStateException is + thrown by this method. If the database is open using a different + transaction, this method will block until all database handles are + closed, or until the conflict is resolved by throwing LockConflictException.

            +
            +
            Parameters:
            +
            txn - For a transactional environment, an explicit transaction + may be specified or null may be specified to use auto-commit. For a + non-transactional environment, null must be specified.
            +
            databaseName - The database to be removed.
            +
            Throws:
            +
            DatabaseNotFoundException - if the database does not exist.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is a read-only + environment.
            +
            java.lang.IllegalStateException - if the database is currently open using + the transaction passed in the txn parameter, or if this handle + or the underlying environment has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            renameDatabase

            +
            public void renameDatabase(Transaction txn,
            +                           java.lang.String databaseName,
            +                           java.lang.String newName)
            +                    throws DatabaseNotFoundException
            +
            Renames a database, without removing the records it contains. + +

            Applications should not rename a database with open Database handles. If the database is open with the same transaction as + passed in the txn parameter, IllegalStateException is + thrown by this method. If the database is open using a different + transaction, this method will block until all database handles are + closed, or until the conflict is resolved by throwing LockConflictException.

            +
            +
            Parameters:
            +
            txn - For a transactional environment, an explicit transaction + may be specified or null may be specified to use auto-commit. For a + non-transactional environment, null must be specified.
            +
            databaseName - The new name of the database.
            +
            Throws:
            +
            DatabaseNotFoundException - if the database does not exist.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is a read-only + environment.
            +
            java.lang.IllegalStateException - if the database is currently open using + the transaction passed in the txn parameter, or if this handle + or the underlying environment has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            truncateDatabase

            +
            public long truncateDatabase(Transaction txn,
            +                             java.lang.String databaseName,
            +                             boolean returnCount)
            +                      throws DatabaseNotFoundException
            +
            Empties the database, discarding all the records it contains, without + removing the database name. + +

            Compared to deleting all the records in a database individually, + truncateDatabase is a very efficient operation. Some internal + housekeeping information is updated, but the database records are not + read or written, and very little I/O is needed.

            + +

            When called on a database configured with secondary indices, the + application is responsible for also truncating all associated secondary + indices. To guarantee integrity, a primary database and all of its + secondary databases should be truncated atomically using a single + transaction.

            + +

            Applications should not truncate a database with open Database handles. If the database is open with the same transaction as + passed in the txn parameter, IllegalStateException is + thrown by this method. If the database is open using a different + transaction, this method will block until all database handles are + closed, or until the conflict is resolved by throwing LockConflictException.

            +
            +
            Parameters:
            +
            txn - For a transactional environment, an explicit transaction may + be specified or null may be specified to use auto-commit. For a + non-transactional environment, null must be specified.
            +
            databaseName - The database to be truncated.
            +
            returnCount - If true, count and return the number of records + discarded.
            +
            Returns:
            +
            The number of records discarded, or -1 if returnCount is false.
            +
            Throws:
            +
            DatabaseNotFoundException - if the database does not exist.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is a read-only + environment.
            +
            java.lang.IllegalStateException - if the database is currently open using + the transaction passed in the txn parameter, or if this handle + or the underlying environment has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            getHome

            +
            public java.io.File getHome()
            +                     throws DatabaseException
            +
            Returns the database environment's home directory. + + This method may be called when the environment has been invalidated, but + not yet closed. In other words, EnvironmentFailureException is + never thrown by this method.
            +
            +
            Returns:
            +
            The database environment's home directory. + environment-wide failure occurs.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            beginTransaction

            +
            public Transaction beginTransaction(Transaction parent,
            +                                    TransactionConfig txnConfig)
            +                             throws DatabaseException,
            +                                    java.lang.IllegalArgumentException
            +
            Creates a new transaction in the database environment. + +

            Transaction handles are free-threaded; transactions handles may be + used concurrently by multiple threads.

            + +

            Cursors may not span transactions; that is, each cursor must be + opened and closed within a single transaction. The parent parameter is a + placeholder for nested transactions, and must currently be null.

            +
            +
            Parameters:
            +
            txnConfig - The transaction attributes. If null, default + attributes are used.
            +
            Returns:
            +
            The newly created transaction's handle.
            +
            Throws:
            +
            InsufficientReplicasException - if the Master + in a replicated environment could not contact a quorum of replicas as + determined by the Durability.ReplicaAckPolicy.
            +
            ReplicaConsistencyException - if a replica + in a replicated environment cannot become consistent within the timeout + period.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is not a transactional + environment.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid TransactionConfig parameter.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            checkpoint

            +
            public void checkpoint(CheckpointConfig ckptConfig)
            +                throws DatabaseException
            +
            Synchronously checkpoint the database environment. +

            + This is an optional action for the application since this activity + is, by default, handled by a database environment owned background + thread. +

            + A checkpoint has the side effect of flushing all preceding + non-transactional write operations, as well as any preceding + transactions that were committed with no-sync durability. However, for best + performance, checkpoints should be used only to bound recovery time. + flushLog(boolean) can be used to write buffered data for durability + purposes.

            +
            +
            Parameters:
            +
            ckptConfig - The checkpoint attributes. If null, default + attributes are used.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DiskLimitException - if the checkpoint cannot be performed + because a disk limit has been violated.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            sync

            +
            public void sync()
            +          throws DatabaseException
            +
            Synchronously flushes database environment databases to stable storage. + Calling this method is equivalent to forcing a checkpoint and setting + CheckpointConfig.setMinimizeRecoveryTime(boolean) to true. +

            + A checkpoint has the side effect of flushing all preceding + non-transactional write operations, as well as any preceding + transactions that were committed with no-sync durability. However, for best + performance, checkpoints should be used only to bound recovery time. + flushLog(boolean) can be used to write buffered data for durability + purposes.

            +
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DiskLimitException - if the sync cannot be performed + because a disk limit has been violated.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            flushLog

            +
            public void flushLog(boolean fsync)
            +
            Writes buffered data to the log, and optionally performs an fsync to + guarantee that data is written to the physical device. +

            + This method is used to make durable, by writing to the log, all + preceding non-transactional write operations, as well as any preceding + transactions that were committed with no-sync durability. If the fsync + parameter is true, it can also be used to flush all logged data to the + physical storage device, by performing an fsync. +

            + Note that this method does not flush previously unwritten data + in deferred-write databases; that is done by calling Database.sync() or performing a checkpoint.

            +
            +
            Parameters:
            +
            fsync - is true to perform an fsync as well as a file write, or + false to perform only a file write.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            cleanLog

            +
            public int cleanLog()
            +             throws DatabaseException
            +
            Synchronously invokes log file (data file) cleaning until the target + disk space utilization has been reached; this method is called + periodically by the cleaner background threads. + +

            Zero or more log files will be cleaned as necessary to bring the + current disk space + utilization of the environment above the configured utilization threshold. + +

            Note that this method does not perform the complete task of cleaning + a log file. Eviction and checkpointing log Btree information that is + marked dirty by the cleaner, and a full checkpoint is necessary, + following cleaning, before cleaned files will be deleted (or renamed). + Checkpoints occur periodically and when the environment is closed.

            + +

            This is an optional action for the application since this activity + is, by default, handled by one or more Environment-owned background + threads.

            + +

            The intended use case for the cleanLog method is when the + application wishes to disable the built-in cleaner threads using the + EnvironmentConfig.ENV_RUN_CLEANER property. To replace the + functionality of the cleaner threads, the application should call + cleanLog periodically.

            + +

            Note that because this method cleans multiple files before returning, + in an attempt to reach the target utilization, it may not return for a + long time when there is a large backlog of files to be cleaned. This + method cannot be aborted except by closing the environment. If the + application needs the ability to abort the cleaning process, the + cleanLogFile() method should be used instead.

            + +

            Note that in certain unusual situations the cleaner may not be able + to make forward progress and the target utilization will never be + reached. For example, this can occur if the target utilization is set + too high or checkpoints are performed too often. To guard against + cleaning "forever", this method will return when all files have been + cleaned, even when the target utilization has not been reached.

            +
            +
            Returns:
            +
            The number of log files that were cleaned, and that will be + deleted (or renamed) when a qualifying checkpoint occurs.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is a read-only or + memory-only environment.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            cleanLogFile

            +
            public boolean cleanLogFile()
            +                     throws DatabaseException
            +
            Synchronously invokes cleaning of a single log file (data file), if + the target disk space utilization has not been reached. + +

            One log file will be cleaned if the current disk space utilization of the + environment is below the configured utilization threshold. No + files will be cleaned if disk space utilization is currently above the + threshold. The lowest utilized file is selected for cleaning, since it + has the lowest cleaning cost.

            + +

            Note that this method does not perform the complete task of cleaning + a log file. Eviction and checkpointing log Btree information that is + marked dirty by the cleaner, and a full checkpoint is necessary, + following cleaning, before cleaned files will be deleted (or renamed). + Checkpoints occur periodically and when the environment is closed.

            + +

            The intended use case for the cleanLog method is "batch + cleaning". This is when the application disables the cleaner threads + (using the EnvironmentConfig.ENV_RUN_CLEANER property) + for maximum performance during active periods, and calls cleanLog during periods when the application is quiescent or less + active than usual. Similarly, there may be times when an application + wishes to perform cleaning explicitly until the target utilization + rather than relying on the cleaner's background threads. For example, + some applications may wish to perform batch cleaning prior to closing + the environment, to reclaim as much disk space as possible at that + time.

            + +

            To clean until the target utilization threshold is reached, cleanLogFile can be called in a loop until it returns false. + When there is a large backlog of files to be cleaned, the application may wish to limit the + amount of cleaning. Batch cleaning can be aborted simply by breaking out + of the loop. The cleaning of a single file is not a long operation; it + should take several minutes at most. For example:

            + +
            +     boolean cleaningAborted;
            +     boolean anyCleaned = false;
            +
            +     while (!cleaningAborted && env.cleanLogFile()) {
            +         anyCleaned = true;
            +     }
            + 
            + +

            Note that in certain unusual situations the cleaner may not be able + to make forward progress and the target utilization will never be + reached. For example, this can occur if the target utilization is set + too high or checkpoints are performed too often. To guard against + cleaning "forever", the application may wish to cancel the batch + cleaning (break out of the loop) when the cleaning time or number of + files cleaned exceeds some reasonable limit.

            + +

            As mentioned above, the cleaned log files will not be deleted until + the next full checkpoint. If the application wishes to reclaim this disk + space as soon as possible, an explicit checkpoint may be performed after + the batch cleaning operation. For example:

            + +
            +     if (anyCleaned) {
            +         env.checkpoint(new CheckpointConfig().setForce(true));
            +     }
            + 
            + +

            However, even an explicit checkpoint is not guaranteed to delete the + cleaned log files if, at the time the file was cleaned, records in the + file were locked or were part of a database that was being removed, due + to concurrent application activity that was accessing records or + removing databases. In this case the files will be deleted only after + these operations are complete and a subsequent checkpoint is performed. + To guarantee that the cleaned files will be deleted, an application may + stop all concurrent activity (ensure all operations and transactions + have ended) and then perform a checkpoint.

            + +

            When closing the environment and minimizing recovery time is desired + (see close()), as well as reclaiming disk space, the recommended + procedure is as follows:

            + +
            +     // Stop/finish all application operations that are using JE.
            +     ...
            +
            +     // Stop the cleaner daemon threads.
            +     EnvironmentMutableConfig config = env.getMutableConfig();
            +     config.setConfigParam(EnvironmentConfig.ENV_RUN_CLEANER, "false");
            +     env.setMutableConfig(config);
            +
            +     // Perform batch cleaning.
            +     while (!cleaningAborted && env.cleanLogFile()) {
            +     }
            +
            +     // Perform an extra checkpoint
            +     env.checkpoint(new CheckpointConfig().setForce(true));
            +
            +     // Finally, close the environment.
            +     env.close();
            + 
            +
            +
            Returns:
            +
            true if one log was cleaned, or false if none were cleaned.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.UnsupportedOperationException - if this is a read-only or + memory-only environment.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            evictMemory

            +
            public void evictMemory()
            +                 throws DatabaseException
            +
            Synchronously invokes the mechanism for keeping memory usage within the + cache size boundaries. + +

            This is an optional action for the application since this activity + is, by default, handled by a database environment owned background + thread.

            +
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            compress

            +
            public void compress()
            +              throws DatabaseException
            +
            Synchronously invokes the compressor mechanism which compacts in memory + data structures after delete operations. + +

            This is an optional action for the application since this activity + is, by default, handled by a database environment owned background + thread.

            +
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            preload

            +
            public PreloadStats preload(Database[] databases,
            +                            PreloadConfig config)
            +                     throws DatabaseException
            +
            Preloads the cache with multiple databases. This method should only be + called when there are no operations being performed on the specified + databases in other threads. Executing preload during concurrent updates + of the specified databases may result in some or all of the tree being + loaded into the JE cache. Executing preload during any other types of + operations may result in JE exceeding its allocated cache + size. preload() effectively locks all of the specified database and + therefore will lock out the checkpointer, cleaner, and compressor, as + well as not allow eviction to occur. If databases are replicated and + the environment is in the replica state, then the replica may become + temporarily disconnected from the master if the replica needs to replay + changes against the database and is locked out because the time taken by + the preload operation exceeds ReplicationConfig.FEEDER_TIMEOUT.
            +
            +
            Parameters:
            +
            config - The PreloadConfig object that specifies the parameters + of the preload.
            +
            Returns:
            +
            A PreloadStats object with the result of the preload operation + and various statistics about the preload() operation.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if any of the databases has been closed.
            +
            DatabaseException
            +
            See Also:
            +
            Database.preload(PreloadConfig)
            +
            +
          • +
          + + + +
            +
          • +

            openDiskOrderedCursor

            +
            public DiskOrderedCursor openDiskOrderedCursor(Database[] databases,
            +                                               DiskOrderedCursorConfig config)
            +                                        throws DatabaseException
            +
            Create a DiskOrderedCursor to iterate over the records of a given set + of databases. Because the retrieval is based on Log Sequence Number + (LSN) order rather than key order, records are returned in unsorted + order in exchange for generally faster retrieval. LSN order + approximates disk sector order. +

            + See DiskOrderedCursor for more details and a description of the + consistency guarantees provided by the scan. +

            + WARNING: After calling this method, deletion of log files by + the JE log cleaner will be disabled until DiskOrderedCursor.close() is called. To prevent unbounded growth of + disk usage, be sure to call DiskOrderedCursor.close() to + re-enable log file deletion.

            +
            +
            Parameters:
            +
            databases - An array containing the handles to the database that + are to be scanned. All these handles must be currently open. + Furthermore, all the databases must belong to this environments, and + they should all support duplicates or none of them should support + duplicates. Note: this method does not make a copy of this array, + and as a result, the contents of the array should not be modified + while the returned DiskOrderedCursor is still in use.
            +
            config - The DiskOrderedCursorConfig object that specifies the + parameters of the disk ordered scan.
            +
            Returns:
            +
            the new DiskOrderedCursor object.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if (a) the databases parameter is + null or an empty array, or (b) any of the handles in the databases + parameter is null, or (c) the databases do not all belong to this + environment, or (d) some databases support duplicates and some don't.
            +
            java.lang.IllegalStateException - if any of the databases has been + closed or invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public EnvironmentConfig getConfig()
            +                            throws DatabaseException
            +
            Returns this object's configuration.
            +
            +
            Returns:
            +
            This object's configuration. + +

            Unlike most Environment methods, this method may be called if the + environment is invalid, but not yet closed.

            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            setMutableConfig

            +
            public void setMutableConfig(EnvironmentMutableConfig mutableConfig)
            +                      throws DatabaseException
            +
            Sets database environment attributes. + +

            Attributes only apply to a specific Environment object and are not + necessarily shared by other Environment objects accessing this + database environment.

            + +

            Unlike most Environment methods, this method may be called if the + environment is invalid, but not yet closed.

            +
            +
            Parameters:
            +
            mutableConfig - The database environment attributes. If null, + default attributes are used.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getMutableConfig

            +
            public EnvironmentMutableConfig getMutableConfig()
            +                                          throws DatabaseException
            +
            Returns database environment attributes. + +

            Unlike most Environment methods, this method may be called if the + environment is invalid, but not yet closed.

            +
            +
            Returns:
            +
            Environment attributes.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getStats

            +
            public EnvironmentStats getStats(StatsConfig config)
            +                          throws DatabaseException
            +
            Returns the general database environment statistics.
            +
            +
            Parameters:
            +
            config - The general statistics attributes. If null, default + attributes are used.
            +
            Returns:
            +
            The general database environment statistics.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getLockStats

            +
            public LockStats getLockStats(StatsConfig config)
            +                       throws DatabaseException
            +
            Deprecated. as of 4.0.10, replaced by getStats(StatsConfig).

            +
            Returns the database environment's locking statistics.
            +
            +
            Parameters:
            +
            config - The locking statistics attributes. If null, default + attributes are used.
            +
            Returns:
            +
            The database environment's locking statistics.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getTransactionStats

            +
            public TransactionStats getTransactionStats(StatsConfig config)
            +                                     throws DatabaseException
            +
            Returns the database environment's transactional statistics.
            +
            +
            Parameters:
            +
            config - The transactional statistics attributes. If null, + default attributes are used.
            +
            Returns:
            +
            The database environment's transactional statistics.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getDatabaseNames

            +
            public java.util.List<java.lang.String> getDatabaseNames()
            +                                                  throws DatabaseException
            +
            Returns a List of database names for the database environment. + +

            Each element in the list is a String.

            +
            +
            Returns:
            +
            A List of database names for the database environment.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            verify

            +
            public boolean verify(VerifyConfig config,
            +                      java.io.PrintStream out)
            +               throws DatabaseException
            +
            Returns if the database environment is consistent and correct. + +

            Verification is an expensive operation that should normally only be + used for troubleshooting and debugging.

            +
            +
            Parameters:
            +
            config - The verification attributes. If null, default + attributes are used.
            +
            out - is unused. To specify the output stream for verification + information, use VerifyConfig.setShowProgressStream(java.io.PrintStream).
            +
            Returns:
            +
            true if the database environment is consistent and correct. + Currently true is always returned when this method returns normally, + i.e., when no exception is thrown.
            +
            Throws:
            +
            EnvironmentFailureException - if a corruption is detected, or if + an unexpected, internal or environment-wide failure occurs. If a + persistent corruption is detected, + EnvironmentFailureException.isCorrupted() will return true.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getThreadTransaction

            +
            public Transaction getThreadTransaction()
            +                                 throws DatabaseException
            +
            Returns the transaction associated with this thread if implied + transactions are being used. Implied transactions are used in an XA or + JCA "Local Transaction" environment. In an XA environment the + XAEnvironment.start() entrypoint causes a transaction to be created and + become associated with the calling thread. Subsequent API calls + implicitly use that transaction. XAEnvironment.end() causes the + transaction to be disassociated with the thread. In a JCA Local + Transaction environment, the call to JEConnectionFactory.getConnection() + causes a new transaction to be created and associated with the calling + thread.
            +
            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            setThreadTransaction

            +
            public void setThreadTransaction(Transaction txn)
            +
            Sets the transaction associated with this thread if implied transactions + are being used. Implied transactions are used in an XA or JCA "Local + Transaction" environment. In an XA environment the + XAEnvironment.start() entrypoint causes a transaction to be created and + become associated with the calling thread. Subsequent API calls + implicitly use that transaction. XAEnvironment.end() causes the + transaction to be disassociated with the thread. In a JCA Local + Transaction environment, the call to JEConnectionFactory.getConnection() + causes a new transaction to be created and associated with the calling + thread.
            +
            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            isValid

            +
            public boolean isValid()
            +
            Returns whether this Environment is open, valid and can be used. + +

            When an EnvironmentFailureException, or one of its + subclasses, is caught, the isValid method can be called to + determine whether the Environment can continue to be used, or + should be closed. Some EnvironmentFailureExceptions invalidate the + environment and others do not.

            + +

            If this method returns false, the environment may have been closed by + the application, or may have been invalidated by an exception and not + yet closed. The isClosed() method may be used to distinguish + between these two cases, and getInvalidatingException() can be + used to return the exception. Note that it is safe to call close() redundantly, so it is safe to always call close() when + this method returns false.

            +
          • +
          + + + +
            +
          • +

            isClosed

            +
            public boolean isClosed()
            +
            Returns whether the environment has been closed by the application. + +

            If this method returns true, close()} has been called. If + the environment was previously invalidated by an exception, it will be + returned by getInvalidatingException().

            + +

            If this method returns false, the environment may or may not be + usable, since it may have been invalidated by an exception but not yet + closed. To determine whether it was invalidated, call isValid() + or getInvalidatingException().

            +
            +
            Returns:
            +
            whether the environment has been closed by the application.
            +
            Since:
            +
            7.2
            +
            +
          • +
          + + + +
            +
          • +

            getInvalidatingException

            +
            public EnvironmentFailureException getInvalidatingException()
            +
            Returns the exception that caused the environment to be invalidated, or + null if the environment was not invalidated by an exception. + +

            This method may be used to determine whether the environment was + invalidated by an exception, by checking for a non-null return value. + This method will return the invalidating exception, regardless of + whether the environment is closed. Note that isValid() will + return false when the environment is closed, even when it was not + invalidated by an exception.

            + +

            This method may also be used to identify and handle the original + invalidating exception, when more than one exception is thrown. When an + environment is first invalidated by an EnvironmentFailureException, the + exception is saved so that it can be returned by this method. Other + EnvironmentFailureExceptions may be thrown later as side effects of the + original problem, or possibly as separate problems. It is normally the + first invalidating exception that is most relevant.

            +
            +
            Returns:
            +
            the invalidating exception or null.
            +
            Since:
            +
            7.2
            +
            +
          • +
          + + + +
            +
          • +

            printStartupInfo

            +
            public void printStartupInfo(java.io.PrintStream out)
            +
            Print a detailed report about the costs of different phases of + environment startup. This report is by default logged to the je.info + file if startup takes longer than je.env.startupThreshold. + +

            Unlike most Environment methods, this method may be called if the + environment is invalid, but not yet closed.

            +
            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has been closed.
            +
            +
          • +
          + + + +
            +
          • +

            isInternalHandle

            +
            protected boolean isInternalHandle()
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentConfig.html b/docs/java/com/sleepycat/je/EnvironmentConfig.html new file mode 100644 index 0000000..bb18cdf --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentConfig.html @@ -0,0 +1,7254 @@ + + + + + +EnvironmentConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentConfig

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Cloneable
        +
        +
        +
        +
        public class EnvironmentConfig
        +extends EnvironmentMutableConfig
        +
        Specifies the attributes of an environment. + +

        To change the default settings for a database environment, an application + creates a configuration object, customizes settings and uses it for + environment construction. The set methods of this class validate the + configuration values when the method is invoked. An + IllegalArgumentException is thrown if the value is not valid for that + attribute.

        + +

        Most parameters are described by the parameter name String constants in + this class. These parameters can be specified or individually by calling + setConfigParam(java.lang.String, java.lang.String), through a Properties object passed to EnvironmentConfig(Properties), or via properties in the je.properties + files located in the environment home directory.

        + +

        For example, an application can change the default btree node size + with:

        + +
        +     envConfig.setConfigParam(EnvironmentConfig.LOCK_TIMEOUT, "250 ms");
        + 
        + +

        Some commonly used environment attributes have convenience setter/getter + methods defined in this class. For example, to change the default + lock timeout setting for an environment, the application can instead do + the following:

        +
        +     // customize an environment configuration
        +     EnvironmentConfig envConfig = new EnvironmentConfig();
        +     // will throw if timeout value is invalid
        +     envConfig.setLockTimeout(250, TimeUnit.MILLISECONDS);
        +     // Open the environment using this configuration.
        +     Environment myEnvironment = new Environment(home, envConfig);
        + 
        + +

        Parameter values are applied using this order of precedence:

        +
          +
        1. Configuration parameters specified in je.properties take first + precedence.
        2. +
        3. Configuration parameters set in the EnvironmentConfig object used at + Environment construction are next.
        4. +
        5. Any configuration parameters not set by the application are set to + system defaults, described along with the parameter name String + constants in this class.
        6. +
        + +

        However, a small number of parameters do not have string constants in + this class, and cannot be set using setConfigParam(java.lang.String, java.lang.String), a Properties + object, or the je.properties file. These parameters can only be changed + via the following setter methods:

        + + +

        An EnvironmentConfig can be used to specify both mutable and immutable + environment properties. Immutable properties may be specified when the + first Environment handle (instance) is opened for a given physical + environment. When more handles are opened for the same environment, the + following rules apply:

        +
          +
        1. Immutable properties must equal the original values specified when + constructing an Environment handle for an already open environment. When a + mismatch occurs, an exception is thrown.
        2. +
        3. Mutable properties are ignored when constructing an Environment handle + for an already open environment.
        4. +
        + +

        After an Environment has been constructed, its mutable properties may be + changed using Environment.setMutableConfig(com.sleepycat.je.EnvironmentMutableConfig). See EnvironmentMutableConfig for a list of mutable properties; all other + properties are immutable. Whether a property is mutable or immutable is + also described along with the parameter name String constants in this + class.

        + +

        Getting the Current Environment Properties

        + + To get the current "live" properties of an environment after constructing it + or changing its properties, you must call Environment.getConfig() or + Environment.getMutableConfig(). The original EnvironmentConfig or + EnvironmentMutableConfig object used to set the properties is not kept up to + date as properties are changed, and does not reflect property validation or + properties that are computed. + +

        Time Duration Properties

        + +

        Several environment and transaction configuration properties are time + durations. For these properties, a time unit is specified along with an + integer duration value.

        + +

        When specific setter and getter methods exist for a time duration + property, these methods have a TimeUnit argument. Examples are + setLockTimeout(long,TimeUnit) and getLockTimeout(TimeUnit). Note that the TimeUnit argument may + be null only when the duration value is zero; there is no default unit that + is used when null is specified.

        + +

        When a time duration is specified as a string value, the following format + is used.

        + +
            <value> [ <whitespace> <unit> ]
        + +

        The <value> is an integer. The <unit> name, if present, + must be preceded by one or more spaces or tabs.

        + +

        The following <unit> names are allowed. Both TimeUnit + names and IEEE standard abbreviations are allowed. Unit names are case + insensitive.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        IEEE abbreviationTimeUnit name + Definition
        nsNANOSECONDSone billionth (10-9) of a second
        usMICROSECONDSone millionth (10-6) of a second
        msMILLISECONDSone thousandth (10-3) of a second
        sSECONDS1 second
        min 60 seconds
        h 3600 seconds
        + +

        Examples are:

        +
        + 3 seconds
        + 3 s
        + 500 ms
        + 1000000 (microseconds is implied)
        + 
        + +

        The maximum duration value is currently Integer.MAX_VALUE milliseconds. + This translates to almost 25 days (2147483647999999 ns, 2147483647999 us, + 2147483647 ms, 2147483 s, 35791 min, 596 h).

        + +

        Note that when the <unit> is omitted, microseconds is implied. + This default is supported for compatibility with JE 3.3 and earlier. In JE + 3.3 and earlier, explicit time units were not used and durations were always + implicitly specified in microseconds. The older methods that do not have a + TimeUnit argument, such as setLockTimeout(long) and getLockTimeout(), use microsecond durations and have been deprecated.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static java.lang.StringADLER32_CHUNK_SIZE +
          By default, JE passes an entire log record to the Adler32 class for + checksumming.
          +
          static java.lang.StringCHECKPOINTER_BYTES_INTERVAL +
          Ask the checkpointer to run every time we write this many bytes to the + log.
          +
          static java.lang.StringCHECKPOINTER_DEADLOCK_RETRY +
          The number of times to retry a checkpoint if it runs into a deadlock.
          +
          static java.lang.StringCHECKPOINTER_HIGH_PRIORITY +
          If true, the checkpointer uses more resources in order to complete the + checkpoint in a shorter time interval.
          +
          static java.lang.StringCHECKPOINTER_WAKEUP_INTERVAL +
          The checkpointer wakeup interval in microseconds.
          +
          static java.lang.StringCLEANER_ADJUST_UTILIZATION +
          Deprecated.  +
          in JE 6.3. Adjustments are no longer needed because LN log + sizes have been stored in the Btree since JE 6.0.
          +
          +
          static java.lang.StringCLEANER_BACKGROUND_PROACTIVE_MIGRATION +
          Deprecated.  +
          This parameter is ignored and proactive migration is no + longer supported due to its negative impact on eviction and + checkpointing. To reduce a cleaner backlog, configure more cleaner + threads.
          +
          +
          static java.lang.StringCLEANER_BYTES_INTERVAL +
          The cleaner checks disk utilization every time we write this many bytes + to the log.
          +
          static java.lang.StringCLEANER_DEADLOCK_RETRY +
          The number of times to retry cleaning if a deadlock occurs.
          +
          static java.lang.StringCLEANER_DETAIL_MAX_MEMORY_PERCENTAGE +
          Tracking of detailed cleaning information will use no more than this + percentage of the cache.
          +
          static java.lang.StringCLEANER_EXPUNGE +
          If true (the default setting), the cleaner deletes log files after + successful cleaning.
          +
          static java.lang.StringCLEANER_FETCH_OBSOLETE_SIZE +
          If true, the cleaner will fetch records to determine their size and more + accurately calculate log utilization.
          +
          static java.lang.StringCLEANER_FORCE_CLEAN_FILES +
          Specifies a list of files or file ranges to be cleaned at a time when no + other log cleaning is necessary.
          +
          static java.lang.StringCLEANER_FOREGROUND_PROACTIVE_MIGRATION +
          Deprecated.  +
          This parameter is ignored and proactive migration is no + longer supported due to its negative impact on eviction and Btree + splits. To reduce a cleaner backlog, configure more cleaner threads.
          +
          +
          static java.lang.StringCLEANER_LAZY_MIGRATION +
          Deprecated.  +
          This parameter is ignored and lazy migration is no longer + supported due to its negative impact on eviction and checkpointing. + To reduce a cleaner backlog, configure more cleaner threads.
          +
          +
          static java.lang.StringCLEANER_LOCK_TIMEOUT +
          The lock timeout for cleaner transactions in microseconds.
          +
          static java.lang.StringCLEANER_LOOK_AHEAD_CACHE_SIZE +
          The look ahead cache size for cleaning in bytes.
          +
          static java.lang.StringCLEANER_MAX_BATCH_FILES +
          Deprecated.  +
          in 7.0. No longer used because the cleaner no longer has a + backlog.
          +
          +
          static java.lang.StringCLEANER_MIN_AGE +
          The minimum age of a file (number of files between it and the active + file) to qualify it for cleaning under any conditions.
          +
          static java.lang.StringCLEANER_MIN_FILE_UTILIZATION +
          A log file will be cleaned if its utilization percentage is below this + value, irrespective of total utilization.
          +
          static java.lang.StringCLEANER_MIN_UTILIZATION +
          The cleaner will keep the total disk space utilization percentage above + this value.
          +
          static java.lang.StringCLEANER_READ_SIZE +
          The read buffer size for cleaning.
          +
          static java.lang.StringCLEANER_THREADS +
          The number of threads allocated by the cleaner for log file processing.
          +
          static java.lang.StringCLEANER_UPGRADE_TO_LOG_VERSION +
          All log files having a log version prior to the specified version will + be cleaned at a time when no other log cleaning is necessary.
          +
          static java.lang.StringCLEANER_USE_DELETED_DIR +
          When CLEANER_EXPUNGE is false, the CLEANER_USE_DELETED_DIR parameter determines whether successfully + cleaned files are moved to the "deleted" sub-directory.
          +
          static java.lang.StringCLEANER_WAKEUP_INTERVAL +
          The cleaner checks whether cleaning is needed if this interval elapses + without any writing, to handle the case where cleaning or checkpointing + is necessary to reclaim disk space, but writing has stopped.
          +
          static java.lang.StringCOMPRESSOR_DEADLOCK_RETRY +
          The number of times to retry a compression run if a deadlock occurs.
          +
          static java.lang.StringCOMPRESSOR_LOCK_TIMEOUT +
          The lock timeout for compressor transactions in microseconds.
          +
          static java.lang.StringCOMPRESSOR_PURGE_ROOT +
          Deprecated.  +
          as of 3.3.87. Compression of the root node no longer has + any benefit and this feature has been removed. This parameter has no + effect.
          +
          +
          static java.lang.StringCOMPRESSOR_WAKEUP_INTERVAL +
          The compressor thread wakeup interval in microseconds.
          +
          static java.lang.StringCONSOLE_LOGGING_LEVEL +
          Trace messages equal and above this level will be logged to the + console.
          +
          static java.lang.StringDOS_PRODUCER_QUEUE_TIMEOUT +
          The timeout for Disk Ordered Scan producer thread queue offers in + milliseconds.
          +
          static java.lang.StringENV_BACKGROUND_READ_LIMIT +
          The maximum number of read operations performed by JE background + activities (e.g., cleaning) before sleeping to ensure that application + threads can perform I/O.
          +
          static java.lang.StringENV_BACKGROUND_SLEEP_INTERVAL +
          The duration that JE background activities will sleep when the ENV_BACKGROUND_WRITE_LIMIT or ENV_BACKGROUND_READ_LIMIT is + reached.
          +
          static java.lang.StringENV_BACKGROUND_WRITE_LIMIT +
          The maximum number of write operations performed by JE background + activities (e.g., checkpointing and eviction) before sleeping to ensure + that application threads can perform I/O.
          +
          static java.lang.StringENV_CHECK_LEAKS +
          Debugging support: check leaked locks and txns at env close.
          +
          static java.lang.StringENV_DB_EVICTION +
          If true, enable eviction of metadata for closed databases.
          +
          static java.lang.StringENV_DUP_CONVERT_PRELOAD_ALL +
          If true (the default) preload all duplicates databases at once when + upgrading from JE 4.1 and earlier.
          +
          static java.lang.StringENV_EXPIRATION_ENABLED +
          If true (the default), expired data is filtered from queries and purged + by the cleaner.
          +
          static java.lang.StringENV_FAIR_LATCHES +
          If true, use latches instead of synchronized blocks to implement the + lock table and log write mutexes.
          +
          static java.lang.StringENV_FORCED_YIELD +
          Debugging support: call Thread.yield() at strategic points.
          +
          static java.lang.StringENV_IS_LOCKING +
          Configures the database environment for no locking.
          +
          static java.lang.StringENV_IS_TRANSACTIONAL +
          Configures the use of transactions.
          +
          static java.lang.StringENV_LATCH_TIMEOUT +
          The timeout for detecting internal latch timeouts, so that deadlocks can + be detected.
          +
          static java.lang.StringENV_READ_ONLY +
          Configures the database environment to be read-only, and any attempt to + modify a database will fail.
          +
          static java.lang.StringENV_RECOVERY_FORCE_CHECKPOINT +
          If true, a checkpoint is forced following recovery, even if the + log ends with a checkpoint.
          +
          static java.lang.StringENV_RECOVERY_FORCE_NEW_FILE +
          Used after performing a restore from backup to force creation of a new + log file prior to recovery.
          +
          static java.lang.StringENV_RUN_CHECKPOINTER +
          If true, starts up the checkpointer thread.
          +
          static java.lang.StringENV_RUN_CLEANER +
          If true, starts up the cleaner thread.
          +
          static java.lang.StringENV_RUN_EVICTOR +
          If true, eviction is done by a pool of evictor threads, as well as being + done inline by application threads.
          +
          static java.lang.StringENV_RUN_IN_COMPRESSOR +
          If true, starts up the INCompressor thread.
          +
          static java.lang.StringENV_RUN_OFFHEAP_EVICTOR +
          If true, off-heap eviction is done by a pool of evictor threads, as well + as being done inline by application threads.
          +
          static java.lang.StringENV_RUN_VERIFIER +
          Whether to run the background verifier.
          +
          static java.lang.StringENV_TTL_CLOCK_TOLERANCE +
          The interval added to the system clock time for determining that a + record may have expired.
          +
          static java.lang.StringEVICTOR_ALLOW_BIN_DELTAS +
          Allow Bottom Internal Nodes (BINs) to be written in a delta format + during eviction.
          +
          static java.lang.StringEVICTOR_CORE_THREADS +
          The minimum number of threads in the eviction thread pool.
          +
          static java.lang.StringEVICTOR_CRITICAL_PERCENTAGE +
          At this percentage over the allotted cache, critical eviction will + start.
          +
          static java.lang.StringEVICTOR_DEADLOCK_RETRY +
          Deprecated.  +
          as of JE 4.1, since the single evictor thread has + been replaced be a more robust thread pool.
          +
          +
          static java.lang.StringEVICTOR_EVICT_BYTES +
          When eviction occurs, the evictor will push memory usage to this number + of bytes below MAX_MEMORY.
          +
          static java.lang.StringEVICTOR_FORCED_YIELD +
          Call Thread.yield() at each check for cache overflow.
          +
          static java.lang.StringEVICTOR_KEEP_ALIVE +
          The duration that excess threads in the eviction thread pool will stay + idle; after this period, idle threads will terminate.
          +
          static java.lang.StringEVICTOR_LRU_ONLY +
          Deprecated.  +
          as of JE 6.0. This parameter is ignored by the new, + more efficient and more accurate evictor.
          +
          +
          static java.lang.StringEVICTOR_MAX_THREADS +
          The maximum number of threads in the eviction thread pool.
          +
          static java.lang.StringEVICTOR_N_LRU_LISTS +
          The number of LRU lists in the main JE cache.
          +
          static java.lang.StringEVICTOR_NODES_PER_SCAN +
          Deprecated.  +
          as of JE 6.0. This parameter is ignored by the new, more + efficient and more accurate evictor.
          +
          +
          static java.lang.StringFILE_LOGGING_LEVEL +
          Trace messages equal and above this level will be logged to the je.info + file, which is in the Environment home directory.
          +
          static java.lang.StringFREE_DISK +
          A lower limit on the number of bytes of free space to maintain on a + volume and per JE Environment.
          +
          static java.lang.StringHALT_ON_COMMIT_AFTER_CHECKSUMEXCEPTION +
          By default, if a checksum exception is found at the end of the log + during Environment startup, JE will assume the checksum is due to + previously interrupted I/O and will quietly truncate the log and + restart.
          +
          static java.lang.StringLOCK_DEADLOCK_DETECT +
          Whether to perform deadlock detection when a lock conflict occurs.
          +
          static java.lang.StringLOCK_DEADLOCK_DETECT_DELAY +
          The delay after a lock conflict, before performing deadlock detection.
          +
          static java.lang.StringLOCK_N_LOCK_TABLES +
          Number of Lock Tables.
          +
          static java.lang.StringLOCK_OLD_LOCK_EXCEPTIONS +
          Deprecated.  +
          since JE 6.5; has no effect, as if it were set to false.
          +
          +
          static java.lang.StringLOCK_TIMEOUT +
          Configures the default lock timeout.
          +
          static java.lang.StringLOG_BUFFER_SIZE +
          The maximum starting size of a JE log buffer.
          +
          static java.lang.StringLOG_CHECKSUM_READ +
          If true, perform a checksum check when reading entries from log.
          +
          static java.lang.StringLOG_CHUNKED_NIO +
          Deprecated.  +
          NIO is no longer used by JE and this parameter has no + effect.
          +
          +
          static java.lang.StringLOG_DETECT_FILE_DELETE +
          If true, periodically detect unexpected file deletions.
          +
          static java.lang.StringLOG_DETECT_FILE_DELETE_INTERVAL +
          The interval used to check for unexpected file deletions.
          +
          static java.lang.StringLOG_DIRECT_NIO +
          Deprecated.  +
          NIO is no longer used by JE and this parameter has no + effect.
          +
          +
          static java.lang.StringLOG_FAULT_READ_SIZE +
          The buffer size for faulting in objects from disk, in bytes.
          +
          static java.lang.StringLOG_FILE_CACHE_SIZE +
          The size of the file handle cache.
          +
          static java.lang.StringLOG_FILE_MAX +
          The maximum size of each individual JE log file, in bytes.
          +
          static java.lang.StringLOG_FLUSH_NO_SYNC_INTERVAL +
          The maximum time interval between committing a transaction with + NO_SYNC durability, and + making the transaction durable with respect to the file system.
          +
          static java.lang.StringLOG_FLUSH_SYNC_INTERVAL +
          The maximum time interval between committing a transaction with + NO_SYNC or WRITE_NO_SYNC durability, + and making the transaction durable with respect to the storage device.
          +
          static java.lang.StringLOG_FSYNC_TIME_LIMIT +
          If the time taken by an fsync exceeds this limit, a WARNING level + message is logged.
          +
          static java.lang.StringLOG_FSYNC_TIMEOUT +
          The timeout limit for group file sync, in microseconds.
          +
          static java.lang.StringLOG_GROUP_COMMIT_INTERVAL +
          The time interval in nanoseconds during which transactions may be + grouped to amortize the cost of write and/or fsync when a transaction + commits with SyncPolicy#SYNC or SyncPolicy#WRITE_NO_SYNC on the local + machine.
          +
          static java.lang.StringLOG_GROUP_COMMIT_THRESHOLD +
          The threshold value impacts the number of transactions that may be + grouped to amortize the cost of write and/or fsync when a + transaction commits with SyncPolicy#SYNC or SyncPolicy#WRITE_NO_SYNC + on the local machine.
          +
          static java.lang.StringLOG_ITERATOR_MAX_SIZE +
          The maximum read buffer size for log iterators, which are used when + scanning the log during activities like log cleaning and environment + open, in bytes.
          +
          static java.lang.StringLOG_ITERATOR_READ_SIZE +
          The read buffer size for log iterators, which are used when scanning the + log during activities like log cleaning and environment open, in bytes.
          +
          static java.lang.StringLOG_MEM_ONLY +
          If true, operates in an in-memory test mode without flushing the log to + disk.
          +
          static java.lang.StringLOG_N_DATA_DIRECTORIES +
          Deprecated.  +
          as of 7.3. This feature is not known to provide benefits + beyond that of a simple RAID configuration, and will be removed in the + next release, which is slated for mid-April, 2017.
          +
          +
          static java.lang.StringLOG_NUM_BUFFERS +
          The number of JE log buffers.
          +
          static java.lang.StringLOG_TOTAL_BUFFER_BYTES +
          The total memory taken by log buffers, in bytes.
          +
          static java.lang.StringLOG_USE_NIO +
          Deprecated.  +
          NIO is no longer used by JE and this parameter has no + effect.
          +
          +
          static java.lang.StringLOG_USE_ODSYNC +
          If true (default is false) O_DSYNC is used to open JE log files.
          +
          static java.lang.StringLOG_USE_WRITE_QUEUE +
          If true (default is true) the Write Queue is used for file I/O + operations which are blocked by concurrent I/O operations.
          +
          static java.lang.StringLOG_VERIFY_CHECKSUMS +
          If true, perform a checksum verification just before and after writing + to the log.
          +
          static java.lang.StringLOG_WRITE_QUEUE_SIZE +
          The size of the Write Queue.
          +
          static java.lang.StringMAX_DISK +
          An upper limit on the number of bytes used for data storage.
          +
          static java.lang.StringMAX_MEMORY +
          Configures the JE main cache size in bytes.
          +
          static java.lang.StringMAX_MEMORY_PERCENT +
          Configures the JE main cache size as a percentage of the JVM maximum + memory.
          +
          static java.lang.StringMAX_OFF_HEAP_MEMORY +
          Configures the number of bytes to be used as a secondary, off-heap cache.
          +
          static java.lang.StringNODE_DUP_TREE_MAX_ENTRIES +
          Deprecated.  +
          this property no longer has any effect; DatabaseConfig.setNodeMaxEntries(int) should be used instead.
          +
          +
          static java.lang.StringNODE_MAX_ENTRIES +
          The maximum number of entries in an internal btree node.
          +
          static java.lang.StringOFFHEAP_CHECKSUM +
          Can be used to add a checksum to each off-heap block when the block is + written, and validate the checksum when the block is read, for debugging + purposes.
          +
          static java.lang.StringOFFHEAP_CORE_THREADS +
          The minimum number of threads in the off-heap eviction thread pool.
          +
          static java.lang.StringOFFHEAP_EVICT_BYTES +
          The off-heap evictor will attempt to keep memory usage this number of + bytes below MAX_OFF_HEAP_MEMORY.
          +
          static java.lang.StringOFFHEAP_KEEP_ALIVE +
          The duration that excess threads in the off-heap eviction thread pool + will stay idle; after this period, idle threads will terminate.
          +
          static java.lang.StringOFFHEAP_MAX_THREADS +
          The maximum number of threads in the off-heap eviction thread pool.
          +
          static java.lang.StringOFFHEAP_N_LRU_LISTS +
          The number of LRU lists in the off-heap JE cache.
          +
          static java.lang.StringSHARED_CACHE +
          If true, the shared cache is used by this environment.
          +
          static java.lang.StringSTARTUP_DUMP_THRESHOLD +
          If environment startup exceeds this duration, startup statistics are + logged and can be found in the je.info file.
          +
          static java.lang.StringSTATS_COLLECT +
          If true collect and log statistics.
          +
          static java.lang.StringSTATS_COLLECT_INTERVAL +
          The duration of the statistics capture interval.
          +
          static java.lang.StringSTATS_FILE_DIRECTORY +
          The directory to save the statistics log file.
          +
          static java.lang.StringSTATS_FILE_ROW_COUNT +
          Log file maximum row count for Stat collection.
          +
          static java.lang.StringSTATS_MAX_FILES +
          Maximum number of statistics log files to retain.
          +
          static java.lang.StringTRACE_CONSOLE +
          Deprecated.  +
          in favor of CONSOLE_LOGGING_LEVEL As of JE + 4.0, use the standard java.util.logging configuration + methodologies. To enable console output, set + com.sleepycat.je.util.ConsoleHandler.level = <LEVEL> through + the java.util.logging configuration file, or through the + java.util.logging.LogManager. To set the handler level programmatically, + set "com.sleepycat.je.util.ConsoleHandler.level" in the + EnvironmentConfig object.
          +
          +
          static java.lang.StringTRACE_DB +
          Deprecated.  +
          As of JE 4.0, event tracing to the .jdb files has been + separated from the java.util.logging mechanism. This parameter has + no effect.
          +
          +
          static java.lang.StringTRACE_FILE +
          Deprecated.  +
          in favor of FILE_LOGGING_LEVEL As of JE 4.0, + use the standard java.util.logging configuration methodologies. To + enable logging output to the je.info files, set + com.sleepycat.je.util.FileHandler.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager. To set the handler level programmatically, + set "com.sleepycat.je.util.FileHandler.level" in the EnvironmentConfig + object.
          +
          +
          static java.lang.StringTRACE_FILE_COUNT +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. To set the FileHandler output file count, + set com.sleepycat.je.util.FileHandler.count = <NUMBER> + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTRACE_FILE_LIMIT +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. To set the FileHandler output file size, + set com.sleepycat.je.util.FileHandler.limit = <NUMBER> + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTRACE_LEVEL +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. Set logging levels using class names + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTRACE_LEVEL_CLEANER +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see cleaner logging, set + com.sleepycat.je.cleaner.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTRACE_LEVEL_EVICTOR +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see evictor logging, set + com.sleepycat.je.evictor.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTRACE_LEVEL_LOCK_MANAGER +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see locking logging, set + com.sleepycat.je.txn.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTRACE_LEVEL_RECOVERY +
          Deprecated.  +
          As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see recovery logging, set + com.sleepycat.je.recovery.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
          +
          +
          static java.lang.StringTREE_BIN_DELTA +
          If more than this percentage of entries are changed on a BIN, log a a + full version instead of a delta.
          +
          static java.lang.StringTREE_COMPACT_MAX_KEY_LENGTH +
          Specifies the maximum unprefixed key length for use in the compact + in-memory key representation.
          +
          static java.lang.StringTREE_MAX_DELTA +
          Deprecated.  +
          as of JE 6.0. The TREE_BIN_DELTA param alone now + determines whether a delta is logged.
          +
          +
          static java.lang.StringTREE_MAX_EMBEDDED_LN +
          The maximum size (in bytes) of a record's data portion that will cause + the record to be embedded in its parent LN.
          +
          static java.lang.StringTREE_MIN_MEMORY +
          The minimum bytes allocated out of the memory cache to hold Btree data + including internal nodes and record keys and data.
          +
          static java.lang.StringTXN_DEADLOCK_STACK_TRACE +
          Set this parameter to true to add stacktrace information to deadlock + (lock timeout) exception messages.
          +
          static java.lang.StringTXN_DUMP_LOCKS +
          Dump the lock table when a lock timeout is encountered, for debugging + assistance.
          +
          static java.lang.StringTXN_DURABILITY +
          Configures the default durability associated with transactions.
          +
          static java.lang.StringTXN_SERIALIZABLE_ISOLATION +
          Configures all transactions for this environment to have Serializable + (Degree 3) isolation.
          +
          static java.lang.StringTXN_TIMEOUT +
          Configures the transaction timeout.
          +
          static java.lang.StringVERIFY_BTREE +
          Whether the background verifier should perform Btree verification, + as if the DbVerify utility were run.
          +
          static java.lang.StringVERIFY_BTREE_BATCH_DELAY +
          The delay between batches during Btree + verification.
          +
          static java.lang.StringVERIFY_BTREE_BATCH_SIZE +
          The number of records verified per batch during Btree verification.
          +
          static java.lang.StringVERIFY_DATA_RECORDS +
          Whether to verify data records (leaf nodes, or LNs) during Btree + verification.
          +
          static java.lang.StringVERIFY_LOG +
          Whether the background verifier should verify checksums in the log, + as if the DbVerifyLog utility were run.
          +
          static java.lang.StringVERIFY_LOG_READ_DELAY +
          The delay between reads during log verification.
          +
          static java.lang.StringVERIFY_SCHEDULE +
          A crontab-format string indicating when to start the background + verifier.
          +
          static java.lang.StringVERIFY_SECONDARIES +
          Whether to verify secondary index references during Btree verification.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          EnvironmentConfig() +
          Creates an EnvironmentConfig initialized with the system default + settings.
          +
          EnvironmentConfig(java.util.Properties properties) +
          Creates an EnvironmentConfig which includes the properties specified in + the properties parameter.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            MAX_MEMORY

            +
            public static final java.lang.String MAX_MEMORY
            +
            Configures the JE main cache size in bytes. + +

            Either MAX_MEMORY or MAX_MEMORY_PERCENT may be used to configure the + cache size. When MAX_MEMORY is zero (its default value), + MAX_MEMORY_PERCENT determines the cache size. See + MAX_MEMORY_PERCENT for more information.

            + +

            When using MAX_MEMORY, take care to ensure that the overhead + of the JVM does not leave less free space in the heap than intended. + Some JVMs have more overhead than others, and some JVMs allocate their + overhead within the specified heap size (the -Xmx value). To be sure + that enough free space is available, use MAX_MEMORY_PERCENT rather than + MAX_MEMORY.

            + +

            When using the Oracle NoSQL DB product

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.maxMemory"LongYes0-none--none-

            +
            +
            See Also:
            +
            EnvironmentMutableConfig.setCacheSize(long), +MAX_MEMORY_PERCENT, +Cache Statistics: + Sizing, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            MAX_MEMORY_PERCENT

            +
            public static final java.lang.String MAX_MEMORY_PERCENT
            +
            Configures the JE main cache size as a percentage of the JVM maximum + memory. + +

            The system will evict database objects when it comes within a + prescribed margin of the limit.

            + +

            By default, JE sets the cache size to:

            + +
            + (MAX_MEMORY_PERCENT * JVM maximum memory) / 100 +
            + +

            where JVM maximum memory is specified by the JVM -Xmx flag. Note that + the actual heap size may be somewhat less, depending on JVM overheads. + The value used in the calculation above is the actual heap size as + returned by Runtime.maxMemory().

            + +

            The above calculation applies when MAX_MEMORY is zero, which + is its default value. Setting MAX_MEMORY to a non-zero value overrides + the percentage based calculation and sets the cache size explicitly.

            + +

            The following details apply to setting the cache size to a percentage + of the JVM heap size byte size (this parameter) as well as to a byte + size (MAX_MEMORY

            + +

            If SHARED_CACHE is set to true, MAX_MEMORY and + MAX_MEMORY_PERCENT specify the total size of the shared cache, and + changing these parameters will change the size of the shared cache. New + environments that join the cache may alter the cache size if their + configuration uses a different cache size parameter.

            + +

            The size of the cache is often directly proportional to operation + performance. See Cache + Statistics for information on understanding and monitoring the + cache. It is strongly recommended that the cache is large enough to + hold all INs. See DbCacheSize for information on sizing the + cache.

            + +

            To take full advantage of JE cache memory, it is strongly recommended + that + compressed oops + (-XX:+UseCompressedOops) is specified when a 64-bit JVM is + used and the maximum heap size is less than 32 GB. As described in the + referenced documentation, compressed oops is sometimes the default JVM + mode even when it is not explicitly specified in the Java command. + However, if compressed oops is desired then it must be + explicitly specified in the Java command when running DbCacheSize or a + JE application. If it is not explicitly specified then JE will not + aware of it, even if it is the JVM default setting, and will not take it + into account when calculating cache memory sizes.

            + +

            Note that log write buffers may be flushed to disk if the cache size + is changed after the environment has been opened.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.maxMemoryPercent"IntegerYes60190

            +
            +
            See Also:
            +
            EnvironmentMutableConfig.setCachePercent(int), +MAX_MEMORY, +Cache Statistics: + Sizing, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            MAX_OFF_HEAP_MEMORY

            +
            public static final java.lang.String MAX_OFF_HEAP_MEMORY
            +
            Configures the number of bytes to be used as a secondary, off-heap cache. + + The off-heap cache is used to hold record data and Btree nodes when + these are evicted from the "main cache" because it overflows. Eviction + occurs according to an LRU algorithm and takes into account the user- + specified CacheMode. When the off-heap cache overflows, eviction + occurs there also according to the same algorithm. +

            + The main cache is in the Java heap and consists primarily of the Java + objects making up the in-memory Btree data structure. Btree objects are + not serialized the main cache, so no object materialization is needed to + access the Btree there. Access to records in the main cache is therefore + very fast, but the main cache has drawbacks as well: 1) The larger the + main cache, the more likely it is to have Java GC performance problems. + 2) When the Java heap exceeds 32GB, the "compressed OOPs" setting no + longer applies and less data will fit in the same amount of memory. For + these reasons, JE applications often configure a heap of 32GB or less, + and a main cache that is significantly less than 32GB, leaving any + additional machine memory for use by the file system cache. +

            + The use of the file system cache has performance benefits, but + also has its own drawbacks: 1) There is a significant redundancy + between the main cache and the file system cache because all data and + Btree information that is logged (written) by JE appears in the file + system and may also appear in the main cache. 2) It is not possible + for dirty Btree information to be placed in the file system + cache without logging it, this logging may be otherwise unnecessary, and + the logging creates additional work for the JE cleaner; in other words, + the size of the main cache alone determines the maximum size of the + in-memory "dirty set". +

            + The off-heap cache is stored outside the Java heap using a native + platform memory allocator. The current implementation relies on + internals that are specific to the Oracle and IBM JDKs; however, a + memory allocator interface that can be implemented for other situations + is being considered for a future release. Records and Btree objects are + serialized when they are placed in the off-heap cache, and they must be + materialized when they are moved back to the main cache in order to + access them. This serialization and materialization adds some CPU + overhead and thread contention, as compared to accessing data directly + in the main cache. The off-heap cache can contain dirty Btree + information, so it can be used to increase the maximum size of the + in-memory "dirty set". +

            + NOTE: If an off-heap cache is configured but cannot be used because + that native allocator is not available in the JDK that is used, an + IllegalStateException will be thrown by the Environment + or ReplicatedEnvironment constructor. In + the current release, this means that the sun.misc.Unsafe class + must contain the allocateMemory method and related methods, as + defined in the Oracle JDK. +

            + When configuring an off-heap cache you can think of the performance + trade-offs in two ways. First, if the off-heap cache is considered to be + a replacement for the file system cache, the serialization and + materialization overhead is not increased. In this case, the use of + the off-heap cache is clearly beneficial, and using the off-heap cache + "instead of" the file system cache is normally recommended. Second, the + off-heap cache can be used along with a main cache that is reduced in + size in order to compensate for Java GC problems. In this case, the + trade-off is between the additional serialization, materialization and + contention overheads of the off-heap cache, as compared to the Java GC + overhead. +

            + When dividing up available memory for the JVM heap, the off-heap cache, + and for other uses, please be aware that the file system cache and the + off-heap cache are different in one important respect. The file system + cache automatically shrinks when memory is needed by the OS or other + processes, while the off-heap cache does not. Therefore, it is best to + be conservative about leaving memory free for other uses, and it is not + a good idea to size the off-heap cache such that all machine memory will + be allocated. If off-heap allocations or other allocations fail because + there is no available memory, the process is likely to die without any + exception being thrown. In one test on Linux, for example, the process + was killed abruptly by the OS and the only indication of the problem was + the following shown by dmesg. +

            + Out of memory: Kill process 28768 (java) score 974 or sacrifice child
            + Killed process 28768 (java)
            +    total-vm:278255336kB, anon-rss:257274420kB, file-rss:0kB
            + 
            +

            + WARNING: Although this configuration property is mutable, it cannot be + changed from zero to non-zero, or non-zero to zero. In other words, the + size of the off-heap cache can be changed after initially configuring a + non-zero size, but the off-heap cache cannot be turned on and off + dynamically. An attempt to do so will cause an IllegalArgumentException to be thrown by the Environment or + ReplicatedEnvironment constructor. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.maxOffHeapMemory"LongYes00-none-

            +
            +
            See Also:
            +
            EnvironmentMutableConfig.setOffHeapCacheSize(long), +Cache Statistics: + Sizing, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            SHARED_CACHE

            +
            public static final java.lang.String SHARED_CACHE
            +
            If true, the shared cache is used by this environment. + +

            By default this parameter is false and this environment uses a + private cache. If this parameter is set to true, this environment will + use a cache that is shared with all other open environments in this + process that also set this parameter to true. There is a single shared + cache per process.

            + +

            By using the shared cache, multiple open environments will make + better use of memory because the cache LRU algorithm is applied across + all information in all environments sharing the cache. For example, if + one environment is open but not recently used, then it will only use a + small portion of the cache, leaving the rest of the cache for + environments that have been recently used.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.sharedCache"BooleanNofalse

            +
            +
            See Also:
            +
            setSharedCache(boolean), +Cache Statistics: + Sizing, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            MAX_DISK

            +
            public static final java.lang.String MAX_DISK
            +
            An upper limit on the number of bytes used for data storage. Works + with FREE_DISK to define the storage limit. If the limit is + exceeded, write operations will be prohibited. +

            + If set to zero (the default), no usage limit is enforced, meaning that + all space on the storage volume, minus FREE_DISK, may be used. + If MAX_DISK is non-zero, FREE_DISK is subtracted from MAX_DISK to + determine the usage threshold for prohibiting write operations. If + multiple JE environments share the same storage volume, setting MAX_DISK + to a non-zero value is strongly recommended. + +

            Note: An exception to the rule above is + when MAX_DISK is less than or equal to 10GB and FREE_DISK is not + explicitly specified. See FREE_DISK more information.

            + + Both the FREE_DISK and MAX_DISK thresholds (if configured) are checked + during a write operation. If either threshold is crossed, the behavior + of the JE environment is as follows: +
              +
            • + Application write operations will throw DiskLimitException. + DiskLimitException extends OperationFailureException and + will invalidate the transaction, but will not invalidate the + environment. Read operations may continue even when write operations + are prohibited. +
            • +
            • + When using NoSQL DB, the above item applies to client CRUD + operations as well as operations performed on internal metadata. + When a disk limit is violated, NoSQL DB will throw exceptions for + client write operations and for operations that update internal + metadata. Related exceptions may be logged for other internal write + operations. Such exceptions will be derived from the JE + DiskLimitException. +
            • +
            • + Environment.checkpoint(com.sleepycat.je.CheckpointConfig), Environment.sync() and + Database.sync() will throw DiskLimitException. +
            • +
            • + Environment.close() may throw DiskLimitException when a final + checkpoint is performed. However, the environment will be properly + closed in other respects. +
            • +
            • + The JE evictor will not log dirty nodes when the cache overflows + and therefore dirty nodes cannot be evicted from cache. So + although read operations are allowed, cache thrashing may occur if + all INs do not fit in cache as recommended. +
            • +
            • + In an HA environment a disk limit may be violated on a replica node + but not the master node. In this case, a DiskLimitException will not + be thrown by a write operation on the master node. Instead, + InsufficientAcksException or + InsufficientReplicasException will be + thrown if the ack requirements + are not met. +
            • +
            +

            + JE uses a log structured storage system where data files often become + gradually obsolete over time (see CLEANER_MIN_UTILIZATION). The + JE cleaner is responsible for reclaiming obsolete space by cleaning and + deleting data files. In a standalone (non-HA) environment, data files + are normally deleted quickly after being cleaned, but may be reserved + and protected temporarily by a DbBackup or + DiskOrderedCursor. These reserved files will be deleted as soon + as they are no longer protected. +

            + In an HA environment, JE will retain as many reserved files as possible + to support replication to nodes that are out of contact. All cleaned + files are reserved (not deleted) until approaching a disk limit, at + which time they are deleted, as long as they are not protected. + Reserved files are protected when they are needed for + replication to active nodes or for feeding an active network restore. +

            + For more information on reserved and protected data files, see + EnvironmentStats.getActiveLogSize(), + EnvironmentStats.getReservedLogSize(), + EnvironmentStats.getProtectedLogSize(), + EnvironmentStats.getProtectedLogSizeMap(), + EnvironmentStats.getAvailableLogSize() and + EnvironmentStats.getTotalLogSize(). +

            + When multiple JE environments share the same storage volume, the + FREE_DISK amount will be maintained for each environment. The following + scenario illustrates use of a single shared volume with capacity 300GB: +

              +
            • + JE-1 and JE-2 each have MAX_DISK=100GB and FREE_DISK=5GB, +
            • +
            • + 100GB is used for fixed miscellaneous storage. +
            • +
            +

            + Each JE environment will use no more than 95GB each, so at least 10GB + will remain free overall. In other words, if both JE environments reach + their threshold and write operations are prohibited, each JE environment + will have 5GB of free space for recovery (10GB total). +

            + On the other hand, when an external service is also consuming disk + space and its usage of disk space is variable over time, the situation + is more complex and JE cannot always guarantee that FREE_DISK is + honored. The following scenario includes multiple JE environments as + well an external service, all sharing a 300GB volume. +

              +
            • + JE-1 and JE-2 each have MAX_DISK=100GB and FREE_DISK=5GB, +
            • +
            • + an external service is expected to use up to 50GB, and +
            • +
            • + 50GB is used for fixed miscellaneous storage. +
            • +
            +

            + Assuming that the external service stays within its 50GB limit then, as + the previous example, each JE environment will normally use no more than + 95GB each, and at least 10GB will remain free overall. However, if the + external service exceeds its threshold, JE will make a best effort to + prohibit write operations in order to honor the FREE_DISK limit, but + this is not always possible, as illustrated by the following sequence + of events: +

              +
            • + If the external service uses all its allocated space, 50GB, and JE + environments are each using 75GB, then there will be 50GB free + overall (25GB for each JE environment). Write operations are allowed + in both JE environments. +
            • +
            • + If the external service then exceeds its limit by 25GB and uses + 75GB, there will only 25GB free overall. But each JE environment is + still under its 90GB limit and there is still more than 5GB free + overall, so write operations are still allowed. +
            • +
            • + If each JE environment uses an additional 10GB of space, there will + only be 5GB free overall. Each JE environment is using only 85GB, + which is under its 95GB limit. But the 5GB FREE_DISK limit for the + volume overall has been reached and therefore JE write operations + will be prohibited. +
            • +
            + Leaving only 5GB of free space in the prior scenario is not ideal, but + it is at least enough for one JE environment at a time to be recovered. + The reality is that when an external entity exceeds its expected disk + usage, JE cannot always compensate. For example, if the external service + continues to use more space in the scenario above, the volume will + eventually be filled completely. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.maxDisk"LongYes00-none-

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            FREE_DISK, +EnvironmentMutableConfig.setMaxDisk(long), +EnvironmentMutableConfig.getMaxDisk(), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            FREE_DISK

            +
            public static final java.lang.String FREE_DISK
            +
            A lower limit on the number of bytes of free space to maintain on a + volume and per JE Environment. Works with MAX_DISK to define + the storage limit. If the limit is exceeded, write operations will be + prohibited. +

            + The default FREE_DISK value is 5GB. This value is designed to be large + enough to allow manual recovery after exceeding a disk threshold. +

            + If FREE_DISK is set to zero, no free space limit is enforced. This is + not recommended, since manual recovery may be very difficult or + impossible when the volume is completely full. +

            + If non-zero, this parameter is used in two ways. +

              +
            • + FREE_DISK determines the minimum of free space left on the storage + volume. If less than this amount is free, write operations are + prohibited. +
            • +
            • + If MAX_DISK is configured, FREE_DISK is subtracted from MAX_DISK to + determine the usage threshold for prohibiting write operations. See + MAX_DISK for more information. + +

              Note that this subtraction could make + testing inconvenient when a small value is specified for MAX_DISK + and FREE_DISK is not also specified. For example, if MAX_DISK is + 1GB and FREE_DISK is 5G (its default value), then no writing + would be allowed (MAX_DISK minus FREE_DISK is negative 4G). To + address this, the subtraction is performed only if one of two + conditions is met: +

                +
              1. FREE_DISK is explicitly specified, or
              2. +
              3. MAX_DISK is greater than 10GB.
              4. +

              + +
            • +
            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.freeDisk"LongYes5,368,709,120 (5GB)-none--none-

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            MAX_DISK, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RECOVERY_FORCE_CHECKPOINT

            +
            public static final java.lang.String ENV_RECOVERY_FORCE_CHECKPOINT
            +
            If true, a checkpoint is forced following recovery, even if the + log ends with a checkpoint. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.recoveryForceCheckpoint"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RECOVERY_FORCE_NEW_FILE

            +
            public static final java.lang.String ENV_RECOVERY_FORCE_NEW_FILE
            +
            Used after performing a restore from backup to force creation of a new + log file prior to recovery. +

            + As of JE 6.3, the use of this parameter is unnecessary except in special + cases. See the "Restoring from a backup" section in the DbBackup javadoc + for more information. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.recoveryForceNewFile"BooleanNofalse

            +
            +
            See Also:
            +
            Restoring from a backup, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            HALT_ON_COMMIT_AFTER_CHECKSUMEXCEPTION

            +
            public static final java.lang.String HALT_ON_COMMIT_AFTER_CHECKSUMEXCEPTION
            +
            By default, if a checksum exception is found at the end of the log + during Environment startup, JE will assume the checksum is due to + previously interrupted I/O and will quietly truncate the log and + restart. If this property is set to true, when a ChecksumException + occurs in the last log file during recovery, instead of truncating the + log file, and automatically restarting, attempt to continue reading past + the corrupted record with the checksum error to see if there are commit + records following the corruption. If there are, throw an + EnvironmentFailureException to indicate the presence of committed + transactions. The user may then need to run DbTruncateLog to truncate + the log for further recovery after doing manual analysis of the log. + Setting this property is suitable when the application wants to guard + against unusual cases. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.haltOnCommitAfterChecksumException"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RUN_IN_COMPRESSOR

            +
            public static final java.lang.String ENV_RUN_IN_COMPRESSOR
            +
            If true, starts up the INCompressor thread. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.runINCompressor"BooleanYestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RUN_CHECKPOINTER

            +
            public static final java.lang.String ENV_RUN_CHECKPOINTER
            +
            If true, starts up the checkpointer thread. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.runCheckpointer"BooleanYestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RUN_CLEANER

            +
            public static final java.lang.String ENV_RUN_CLEANER
            +
            If true, starts up the cleaner thread. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.runCleaner"BooleanYestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RUN_EVICTOR

            +
            public static final java.lang.String ENV_RUN_EVICTOR
            +
            If true, eviction is done by a pool of evictor threads, as well as being + done inline by application threads. If false, the evictor pool is not + used, regardless of the values of EVICTOR_CORE_THREADS and + EVICTOR_MAX_THREADS. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.runEvictor"BooleanYestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RUN_OFFHEAP_EVICTOR

            +
            public static final java.lang.String ENV_RUN_OFFHEAP_EVICTOR
            +
            If true, off-heap eviction is done by a pool of evictor threads, as well + as being done inline by application threads. If false, the evictor pool + is not used, regardless of the values of OFFHEAP_CORE_THREADS + and OFFHEAP_MAX_THREADS. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.runOffHeapEvictor"BooleanYestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_BACKGROUND_READ_LIMIT

            +
            public static final java.lang.String ENV_BACKGROUND_READ_LIMIT
            +
            The maximum number of read operations performed by JE background + activities (e.g., cleaning) before sleeping to ensure that application + threads can perform I/O. If zero (the default) then no limitation on + I/O is enforced. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.backgroundReadLimit"IntegerYes00-none-

            +
            +
            See Also:
            +
            ENV_BACKGROUND_SLEEP_INTERVAL, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_BACKGROUND_WRITE_LIMIT

            +
            public static final java.lang.String ENV_BACKGROUND_WRITE_LIMIT
            +
            The maximum number of write operations performed by JE background + activities (e.g., checkpointing and eviction) before sleeping to ensure + that application threads can perform I/O. If zero (the default) then no + limitation on I/O is enforced. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.backgroundWriteLimit"IntegerYes00-none-

            +
            +
            See Also:
            +
            ENV_BACKGROUND_SLEEP_INTERVAL, +Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            ENV_CHECK_LEAKS

            +
            public static final java.lang.String ENV_CHECK_LEAKS
            +
            Debugging support: check leaked locks and txns at env close. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.checkLeaks"BooleanNotrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_FORCED_YIELD

            +
            public static final java.lang.String ENV_FORCED_YIELD
            +
            Debugging support: call Thread.yield() at strategic points. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.forcedYield"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_IS_TRANSACTIONAL

            +
            public static final java.lang.String ENV_IS_TRANSACTIONAL
            +
            Configures the use of transactions. + +

            This should be set to true when transactional guarantees such as + atomicity of multiple operations and durability are important.

            + +

            If true, create an environment that is capable of performing + transactions. If true is not passed, transactions may not be used. For + licensing purposes, the use of this method distinguishes the use of the + Transactional product. Note that if transactions are not used, + specifying true does not create additional overhead in the + environment.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.isTransactional"BooleanNofalse

            +
            +
            See Also:
            +
            setTransactional(boolean), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_IS_LOCKING

            +
            public static final java.lang.String ENV_IS_LOCKING
            +
            Configures the database environment for no locking. + +

            If true, create the environment with record locking. This property + should be set to false only in special circumstances when it is safe to + run without record locking.

            + +

            This configuration option should be used when locking guarantees such + as consistency and isolation are not important. If locking mode is + disabled (it is enabled by default), the cleaner is automatically + disabled. The user is responsible for invoking the cleaner and ensuring + that there are no concurrent operations while the cleaner is + running.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.isLocking"BooleanNotrue

            +
            +
            See Also:
            +
            setLocking(boolean), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_READ_ONLY

            +
            public static final java.lang.String ENV_READ_ONLY
            +
            Configures the database environment to be read-only, and any attempt to + modify a database will fail. + +

            A read-only environment has several limitations and is recommended + only in special circumstances. Note that there is no performance + advantage to opening an environment read-only.

            + +

            The primary reason for opening an environment read-only is to open a + single environment in multiple JVM processes. Only one JVM process at a + time may open the environment read-write. See EnvironmentLockedException.

            + +

            When the environment is open read-only, the following limitations + apply.

            +
              +
            • In the read-only environment no writes may be performed, as + expected, and databases must be opened read-only using DatabaseConfig.setReadOnly(boolean).
            • +
            • The read-only environment receives a snapshot of the data that is + effectively frozen at the time the environment is opened. If the + application has the environment open read-write in another JVM process + and modifies the environment's databases in any way, the read-only + version of the data will not be updated until the read-only JVM process + closes and reopens the environment (and by extension all databases in + that environment).
            • +
            • If the read-only environment is opened while the environment is in + use by another JVM process in read-write mode, opening the environment + read-only (recovery) is likely to take longer than it does after a clean + shutdown. This is due to the fact that the read-write JVM process is + writing and checkpoints are occurring that are not coordinated with the + read-only JVM process. The effect is similar to opening an environment + after a crash.
            • +
            • In a read-only environment, the JE cache will contain information + that cannot be evicted because it was reconstructed by recovery and + cannot be flushed to disk. This means that the read-only environment + may not be suitable for operations that use large amounts of memory, and + poor performance may result if this is attempted.
            • +
            • In a read-write environment, the log cleaner will be prohibited from + deleting log files for as long as the environment is open read-only in + another JVM process. This may cause disk usage to rise, and for this + reason it is not recommended that an environment is kept open read-only + in this manner for long periods.
            • +
            + +

            For these reasons, it is recommended that a read-only environment be + used only for short periods and for operations that are not performance + critical or memory intensive. With few exceptions, all application + functions that require access to a JE environment should be built into a + single application so that they can be performed in the JVM process + where the environment is open read-write.

            + +

            In most applications, opening an environment read-only can and should + be avoided.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.isReadOnly"BooleanNofalse

            +
            +
            See Also:
            +
            setReadOnly(boolean), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_FAIR_LATCHES

            +
            public static final java.lang.String ENV_FAIR_LATCHES
            +
            If true, use latches instead of synchronized blocks to implement the + lock table and log write mutexes. Latches require that threads queue to + obtain the mutex in question and therefore guarantee that there will be + no mutex starvation, but do incur a performance penalty. Latches should + not be necessary in most cases, so synchronized blocks are the default. + An application that puts heavy load on JE with threads with different + thread priorities might find it useful to use latches. In a Java 5 JVM, + where java.util.concurrent.locks.ReentrantLock is used for the latch + implementation, this parameter will determine whether they are 'fair' or + not. This parameter is 'static' across all environments. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.fairLatches"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_LATCH_TIMEOUT

            +
            public static final java.lang.String ENV_LATCH_TIMEOUT
            +
            The timeout for detecting internal latch timeouts, so that deadlocks can + be detected. Latches are held internally for very short durations. If + due to unforeseen problems a deadlock occurs, a timeout will occur after + the duration specified by this parameter. When a latch timeout occurs: +
              +
            • The Environment is invalidated and must be closed.
            • +
            • An EnvironmentFailureException is thrown.
            • +
            • A full thread dump is logged at level SEVERE.
            • +
            + If this happens, thread dump in je.info file should be preserved so it + can be used to analyze the problem. +

            + Most applications should not change this parameter. The default value, 5 + minutes, should be much longer than a latch is ever held. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.latchTimeout"DurationNo5 min1 ms-none-

            +
            +
            Since:
            +
            6.2
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_TTL_CLOCK_TOLERANCE

            +
            public static final java.lang.String ENV_TTL_CLOCK_TOLERANCE
            +
            The interval added to the system clock time for determining that a + record may have expired. Used when an internal integrity error may be + present, but may also be due to a record that expired and the system + clock was moved back. +

            + For example, say a record expires and then the clock is moved back by + one hour to correct a daylight savings time error. Because the LN and + BIN slot for an expired record are purged separately (see + Time-To_live), in this case the LN was + purged but the BIN slot was not purged. When accessing the record's key + via the BIN slot, it will appear that it is not expired. But then when + accessing the the data, the LN will not be accessible. Normally this + would be considered a fatal integrity error, but since the record will + expire within the 2 hour limit, it is simply treated as an expired + record. +

            + Most applications should not change this parameter. The default value, + two hours, is enough to account for minor clock adjustments or + accidentally setting the clock one hour off. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.ttlClockTolerance"DurationNo2 h1 ms-none-

            +
            +
            Since:
            +
            7.0
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_EXPIRATION_ENABLED

            +
            public static final java.lang.String ENV_EXPIRATION_ENABLED
            +
            If true (the default), expired data is filtered from queries and purged + by the cleaner. This might be set to false to recover data after an + extended down time. +

            + WARNING: Disabling expiration is intended for special-purpose access + for data recovery only. When this parameter is set to false, records + that have expired may or may not have been purged, so they may or may + not be accessible. In addition, it is possible for the key and data of + a record to expire independently, so the key may be accessible (if the + data is not requested by the read operation), while the record will + appear to be deleted when the data is requested. The same thing is + true of primary and secondary records, which are also purged + independently. A record may be accessible by primary key but not + secondary key, and vice-versa. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.expirationEnabled"Booleanyestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_DB_EVICTION

            +
            public static final java.lang.String ENV_DB_EVICTION
            +
            If true, enable eviction of metadata for closed databases. There is + no known benefit to setting this parameter to false. + +

            This param is unlikely to be needed for tuning, but is sometimes + useful for debugging and testing.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.dbEviction"BooleanNotrue

            +
            +
            See Also:
            +
            Cache Statistics: + Debugging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_DUP_CONVERT_PRELOAD_ALL

            +
            public static final java.lang.String ENV_DUP_CONVERT_PRELOAD_ALL
            +
            If true (the default) preload all duplicates databases at once when + upgrading from JE 4.1 and earlier. If false, preload each duplicates + database individually instead. Preloading all databases at once gives a + performance advantage if the JE cache is roughly large enough to contain + the internal nodes for all duplicates databases. Preloading each + database individually gives a performance advantage if the JE cache is + roughly large enough to contain the internal nodes for a single + duplicates database. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.dupConvertPreloadAll"BooleanNotrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ADLER32_CHUNK_SIZE

            +
            public static final java.lang.String ADLER32_CHUNK_SIZE
            +
            By default, JE passes an entire log record to the Adler32 class for + checksumming. This can cause problems with the GC in some cases if the + records are large and there is concurrency. Setting this parameter will + cause JE to pass chunks of the log record to the checksumming class so + that the GC does not block. 0 means do not chunk. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.adler32.chunkSize"IntegerYes001048576 (1M)

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_TOTAL_BUFFER_BYTES

            +
            public static final java.lang.String LOG_TOTAL_BUFFER_BYTES
            +
            The total memory taken by log buffers, in bytes. If 0, use 7% of + je.maxMemory. If 0 and je.sharedCache=true, use 7% divided by N where N + is the number of environments sharing the global cache. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.totalBufferBytes"LongNo06144L-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_NUM_BUFFERS

            +
            public static final java.lang.String LOG_NUM_BUFFERS
            +
            The number of JE log buffers. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.numBuffers"IntegerNo32-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_BUFFER_SIZE

            +
            public static final java.lang.String LOG_BUFFER_SIZE
            +
            The maximum starting size of a JE log buffer. JE silently restricts + this value to be no more than the configured maximum log file size + (je.log.fileMax). + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.bufferSize"IntegerNo1048576 (1M)1024 (1K)-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FAULT_READ_SIZE

            +
            public static final java.lang.String LOG_FAULT_READ_SIZE
            +
            The buffer size for faulting in objects from disk, in bytes. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.faultReadSize"IntegerNo2048 (2K)32-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_ITERATOR_READ_SIZE

            +
            public static final java.lang.String LOG_ITERATOR_READ_SIZE
            +
            The read buffer size for log iterators, which are used when scanning the + log during activities like log cleaning and environment open, in bytes. + This may grow as the system encounters larger log entries. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.iteratorReadSize"IntegerNo8192 (8K)128-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_ITERATOR_MAX_SIZE

            +
            public static final java.lang.String LOG_ITERATOR_MAX_SIZE
            +
            The maximum read buffer size for log iterators, which are used when + scanning the log during activities like log cleaning and environment + open, in bytes. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.iteratorMaxSize"IntegerNo16777216 (16M)128-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FILE_MAX

            +
            public static final java.lang.String LOG_FILE_MAX
            +
            The maximum size of each individual JE log file, in bytes. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.fileMax"LongNo10000000 (10M)1000000 (1M)1073741824 (1G)

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_N_DATA_DIRECTORIES

            +
            public static final java.lang.String LOG_N_DATA_DIRECTORIES
            +
            Deprecated. as of 7.3. This feature is not known to provide benefits + beyond that of a simple RAID configuration, and will be removed in the + next release, which is slated for mid-April, 2017.
            +
            The JE environment can be spread across multiple subdirectories. + Environment subdirectories may be used to spread an environment's .jdb + files over multiple directories, and therefore over multiple disks or + file systems. Environment subdirectories reside in the environment home + directory and are named data001/ through dataNNN/, consecutively, where + NNN is the value of je.log.nDataDirectories. A typical configuration + would be to have each of the dataNNN/ names be symbolic links to actual + directories which each reside on separate file systems or disks. +

            + If 0, all log files (*.jdb) will reside in the environment + home directory passed to the Environment constructor. A non-zero value + indicates the number of environment subdirectories to use for holding the + environment log files. +

            + If data subdirectories are used (i.e. je.log.nDataDirectories > 0), this + parameter must be set when the environment is initially created. + Like the environment home directory, each and every one of the dataNNN/ + subdirectories must also be present and writable. This parameter must + be set to the same value for all subsequent openings of the environment + or an exception will be thrown. +

            + If the set of existing dataNNN/ subdirectories is not equivalent to the + set { 1 ... je.log.nDataDirectories } when the environment is opened, an + EnvironmentFailureException will be thrown, and the Environment will + fail to be opened. +

            + This parameter should be set using the je.properties file rather than + the EnvironmentConfig. If not, JE command line utilities that open the + Environment will throw an exception because they will not know of the + non-zero value of this parameter. +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximumJVM
            "je.log.nDataDirectories"IntegerNo00256

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_CHECKSUM_READ

            +
            public static final java.lang.String LOG_CHECKSUM_READ
            +
            If true, perform a checksum check when reading entries from log. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.log.checksumRead"BooleanNotrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_VERIFY_CHECKSUMS

            +
            public static final java.lang.String LOG_VERIFY_CHECKSUMS
            +
            If true, perform a checksum verification just before and after writing + to the log. This is primarily used for debugging. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.log.verifyChecksums"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_MEM_ONLY

            +
            public static final java.lang.String LOG_MEM_ONLY
            +
            If true, operates in an in-memory test mode without flushing the log to + disk. An environment directory must be specified, but it need not exist + and no files are written. The system operates until it runs out of + memory, at which time an OutOfMemoryError is thrown. Because the entire + log is kept in memory, this mode is normally useful only for testing. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.log.memOnly"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FILE_CACHE_SIZE

            +
            public static final java.lang.String LOG_FILE_CACHE_SIZE
            +
            The size of the file handle cache. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.fileCacheSize"IntegerNo1003-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_DETECT_FILE_DELETE

            +
            public static final java.lang.String LOG_DETECT_FILE_DELETE
            +
            If true, periodically detect unexpected file deletions. Normally all + file deletions should be performed as a result of JE log cleaning. + If an external file deletion is detected, JE assumes this was + accidental. This will cause the environment to be invalidated and + all methods will throw EnvironmentFailureException. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.log.detectFileDelete"BooleanNotrue

            +
            +
            Since:
            +
            7.2
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_DETECT_FILE_DELETE_INTERVAL

            +
            public static final java.lang.String LOG_DETECT_FILE_DELETE_INTERVAL
            +
            The interval used to check for unexpected file deletions. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.detectFileDeleteInterval"DurationNo1000 ms1 msnone

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FSYNC_TIMEOUT

            +
            public static final java.lang.String LOG_FSYNC_TIMEOUT
            +
            The timeout limit for group file sync, in microseconds. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.fsyncTimeout"DurationNo500 ms10 ms24 d

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FSYNC_TIME_LIMIT

            +
            public static final java.lang.String LOG_FSYNC_TIME_LIMIT
            +
            If the time taken by an fsync exceeds this limit, a WARNING level + message is logged. If this parameter set to zero, a message will not be + logged. By default, this parameter is 5 seconds. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.fsyncTimeLimit"DurationNo5 szero30 s

            +
            +
            Since:
            +
            7.0
            +
            See Also:
            +
            EnvironmentStats.getFSyncMaxTime(), +Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_GROUP_COMMIT_INTERVAL

            +
            public static final java.lang.String LOG_GROUP_COMMIT_INTERVAL
            +
            The time interval in nanoseconds during which transactions may be + grouped to amortize the cost of write and/or fsync when a transaction + commits with SyncPolicy#SYNC or SyncPolicy#WRITE_NO_SYNC on the local + machine. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.groupCommitInterval"DurationNo00none

            +
            +
            Since:
            +
            5.0.76
            +
            See Also:
            +
            Time Duration + Properties, +LOG_GROUP_COMMIT_THRESHOLD, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_GROUP_COMMIT_THRESHOLD

            +
            public static final java.lang.String LOG_GROUP_COMMIT_THRESHOLD
            +
            The threshold value impacts the number of transactions that may be + grouped to amortize the cost of write and/or fsync when a + transaction commits with SyncPolicy#SYNC or SyncPolicy#WRITE_NO_SYNC + on the local machine. +

            + Specifying larger values can result in more transactions being grouped + together decreasing average commit times. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.groupCommitThreshold"IntegerNo00-none-
            +

            +
            +
            Since:
            +
            5.0.76
            +
            See Also:
            +
            LOG_GROUP_COMMIT_INTERVAL, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FLUSH_SYNC_INTERVAL

            +
            public static final java.lang.String LOG_FLUSH_SYNC_INTERVAL
            +
            The maximum time interval between committing a transaction with + NO_SYNC or WRITE_NO_SYNC durability, + and making the transaction durable with respect to the storage device. + To provide this guarantee, a JE background thread is used to flush any + data buffered by JE to the file system, and also perform an fsync to + force any data buffered by the file system to the storage device. If + this parameter is set to zero, this JE background task is disabled and + no such guarantee is provided. +

            + Separately, the LOG_FLUSH_NO_SYNC_INTERVAL flushing provides a + guarantee that data is periodically flushed to the file system. To guard + against data loss due to an OS crash (and to improve performance) we + recommend that the file system is configured to periodically flush dirty + pages to the storage device. This parameter, LOG_FLUSH_SYNC_INTERVAL, provides a fallback for flushing to the + storage device, in case the file system is not adequately configured. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.flushSyncInterval" + Duration + Yes20 s0-none-
            +

            +
            +
            Since:
            +
            7.2
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_FLUSH_NO_SYNC_INTERVAL

            +
            public static final java.lang.String LOG_FLUSH_NO_SYNC_INTERVAL
            +
            The maximum time interval between committing a transaction with + NO_SYNC durability, and + making the transaction durable with respect to the file system. To + provide this guarantee, a JE background thread is used to flush any data + buffered by JE to the file system. If this parameter is set to zero, + this JE background task is disabled and no such guarantee is provided. +

            + Frequent periodic flushing to the file system provides improved + durability for NO_SYNC transactions. Without this flushing, if + application write operations stop, then some number of NO_SYNC + transactions would be left in JE memory buffers and would be lost in the + event of a crash. For HA applications, this flushing reduces the + possibility of RollbackProhibitedException. + Note that periodic flushing reduces the time window where a crash can + cause transaction loss and RollbackProhibitedException, but the + window cannot be closed completely when using NO_SYNC durability. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.flushNoSyncInterval" + Duration + Yes5 s0-none-
            +

            +
            +
            Since:
            +
            7.2
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_USE_ODSYNC

            +
            public static final java.lang.String LOG_USE_ODSYNC
            +
            If true (default is false) O_DSYNC is used to open JE log files. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.log.useODSYNC"BooleanNofalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_USE_NIO

            +
            public static final java.lang.String LOG_USE_NIO
            +
            Deprecated. NIO is no longer used by JE and this parameter has no + effect.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_USE_WRITE_QUEUE

            +
            public static final java.lang.String LOG_USE_WRITE_QUEUE
            +
            If true (default is true) the Write Queue is used for file I/O + operations which are blocked by concurrent I/O operations. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.log.useWriteQueue"BooleanNotrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_WRITE_QUEUE_SIZE

            +
            public static final java.lang.String LOG_WRITE_QUEUE_SIZE
            +
            The size of the Write Queue. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.log.writeQueueSize"IntegerNo1MB4KB32MB-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_DIRECT_NIO

            +
            public static final java.lang.String LOG_DIRECT_NIO
            +
            Deprecated. NIO is no longer used by JE and this parameter has no + effect.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOG_CHUNKED_NIO

            +
            public static final java.lang.String LOG_CHUNKED_NIO
            +
            Deprecated. NIO is no longer used by JE and this parameter has no + effect.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_RUN_VERIFIER

            +
            public static final java.lang.String ENV_RUN_VERIFIER
            +
            Whether to run the background verifier. +

            + If true (the default), the verifier runs according to the schedule + given by VERIFY_SCHEDULE. Each time the verifier runs, it + performs checksum verification if the VERIFY_LOG setting is + true and performs Btree verification if the VERIFY_BTREE + setting is true. +

            + When corruption is detected, the Environment will be invalidated and an + EnvironmentFailureException will be thrown. Applications catching this + exception can call the new EnvironmentFailureException.isCorrupted() method to determine whether + corruption was detected. +

            + If isCorrupted returns true, a full restore (an HA NetworkRestore or restore from backup) + should be performed to avoid further problems. The advantage of + performing verification frequently is that a problem may be detected + sooner than it would be otherwise. For HA applications, this means that + the network restore can be done while the other nodes in the group are + up, minimizing exposure to additional failures. +

            + When index corruption is detected, the environment is not invalidated. + Instead, the corrupt index (secondary database) is marked as corrupt + in memory and a warning message is logged. All subsequent access to the + index will throw SecondaryIntegrityException. To correct the + problem, the application may perform a full restore or rebuild the + corrupt index. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.runVerifier"BooleanYestrue

            +
            +
            Since:
            +
            7.3
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_SCHEDULE

            +
            public static final java.lang.String VERIFY_SCHEDULE
            +
            A crontab-format string indicating when to start the background + verifier. +

            + See https://en.wikipedia.org/wiki/Cron#Configuration_file + Note that times and dates are specified in local time, not UTC time. +

            + The data verifier will run at most once per scheduled interval. If the + complete verification (log verification followed by Btree verification) + takes longer than the scheduled interval, then the next verification + will start at the next increment of the interval. For example, if the + default schedule is used (one per day at midnight), and verification + takes 25 hours, then verification will occur once every two + days (48 hours), starting at midnight. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.verifySchedule"StringYes"0 0 * * * (run once a day at midnight, local time)"

            +
            +
            Since:
            +
            7.3
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_LOG

            +
            public static final java.lang.String VERIFY_LOG
            +
            Whether the background verifier should verify checksums in the log, + as if the DbVerifyLog utility were run. +

            + If true, the entire log is read sequentially and verified. The size + of the read buffer is determined by LOG_ITERATOR_READ_SIZE. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.verifyLog"BooleanYestrue

            +
            +
            Since:
            +
            7.3
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_LOG_READ_DELAY

            +
            public static final java.lang.String VERIFY_LOG_READ_DELAY
            +
            The delay between reads during log verification. + A delay between reads is needed to allow other JE components, such as + HA, to make timely progress. +

            + A 100ms delay, the default value, with the read buffer size 131072, i.e. + 128K, for a 1GB file, the total delay time is about 13 minutes. +

            + This parameter applies only to the background + verifier. It does not apply to use of DbVerifyLog. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.verifyLogReadDelay"DurationYes100 ms0 ms10 s

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_BTREE

            +
            public static final java.lang.String VERIFY_BTREE
            +
            Whether the background verifier should perform Btree verification, + as if the DbVerify utility were run. +

            + If true, the Btree of all databases, external and internal, is + verified. The in-memory cache is used for verification and internal + data structures are checked. References to data records (log sequence + numbers, or LSNs) are checked to ensure they do not refer to deleted + files -- this is the most common type of corruption. Additional + checks are performed, depending on the settings for VERIFY_SECONDARIES and VERIFY_DATA_RECORDS. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.verifyBtree"BooleanYestrue

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_SECONDARIES

            +
            public static final java.lang.String VERIFY_SECONDARIES
            +
            Whether to verify secondary index references during Btree verification. +

            + An index record contains a reference to a primary key, and the + verification involves checking that a record for the primary key exists. +

            + Note that secondary index references are verified only for each + SecondaryDatabase (and SecondaryIndex) that is currently + open. The relationship between a secondary and primary database is not + stored persistently, so JE is not aware of the relationship unless the + secondary database has been opened by the application. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.verifySecondaries"BooleanYestrue

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_DATA_RECORDS

            +
            public static final java.lang.String VERIFY_DATA_RECORDS
            +
            Whether to verify data records (leaf nodes, or LNs) during Btree + verification. +

            + Regardless of this parameter's value, the Btree reference to the data + record (the log sequence number, or LSN) is checked to ensure that + it doesn't refer to a file that has been deleted by the JE cleaner -- + this sort of "dangling reference" is the most common type of + corruption. If this parameter value is true, the LN is additionally + fetched from disk (if not in cache) to verify that the LSN refers to + a valid log entry. Because LNs are often not cached, this can cause + expensive random IO, and the default value for this parameter is false + for this reason. Some applications may choose to set this parameter to + true, for example, when using a storage device with fast random + IO (an SSD). +

            + Note that Btree internal nodes (INs) are always fetched from disk + during verification, if they are not in cache, and this can result + in random IO. Verification was implemented with the assumption that + most INs will be in cache. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.env.verifyDataRecords"BooleanYesfalse

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_BTREE_BATCH_SIZE

            +
            public static final java.lang.String VERIFY_BTREE_BATCH_SIZE
            +
            The number of records verified per batch during Btree verification. In order to give database remove/truncate the + opportunity to execute, records are verified in batches and there is + a delay between batches. +

            + This parameter applies only to the background + verifier. It does not apply to use of DbVerify. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.verifyBtreeBatchSize"IntegerYes1000110000

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            VERIFY_BTREE_BATCH_DELAY

            +
            public static final java.lang.String VERIFY_BTREE_BATCH_DELAY
            +
            The delay between batches during Btree + verification. In order to give database remove/truncate the + opportunity to execute, records are verified in batches and there is a delay between batches. +

            + A 10ms delay, the default value, should be enough to allow other + threads to run. A large value, for example 1s, would result in a total + delay of 28 hours when verifying 100m records or 100k batches. +

            + This parameter applies only to the background + verifier. It does not apply to use of DbVerify. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.verifyBtreeBatchDelay"DurationYes10 ms0 ms10 s

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            NODE_MAX_ENTRIES

            +
            public static final java.lang.String NODE_MAX_ENTRIES
            +
            The maximum number of entries in an internal btree node. This can be + set per-database using the DatabaseConfig object. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.nodeMaxEntries"IntegerNo128432767 (32K)

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            TREE_MAX_EMBEDDED_LN

            +
            public static final java.lang.String TREE_MAX_EMBEDDED_LN
            +
            The maximum size (in bytes) of a record's data portion that will cause + the record to be embedded in its parent LN. +

            + Normally, records (key-value pairs) are stored on disk as individual + byte sequences called LNs (leaf nodes) and they are accessed via a + Btree. The nodes of the Btree are called INs (Internal Nodes) and the + INs at the bottom layer of the Btree are called BINs (Bottom Internal + Nodes). Conceptually, each BIN contains an array of slots. A slot + represents an associated data record. Among other things, it stores + the key of the record and the most recent disk address of that record. + Records and INs share the disk space (are stored in the same kind of + files), but LNs are stored separately from BINs, i.e., there is no + clustering or co-location of a BIN and its child LNs. +

            + With embedded LNs, a whole record may be stored inside a BIN (i.e., + a BIN slot may contain both the key and the data portion of a record). + Specifically, a record will be "embedded" if the size (in bytes) of its + data portion is less than or equal to the value of the + TREE_MAX_EMBEDDED_LN configuration parameter. The decision to embed a + record or not is taken on a record-by-record basis. As a result, a BIN + may contain both embedded and non-embedded records. The "embeddedness" + of a record is a dynamic property: a size-changing update may turn a + non-embedded record to an embedded one or vice-versa. +

            + Notice that even though a record may be embedded, when the record is + inserted, updated, or deleted an LN for that record is still generated + and written to disk. This is because LNs also act as log records, + which are needed during recovery and/or transaction abort to undo/redo + operations that are/are-not currently reflected in the BINs. However, + during normal processing, these LNs will never be fetched from disk. +

            + Obviously, embedding records has the performance advantage that no + extra disk read is needed to fetch the record data (i.e., the LN) + during read operations. This is especially true for operations like + cursor scans and for random searches within key ranges whose + containing BINs can fit in the JE cache (in other words when there + is locality of reference). Furthermore, embedded records do not need + to be migrated during cleaning; they are considered obsolete by default, + because they will never be needed again after their containing log file + is deleted. This makes cleaning faster, and more importantly, avoids + the dirtying of the parent BINs, which would otherwise cause even more + cleaning later. +

            + On the other hand, embedded LNs make the BINs larger, which can lead to + more cache eviction of BINs and the associated performance problems. + When eviction does occur, performance can deteriorate as the size of + the data portion of the records grows. This is especially true for + insertion-only workloads. Therefore, increasing the value of + TREE_MAX_EMBEDDED_LN beyond the default value of 16 bytes should be + done "carefully": by considering the kind of workloads that will be run + against BDB-JE and their relative importance and expected response + times, and by running performance tests with both embedded and + non-embedded LNs. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.tree.maxEmbeddedLN"IntegerNo160Integer.MAX_VALUE

            +
            +
            See Also:
            +
            Cache + Statistics: Size Optimizations, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TREE_MAX_DELTA

            +
            public static final java.lang.String TREE_MAX_DELTA
            +
            Deprecated. as of JE 6.0. The TREE_BIN_DELTA param alone now + determines whether a delta is logged.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TREE_BIN_DELTA

            +
            public static final java.lang.String TREE_BIN_DELTA
            +
            If more than this percentage of entries are changed on a BIN, log a a + full version instead of a delta. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.tree.binDelta"IntegerNo25075

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TREE_MIN_MEMORY

            +
            public static final java.lang.String TREE_MIN_MEMORY
            +
            The minimum bytes allocated out of the memory cache to hold Btree data + including internal nodes and record keys and data. If the specified + value is larger than the size initially available in the cache, it will + be truncated to the amount available. + +

            TREE_MIN_MEMORY is the minimum for a single environment. By + default, 500 KB or the size initially available in the cache is used, + whichever is smaller.

            + +

            This param is only likely to be needed for tuning of Environments + with extremely small cache sizes. It is sometimes also useful for + debugging and testing.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.tree.minMemory"LongYes512000 (500K)51200 (50K)-none-

            +
            +
            See Also:
            +
            Cache Statistics: + Debugging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TREE_COMPACT_MAX_KEY_LENGTH

            +
            public static final java.lang.String TREE_COMPACT_MAX_KEY_LENGTH
            +
            Specifies the maximum unprefixed key length for use in the compact + in-memory key representation. + +

            In the Btree, the JE in-memory cache, the default representation for + keys uses a byte array object per key. The per-key object overhead of + this approach ranges from 20 to 32 bytes, depending on the JVM + platform.

            + +

            To reduce memory overhead, a compact representation can instead be + used where keys will be represented inside a single byte array instead + of having one byte array per key. Within the single array, all keys are + assigned a storage size equal to that taken up by the largest key, plus + one byte to hold the actual key length. The use of the fixed size array + reduces Java GC activity as well as memory overhead.

            + +

            In order for the compact representation to reduce memory usage, all + keys in a database, or in a Btree internal node, must be roughly the + same size. The more fully populated the internal node, the more the + savings with this representation since the single byte array is sized to + hold the maximum number of keys in the internal node, regardless of the + actual number of keys that are present.

            + +

            It's worth noting that the storage savings of the compact + representation are realized in addition to the storage benefits of key + prefixing (if it is configured), since the keys stored in the key array + are the smaller key values after the prefix has been stripped, reducing + the length of the key and making it more likely that it's small enough + for this specialized representation. This configuration parameter + (TREE_COMPACT_MAX_KEY_LENGTH) is the maximum key length, not + including the common prefix, for the keys in a Btree internal node + stored using the compact representation. See DatabaseConfig.setKeyPrefixing(boolean).

            + +

            The compact representation is used automatically when both of the + following conditions hold.

            +
              +
            • All keys in a Btree internal node must have an unprefixed length + that is less than or equal to the length specified by this parameter + (TREE_COMPACT_MAX_KEY_LENGTH).
            • +
            • If key lengths vary by large amounts within an internal node, the + wasted space of the fixed length storage may negate the benefits of the + compact representation and cause more memory to be used than with the + default representation. In that case, the default representation will + be used.
            • +
            + +

            If this configuration parameter is set to zero, the compact + representation will not be used.

            + +

            The default value of this configuration parameter is 16 bytes. The + potential drawbacks of specifying a larger length are:

            +
              +
            • Insertion and deletion for larger keys move bytes proportional to + the storage length of the keys.
            • +
            • With the compact representation, all operations create temporary + byte arrays for each key involved in the operation. Larger byte arrays + mean more work for the Java GC, even though these objects are short + lived.
            • +
            + +

            Mutation of the key representation between the default and compact + approaches is automatic on a per-Btree internal node basis. For + example, if a key that exceeds the configured length is added to a node + that uses the compact representation, the node is automatically + mutated to the default representation. A best effort is made to + prevent frequent mutations that could increase Java GC activity.

            + +

            To determine how often the compact representation is used in a + running application, see EnvironmentStats.getNINCompactKeyIN().

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.tree.compactMaxKeyLength"IntegerNo160256

            +
            +
            Since:
            +
            5.0
            +
            See Also:
            +
            DatabaseConfig.setKeyPrefixing(boolean), +EnvironmentStats.getNINCompactKeyIN(), +Cache + Statistics: Size Optimizations, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            COMPRESSOR_WAKEUP_INTERVAL

            +
            public static final java.lang.String COMPRESSOR_WAKEUP_INTERVAL
            +
            The compressor thread wakeup interval in microseconds. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.compressor.wakeupInterval"DurationNo5 s1 s75 min

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            COMPRESSOR_DEADLOCK_RETRY

            +
            public static final java.lang.String COMPRESSOR_DEADLOCK_RETRY
            +
            The number of times to retry a compression run if a deadlock occurs. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.compressor.deadlockRetry"IntegerNo30-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            COMPRESSOR_LOCK_TIMEOUT

            +
            public static final java.lang.String COMPRESSOR_LOCK_TIMEOUT
            +
            The lock timeout for compressor transactions in microseconds. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.compressor.lockTimeout"DurationNo500 ms075 min

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            COMPRESSOR_PURGE_ROOT

            +
            public static final java.lang.String COMPRESSOR_PURGE_ROOT
            +
            Deprecated. as of 3.3.87. Compression of the root node no longer has + any benefit and this feature has been removed. This parameter has no + effect.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_EVICT_BYTES

            +
            public static final java.lang.String EVICTOR_EVICT_BYTES
            +
            When eviction occurs, the evictor will push memory usage to this number + of bytes below MAX_MEMORY. No more than 50% of je.maxMemory + will be evicted per eviction cycle, regardless of this setting. + +

            When using the shared cache feature, the value of this property is + applied the first time the cache is set up. New environments that + join the cache do not alter the cache setting.

            + +

            This parameter impacts + how often background + evictor threads are awoken as well as the size of latency spikes + caused by + critical + eviction.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.evictBytes"LongNo524288 (512K)1024 (1K)-none-

            +
            +
            See Also:
            +
            Cache Statistics: + Eviction, +Cache + Statistics: Critical Eviction, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_NODES_PER_SCAN

            +
            public static final java.lang.String EVICTOR_NODES_PER_SCAN
            +
            Deprecated. as of JE 6.0. This parameter is ignored by the new, more + efficient and more accurate evictor.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_CRITICAL_PERCENTAGE

            +
            public static final java.lang.String EVICTOR_CRITICAL_PERCENTAGE
            +
            At this percentage over the allotted cache, critical eviction will + start. For example, if this parameter is 5, then when the cache size is + 5% over its maximum or 105% full, critical eviction will start. +

            + Critical eviction is eviction performed in application threads as part + of normal database access operations. Background eviction, on the other + hand, is performed in JE evictor threads as well as during log cleaning + and checkpointing. Background eviction is unconditionally started when + the cache size exceeds its maximum. When critical eviction is also + performed (concurrently with background eviction), it helps to ensure + that the cache size does not continue to grow, but can have a negative + impact on operation latency. +

            + By default this parameter is zero, which means that critical eviction + will start as soon as the cache size exceeds its maximum. Some + applications may wish to set this parameter to a non-zero value to + improve operation latency, when eviction is a significant performance + factor and latency requirements are not being satisfied. +

            + When setting this parameter to a non-zero value, for example 5, be sure + to reserve enough heap memory for the cache size to be over its + configured maximum, for example 105% full. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.criticalPercentage"IntegerNo001000

            +
            +
            See Also:
            +
            Cache + Statistics: Critical Eviction, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_DEADLOCK_RETRY

            +
            public static final java.lang.String EVICTOR_DEADLOCK_RETRY
            +
            Deprecated. as of JE 4.1, since the single evictor thread has + been replaced be a more robust thread pool.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_LRU_ONLY

            +
            public static final java.lang.String EVICTOR_LRU_ONLY
            +
            Deprecated. as of JE 6.0. This parameter is ignored by the new, + more efficient and more accurate evictor.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_N_LRU_LISTS

            +
            public static final java.lang.String EVICTOR_N_LRU_LISTS
            +
            The number of LRU lists in the main JE cache. + +

            Ideally, all nodes managed by an LRU eviction policy should appear in + a single LRU list, ordered by the "hotness" of each node. However, + such a list is accessed very frequently by multiple threads, and can + become a synchronization bottleneck. To avoid this problem, the + evictor can employ multiple LRU lists. The nLRULists parameter + specifies the number of LRU lists to be used. Increasing the number + of LRU lists alleviates any potential synchronization bottleneck, but + it also decreases the quality of the LRU approximation.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.nLRULists"IntegerNo4132

            +
            +
            See Also:
            +
            Cache Statistics: LRU List + Contention, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_FORCED_YIELD

            +
            public static final java.lang.String EVICTOR_FORCED_YIELD
            +
            Call Thread.yield() at each check for cache overflow. This potentially + improves GC performance, but little testing has been done and the actual + benefit is unknown. + +

            When using the shared cache feature, the value of this property is + applied the first time the cache is set up. New environments that + join the cache do not alter the cache setting.

            + +

            This param is unlikely to be needed for tuning, but is sometimes + useful for debugging and testing.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.evictor.forcedYield"BooleanNofalse

            +
            +
            See Also:
            +
            Cache Statistics: + Debugging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_CORE_THREADS

            +
            public static final java.lang.String EVICTOR_CORE_THREADS
            +
            The minimum number of threads in the eviction thread pool. +

            + These threads help keep memory usage within cache bounds, offloading + work from application threads. +

            + EVICTOR_CORE_THREADS, EVICTOR_MAX_THREADS and EVICTOR_KEEP_ALIVE are used to configure the core, max and keepalive + attributes for the ThreadPoolExecutor which + implements the eviction thread pool. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.coreThreads"Integeryes10Integer.MAX_VALUE

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_MAX_THREADS

            +
            public static final java.lang.String EVICTOR_MAX_THREADS
            +
            The maximum number of threads in the eviction thread pool. +

            + These threads help keep memory usage within cache bound, offloading work + from application threads. If the eviction thread pool receives more + work, it will allocate up to this number of threads. These threads will + terminate if they are idle for more than the time indicated by EVICTOR_KEEP_ALIVE. +

            + EVICTOR_CORE_THREADS, EVICTOR_MAX_THREADS and EVICTOR_KEEP_ALIVE are used to configure the core, max and keepalive + attributes for the ThreadPoolExecutor which + implements the eviction thread pool. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.maxThreads"Integeryes101Integer.MAX_VALUE

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_KEEP_ALIVE

            +
            public static final java.lang.String EVICTOR_KEEP_ALIVE
            +
            The duration that excess threads in the eviction thread pool will stay + idle; after this period, idle threads will terminate. +

            + EVICTOR_CORE_THREADS, EVICTOR_MAX_THREADS and EVICTOR_KEEP_ALIVE are used to configure the core, max and keepalive + attributes for the ThreadPoolExecutor which + implements the eviction thread pool. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.keepAlive"DurationYes10 min1 s1 d

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            EVICTOR_ALLOW_BIN_DELTAS

            +
            public static final java.lang.String EVICTOR_ALLOW_BIN_DELTAS
            +
            Allow Bottom Internal Nodes (BINs) to be written in a delta format + during eviction. Using a delta format will improve write and log + cleaning performance. There is no known performance benefit to setting + this parameter to false. + +

            This param is unlikely to be needed for tuning, but is sometimes + useful for debugging and testing.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.evictor.allowBinDeltas"BooleanNotrue

            +
            +
            See Also:
            +
            Cache Statistics: + Debugging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            OFFHEAP_EVICT_BYTES

            +
            public static final java.lang.String OFFHEAP_EVICT_BYTES
            +
            The off-heap evictor will attempt to keep memory usage this number of + bytes below MAX_OFF_HEAP_MEMORY. +

            + If this value is too small, memory usage may exceed the maximum and then + "critical eviction" is needed, which will increase operation latency in + the application threads. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.offHeap.evictBytes"LongNo52428800 (50MB)1024 (1K)-none-

            +
            +
            See Also:
            +
            Cache + Statistics: Critical Eviction, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            OFFHEAP_N_LRU_LISTS

            +
            public static final java.lang.String OFFHEAP_N_LRU_LISTS
            +
            The number of LRU lists in the off-heap JE cache. + +

            Ideally, all nodes managed by an LRU eviction policy should appear in + a single LRU list, ordered by the "hotness" of each node. However, + such a list is accessed very frequently by multiple threads, and can + become a synchronization bottleneck. To avoid this problem, the + evictor can employ multiple LRU lists. The nLRULists parameter + specifies the number of LRU lists to be used. Increasing the number + of LRU lists alleviates any potential synchronization bottleneck, but + it also decreases the quality of the LRU approximation.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.evictor.nLRULists"IntegerNo4132

            +
            +
            See Also:
            +
            Cache Statistics: LRU List + Contention, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            OFFHEAP_CHECKSUM

            +
            public static final java.lang.String OFFHEAP_CHECKSUM
            +
            Can be used to add a checksum to each off-heap block when the block is + written, and validate the checksum when the block is read, for debugging + purposes. Setting this param to true adds memory and CPU overhead, and + it should normally be set to false in a production environment. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.offHeap.checksum"BooleanNofalse

            +
            +
            See Also:
            +
            Cache Statistics: + Debugging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            OFFHEAP_CORE_THREADS

            +
            public static final java.lang.String OFFHEAP_CORE_THREADS
            +
            The minimum number of threads in the off-heap eviction thread pool. +

            + These threads help keep memory usage within cache bounds, offloading + work from application threads. +

            + OFFHEAP_CORE_THREADS, OFFHEAP_MAX_THREADS and OFFHEAP_KEEP_ALIVE are used to configure the core, max and keepalive + attributes for the ThreadPoolExecutor which + implements the eviction thread pool. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.offHeap.coreThreads"Integeryes10Integer.MAX_VALUE

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            OFFHEAP_MAX_THREADS

            +
            public static final java.lang.String OFFHEAP_MAX_THREADS
            +
            The maximum number of threads in the off-heap eviction thread pool. +

            + These threads help keep memory usage within cache bound, offloading + work from application threads. If the eviction thread pool receives + more work, it will allocate up to this number of threads. These + threads will terminate if they are idle for more than the time + indicated by OFFHEAP_KEEP_ALIVE. +

            + If the number of threads is too small, memory usage may exceed the + maximum and then "critical eviction" is needed, which will increase + operation latency in the application threads. +

            + OFFHEAP_CORE_THREADS, OFFHEAP_MAX_THREADS and OFFHEAP_KEEP_ALIVE are used to configure the core, max and keepalive + attributes for the ThreadPoolExecutor which + implements the eviction thread pool. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.offHeap.maxThreads"Integeryes31Integer.MAX_VALUE

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            OFFHEAP_KEEP_ALIVE

            +
            public static final java.lang.String OFFHEAP_KEEP_ALIVE
            +
            The duration that excess threads in the off-heap eviction thread pool + will stay idle; after this period, idle threads will terminate. +

            + OFFHEAP_CORE_THREADS, OFFHEAP_MAX_THREADS and OFFHEAP_KEEP_ALIVE are used to configure the core, max and keepalive + attributes for the ThreadPoolExecutor which + implements the eviction thread pool. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.offHeap.keepAlive"DurationYes10 min1 s1 d

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CHECKPOINTER_BYTES_INTERVAL

            +
            public static final java.lang.String CHECKPOINTER_BYTES_INTERVAL
            +
            Ask the checkpointer to run every time we write this many bytes to the + log. If set, supersedes CHECKPOINTER_WAKEUP_INTERVAL. To use + time based checkpointing, set this to 0. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.checkpointer.bytesInterval"LongNo20000000 (20M)0-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CHECKPOINTER_WAKEUP_INTERVAL

            +
            public static final java.lang.String CHECKPOINTER_WAKEUP_INTERVAL
            +
            The checkpointer wakeup interval in microseconds. By default, this + is inactive and we wakeup the checkpointer as a function of the + number of bytes written to the log (CHECKPOINTER_BYTES_INTERVAL). + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.checkpointer.wakeupInterval"DurationNo01 s75 min

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CHECKPOINTER_DEADLOCK_RETRY

            +
            public static final java.lang.String CHECKPOINTER_DEADLOCK_RETRY
            +
            The number of times to retry a checkpoint if it runs into a deadlock. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.checkpointer.deadlockRetry"IntegerNo30-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CHECKPOINTER_HIGH_PRIORITY

            +
            public static final java.lang.String CHECKPOINTER_HIGH_PRIORITY
            +
            If true, the checkpointer uses more resources in order to complete the + checkpoint in a shorter time interval. Btree latches are held and other + threads are blocked for a longer period. When set to true, application + response time may be longer during a checkpoint. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.checkpointer.highPriority"BooleanYesfalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_MIN_UTILIZATION

            +
            public static final java.lang.String CLEANER_MIN_UTILIZATION
            +
            The cleaner will keep the total disk space utilization percentage above + this value. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.minUtilization"IntegerYes50090

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_MIN_FILE_UTILIZATION

            +
            public static final java.lang.String CLEANER_MIN_FILE_UTILIZATION
            +
            A log file will be cleaned if its utilization percentage is below this + value, irrespective of total utilization. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.minFileUtilization"IntegerYes5050

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_BYTES_INTERVAL

            +
            public static final java.lang.String CLEANER_BYTES_INTERVAL
            +
            The cleaner checks disk utilization every time we write this many bytes + to the log. If zero (and by default) it is set to either the LOG_FILE_MAX value divided by four, or to 100 MB, whichever is + smaller. + +

            When overriding the default value, use caution to ensure that the + cleaner is woken frequently enough, so that reserved files are deleted + quickly enough to avoid violating a disk limit.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.bytesInterval"LongYes00-none-

            +
            +
            See Also:
            +
            CLEANER_WAKEUP_INTERVAL, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_WAKEUP_INTERVAL

            +
            public static final java.lang.String CLEANER_WAKEUP_INTERVAL
            +
            The cleaner checks whether cleaning is needed if this interval elapses + without any writing, to handle the case where cleaning or checkpointing + is necessary to reclaim disk space, but writing has stopped. This + addresses the problem that CLEANER_BYTES_INTERVAL may not cause + cleaning, and CHECKPOINTER_BYTES_INTERVAL may not cause + checkpointing, when enough writing has not occurred to exceed these + intervals. + +

            If this parameter is set to zero, the cleaner wakeup interval is + disabled, and cleaning and checkpointing will occur only via CLEANER_BYTES_INTERVAL, CHECKPOINTER_BYTES_INTERVAL, and + CHECKPOINTER_WAKEUP_INTERVAL.

            + +

            For example, if a database were removed or truncated, or large + records were deleted, the amount written to the log may not exceed + CLEANER_BYTES_INTERVAL. If writing were to stop at that point, no + cleaning would occur, if it were not for the wakeup interval.

            + +

            In addition, even when cleaning is performed, a checkpoint is + additionally needed to reclaim disk space. This may not occur if + CHECKPOINTER_BYTES_INTERVAL or + CHECKPOINTER_WAKEUP_INTERVAL does not happen to cause a + checkpoint after write operations have stopped. If files have been + cleaned and a checkpoint is needed to reclaim space, and write + operations have stopped, a checkpoint will be scheduled when the + CLEANER_WAKEUP_INTERVAL elapses. The checkpoint will be performed in the + JE checkpointer thread if it is not disabled, or when + Environment.checkpoint(com.sleepycat.je.CheckpointConfig) is called.

            + +

            In test environments it is fairly common for application writing to + stop, and then to expect cleaning to occur as a result of the last set + of operations. This situation may also arise in production environments, + for example, during repair of an out-of-disk situation.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.wakeupInterval"DurationYes10 s010 h

            +
            +
            Since:
            +
            7.1
            +
            See Also:
            +
            Time Duration + Properties, +CLEANER_BYTES_INTERVAL, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_FETCH_OBSOLETE_SIZE

            +
            public static final java.lang.String CLEANER_FETCH_OBSOLETE_SIZE
            +
            If true, the cleaner will fetch records to determine their size and more + accurately calculate log utilization. Normally when a record is updated + or deleted without first being read (sometimes called a blind + delete/update), the size of the previous version of the record is + unknown and therefore the cleaner's utilization calculations may be + incorrect. Setting this parameter to true will cause a record to be + read during a blind delete/update, in order to determine its size. This + will ensure that the cleaner's utilization calculations are correct, but + will cause more (potentially random) IO. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.cleaner.fetchObsoleteSize"BooleanYesfalse

            +
            +
            See Also:
            +
            CLEANER_ADJUST_UTILIZATION, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_ADJUST_UTILIZATION

            +
            public static final java.lang.String CLEANER_ADJUST_UTILIZATION
            +
            Deprecated. in JE 6.3. Adjustments are no longer needed because LN log + sizes have been stored in the Btree since JE 6.0.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_DEADLOCK_RETRY

            +
            public static final java.lang.String CLEANER_DEADLOCK_RETRY
            +
            The number of times to retry cleaning if a deadlock occurs. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.deadlockRetry"IntegerYes30-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_LOCK_TIMEOUT

            +
            public static final java.lang.String CLEANER_LOCK_TIMEOUT
            +
            The lock timeout for cleaner transactions in microseconds. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.lockTimeout"DurationYes500 ms075 min

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_EXPUNGE

            +
            public static final java.lang.String CLEANER_EXPUNGE
            +
            If true (the default setting), the cleaner deletes log files after + successful cleaning. + + This parameter may be set to false for diagnosing log cleaning problems. + For example, if a bug causes a LOG_FILE_NOT_FOUND exception, when + reproducing the problem it is often necessary to avoid deleting files so + they can be used for diagnosis. When this parameter is false: +
              +
            • + Rather than delete files that are successfully cleaned, the cleaner + renames them. +
            • +
            • + When renaming a file, its extension is changed from ".jdb" to ".del" + and its last modification date is set to the current time. +
            • +
            • + Depending on the setting of the CLEANER_USE_DELETED_DIR + parameter, the file is either renamed in its current data directory + (the default), or moved into the "deleted" sub-directory. +
            • +
            +

            + When this parameter is set to false, disk usage may grow without bounds + and the application is responsible for removing the cleaned files. It + may be necessary to write a script for deleting the least recently + cleaned files when disk usage is low. The .del extension and the last + modification time can be leveraged to write such a script. The "deleted" + sub-directory can be used to avoid granting write or delete permissions + for the main data directory to the script. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.cleaner.expunge"BooleanYestrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_USE_DELETED_DIR

            +
            public static final java.lang.String CLEANER_USE_DELETED_DIR
            +
            When CLEANER_EXPUNGE is false, the CLEANER_USE_DELETED_DIR parameter determines whether successfully + cleaned files are moved to the "deleted" sub-directory. + + CLEANER_USE_DELETED_DIR applies only when CLEANER_EXPUNGE is false. When CLEANER_EXPUNGE is true, + successfully cleaned files are deleted and the CLEANER_USE_DELETED_DIR parameter setting is ignored. +

            + When CLEANER_USE_DELETED_DIR is true (and CLEANER_EXPUNGE is false), the cleaner will move successfully cleaned + data files (".jdb" files) to the "deleted" sub-directory of the + Environment directory, in addition to changing the file extension to + "*.del". In this case, the "deleted" sub-directory must have been + created by the application before opening the Environment. This allows + the application to control permissions on this sub-directory. When + multiple data directories are used (LOG_N_DATA_DIRECTORIES), a + "deleted" sub-directory must be created under each data directory. Note + that File.renameTo(File) is used to move the file, and + this method may or may not support moving the file to a different volume + (when the "deleted" directory is a file system link) on a particular + platform. +

            + When CLEANER_USE_DELETED_DIR is false (and CLEANER_EXPUNGE is false), the cleaner will change the file extension + of successfully cleaned data files from ".jdb" to ".del", but will not + move the files to a different directory. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.cleaner.useDeletedDir"BooleanYesfalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_MIN_AGE

            +
            public static final java.lang.String CLEANER_MIN_AGE
            +
            The minimum age of a file (number of files between it and the active + file) to qualify it for cleaning under any conditions. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.minAge"IntegerYes211000

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_MAX_BATCH_FILES

            +
            public static final java.lang.String CLEANER_MAX_BATCH_FILES
            +
            Deprecated. in 7.0. No longer used because the cleaner no longer has a + backlog.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_READ_SIZE

            +
            public static final java.lang.String CLEANER_READ_SIZE
            +
            The read buffer size for cleaning. If zero (the default), then LOG_ITERATOR_READ_SIZE value is used. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.readSize"IntegerYes0128-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_DETAIL_MAX_MEMORY_PERCENTAGE

            +
            public static final java.lang.String CLEANER_DETAIL_MAX_MEMORY_PERCENTAGE
            +
            Tracking of detailed cleaning information will use no more than this + percentage of the cache. The default value is 2% of MAX_MEMORY. If 0 and SHARED_CACHE is true, use 2% divided by + N where N is the number of environments sharing the global cache. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.detailMaxMemoryPercentage"IntegerYes2190

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_FORCE_CLEAN_FILES

            +
            public static final java.lang.String CLEANER_FORCE_CLEAN_FILES
            +
            Specifies a list of files or file ranges to be cleaned at a time when no + other log cleaning is necessary. This parameter is intended for use in + forcing the cleaning of a large number of log files. File numbers are + in hex and are comma separated or hyphen separated to specify ranges, + e.g.: '9,a,b-d' will clean 5 files. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.cleaner.forceCleanFiles"StringNo""

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_UPGRADE_TO_LOG_VERSION

            +
            public static final java.lang.String CLEANER_UPGRADE_TO_LOG_VERSION
            +
            All log files having a log version prior to the specified version will + be cleaned at a time when no other log cleaning is necessary. Intended + for use in upgrading old format log files forward to the current log + format version, e.g., to take advantage of format improvements; note + that log upgrading is optional. The default value zero (0) specifies + that no upgrading will occur. The value negative one (-1) specifies + upgrading to the current log version. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.upgradeToLogVersion"IntegerNo0-1-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_THREADS

            +
            public static final java.lang.String CLEANER_THREADS
            +
            The number of threads allocated by the cleaner for log file processing. + If the cleaner backlog becomes large, try increasing this value. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.threads"IntegerYes11-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_LOOK_AHEAD_CACHE_SIZE

            +
            public static final java.lang.String CLEANER_LOOK_AHEAD_CACHE_SIZE
            +
            The look ahead cache size for cleaning in bytes. Increasing this value + can reduce the number of Btree lookups. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.cleaner.lookAheadCacheSize"IntegerYes8192 (8K)0-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_FOREGROUND_PROACTIVE_MIGRATION

            +
            public static final java.lang.String CLEANER_FOREGROUND_PROACTIVE_MIGRATION
            +
            Deprecated. This parameter is ignored and proactive migration is no + longer supported due to its negative impact on eviction and Btree + splits. To reduce a cleaner backlog, configure more cleaner threads.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_BACKGROUND_PROACTIVE_MIGRATION

            +
            public static final java.lang.String CLEANER_BACKGROUND_PROACTIVE_MIGRATION
            +
            Deprecated. This parameter is ignored and proactive migration is no + longer supported due to its negative impact on eviction and + checkpointing. To reduce a cleaner backlog, configure more cleaner + threads.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CLEANER_LAZY_MIGRATION

            +
            public static final java.lang.String CLEANER_LAZY_MIGRATION
            +
            Deprecated. This parameter is ignored and lazy migration is no longer + supported due to its negative impact on eviction and checkpointing. + To reduce a cleaner backlog, configure more cleaner threads.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            DOS_PRODUCER_QUEUE_TIMEOUT

            +
            public static final java.lang.String DOS_PRODUCER_QUEUE_TIMEOUT
            +
            The timeout for Disk Ordered Scan producer thread queue offers in + milliseconds. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.diskOrderedScanLockTimeout"DurationYes10 secs075 min

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOCK_N_LOCK_TABLES

            +
            public static final java.lang.String LOCK_N_LOCK_TABLES
            +
            Number of Lock Tables. Set this to a value other than 1 when an + application has multiple threads performing concurrent JE operations. + It should be set to a prime number, and in general not higher than the + number of application threads performing JE operations. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.lock.nLockTables"IntegerNo1132767 (32K)

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOCK_TIMEOUT

            +
            public static final java.lang.String LOCK_TIMEOUT
            +
            Configures the default lock timeout. It may be overridden on a + per-transaction basis by calling + Transaction.setLockTimeout(long, TimeUnit). + +

            A value of zero disables lock timeouts. This is not recommended, even + when the application expects that deadlocks will not occur or will be + easily resolved. A lock timeout is a fall-back that guards against + unexpected "live lock", unresponsive threads, or application failure to + close a cursor or to commit or abort a transaction.

            + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.lock.timeout"DurationNo500 ms075 min

            +
            +
            See Also:
            +
            setLockTimeout(long,TimeUnit), +Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOCK_DEADLOCK_DETECT

            +
            public static final java.lang.String LOCK_DEADLOCK_DETECT
            +
            Whether to perform deadlock detection when a lock conflict occurs. + By default, deadlock detection is enabled (this parameter is true) in + order to reduce thread wait times when there are deadlocks. +

            + Deadlock detection is performed as follows. +

              +
            1. When a lock is requested by a record read or write operation, JE + checks for lock conflicts with another transaction or another + thread performing a non-transactional operation. If there is no + conflict, the lock is acquired and the operation returns + normally.
            2. +
            3. When there is a conflict, JE performs deadlock detection. However, + before performing deadlock detection, JE waits for the + LOCK_DEADLOCK_DETECT_DELAY interval, if it is non-zero. + This delay is useful for avoiding the overhead of deadlock + detection when normal, short-lived contention (not a deadlock) is + the reason for the conflict. If the lock is acquired during the + delay, the thread wakes up and the operation returns + normally.
            4. +
            5. If a deadlock is detected, DeadlockException is thrown in + one of the threads participating in the deadlock, called the + "victim". The victim is chosen at random to prevent a repeated + pattern of deadlocks, called "live lock". A non-victim thread that + detects a deadlock will notify the victim and perform short + delays, waiting for the deadlock to be broken; if the lock is + acquired, the operation returns normally.
            6. +
            7. It is possible for live lock to occur in spite of using random + victim selection. It is also possible that a deadlock is not + broken because the victim thread is unresponsive or the + application fails to close a cursor or to commit or abort a + transaction. In these cases, if the lock or transaction timeout + expires without acquiring the lock, a DeadlockException is + thrown for the last deadlock detected, in the thread that detected + the deadlock. In this case, DeadlockException may be + thrown by more than one thread participating in the deadlock. +
            8. +
            9. When no deadlock is detected, JE waits for the lock or transaction + timeout to expire. If the lock is acquired during this delay, the + thread wakes up and the operation returns normally.
            10. +
            11. When the lock or transaction timeout expires without acquiring the + lock, JE checks for deadlocks one final time. If a deadlock is + detected, DeadlockException is thrown; otherwise, + LockTimeoutException or + TransactionTimeoutExceptionis thrown.
            12. +
            +

            + Deadlock detection may be disabled (by setting this parameter to false) + in applications that are known to be free of deadlocks, and this may + provide a slight performance improvement in certain scenarios. However, + this is not recommended because deadlock-free operation is difficult to + guarantee. If deadlock detection is disabled, JE skips steps 2, 3 and 4 + above. However, deadlock detection is always performed in the last step, + and DeadlockException may be thrown. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.lock.deadlockDetect"BooleanNotrue

            +
            +
            Since:
            +
            7.1
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOCK_DEADLOCK_DETECT_DELAY

            +
            public static final java.lang.String LOCK_DEADLOCK_DETECT_DELAY
            +
            The delay after a lock conflict, before performing deadlock detection. + + This delay is used to avoid the overhead of deadlock detection when + normal contention (not a deadlock) is the reason for the conflict. See + LOCK_DEADLOCK_DETECT for more information. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.lock.deadlockDetectDelay"DurationNo0075 min

            +
            +
            Since:
            +
            7.1
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            LOCK_OLD_LOCK_EXCEPTIONS

            +
            public static final java.lang.String LOCK_OLD_LOCK_EXCEPTIONS
            +
            Deprecated. since JE 6.5; has no effect, as if it were set to false.
            +
            Used in JE releases 3.4 through 6.4 to throw old-style lock exceptions + for compatibility with JE release 3.3 and earlier.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            TXN_SERIALIZABLE_ISOLATION

            +
            public static final java.lang.String TXN_SERIALIZABLE_ISOLATION
            +
            Configures all transactions for this environment to have Serializable + (Degree 3) isolation. By setting Serializable isolation, phantoms will + be prevented. By default transactions provide Repeatable Read + isolation. + + The default is false for the database environment. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.txn.serializableIsolation"BooleanNofalse

            +
            +
            See Also:
            +
            setTxnSerializableIsolation(boolean), +Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            TXN_DEADLOCK_STACK_TRACE

            +
            public static final java.lang.String TXN_DEADLOCK_STACK_TRACE
            +
            Set this parameter to true to add stacktrace information to deadlock + (lock timeout) exception messages. The stack trace will show where each + lock was taken. The default is false, and true should only be used + during debugging because of the added memory/processing cost. This + parameter is 'static' across all environments. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.txn.deadlockStackTrace"BooleanYesfalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TXN_DUMP_LOCKS

            +
            public static final java.lang.String TXN_DUMP_LOCKS
            +
            Dump the lock table when a lock timeout is encountered, for debugging + assistance. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.txn.dumpLocks"BooleanYesfalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_FILE

            +
            public static final java.lang.String TRACE_FILE
            +
            Deprecated. in favor of FILE_LOGGING_LEVEL As of JE 4.0, + use the standard java.util.logging configuration methodologies. To + enable logging output to the je.info files, set + com.sleepycat.je.util.FileHandler.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager. To set the handler level programmatically, + set "com.sleepycat.je.util.FileHandler.level" in the EnvironmentConfig + object.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_CONSOLE

            +
            public static final java.lang.String TRACE_CONSOLE
            +
            Deprecated. in favor of CONSOLE_LOGGING_LEVEL As of JE + 4.0, use the standard java.util.logging configuration + methodologies. To enable console output, set + com.sleepycat.je.util.ConsoleHandler.level = <LEVEL> through + the java.util.logging configuration file, or through the + java.util.logging.LogManager. To set the handler level programmatically, + set "com.sleepycat.je.util.ConsoleHandler.level" in the + EnvironmentConfig object.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_DB

            +
            public static final java.lang.String TRACE_DB
            +
            Deprecated. As of JE 4.0, event tracing to the .jdb files has been + separated from the java.util.logging mechanism. This parameter has + no effect.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_FILE_LIMIT

            +
            public static final java.lang.String TRACE_FILE_LIMIT
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. To set the FileHandler output file size, + set com.sleepycat.je.util.FileHandler.limit = <NUMBER> + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_FILE_COUNT

            +
            public static final java.lang.String TRACE_FILE_COUNT
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. To set the FileHandler output file count, + set com.sleepycat.je.util.FileHandler.count = <NUMBER> + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_LEVEL

            +
            public static final java.lang.String TRACE_LEVEL
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. Set logging levels using class names + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            CONSOLE_LOGGING_LEVEL

            +
            public static final java.lang.String CONSOLE_LOGGING_LEVEL
            +
            Trace messages equal and above this level will be logged to the + console. Value should be one of the predefined + java.util.logging.Level values. +

            + Setting this parameter in the je.properties file or through setConfigParam(java.lang.String, java.lang.String) is analogous to setting + the property in the java.util.logging properties file or MBean. + It is preferred to use the standard java.util.logging mechanisms for + configuring java.util.logging.Handler, but this JE parameter is provided + because the java.util.logging API doesn't provide a method to set + handler levels programmatically. + +

            + + + + + + + +
            NameTypeMutableDefault
            "com.sleepycat.je.util.ConsoleHandler.level"StringNo"OFF"

            +
            +
            See Also:
            +
            Chapter 12. Logging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            FILE_LOGGING_LEVEL

            +
            public static final java.lang.String FILE_LOGGING_LEVEL
            +
            Trace messages equal and above this level will be logged to the je.info + file, which is in the Environment home directory. Value should + be one of the predefined java.util.logging.Level values. +

            + Setting this parameter in the je.properties file or through setConfigParam(java.lang.String, java.lang.String) is analogous to setting + the property in the java.util.logging properties file or MBean. + It is preferred to use the standard java.util.logging mechanisms for + configuring java.util.logging.Handler, but this JE parameter is provided + because the java.util.logging APIs doesn't provide a method to set + handler levels programmatically. + +

            + + + + + + + +
            NameTypeMutableDefault
            "com.sleepycat.je.util.FileHandler.level"StringNo"INFO"

            +
            +
            See Also:
            +
            Chapter 12. Logging, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_LEVEL_LOCK_MANAGER

            +
            public static final java.lang.String TRACE_LEVEL_LOCK_MANAGER
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see locking logging, set + com.sleepycat.je.txn.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_LEVEL_RECOVERY

            +
            public static final java.lang.String TRACE_LEVEL_RECOVERY
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see recovery logging, set + com.sleepycat.je.recovery.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_LEVEL_EVICTOR

            +
            public static final java.lang.String TRACE_LEVEL_EVICTOR
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see evictor logging, set + com.sleepycat.je.evictor.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TRACE_LEVEL_CLEANER

            +
            public static final java.lang.String TRACE_LEVEL_CLEANER
            +
            Deprecated. As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see cleaner logging, set + com.sleepycat.je.cleaner.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            STARTUP_DUMP_THRESHOLD

            +
            public static final java.lang.String STARTUP_DUMP_THRESHOLD
            +
            If environment startup exceeds this duration, startup statistics are + logged and can be found in the je.info file. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.env.startupThreshold"DurationNo5 min0none

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            STATS_COLLECT

            +
            public static final java.lang.String STATS_COLLECT
            +
            If true collect and log statistics. The statistics are logged in CSV + format and written to the log file at a user specified interval. + The logging occurs per-Environment when the Environment is opened + in read/write mode. Statistics are written to a filed named je.stat.csv. + Successively older files are named by adding "0", "1", "2", etc into + the file name. The file name format is je.stat.[version number].csv. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.stats.collect"BooleanYesTrue0none

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            STATS_MAX_FILES

            +
            public static final java.lang.String STATS_MAX_FILES
            +
            Maximum number of statistics log files to retain. The rotating set of + files, as each file reaches a given size limit, is closed, rotated out, + and a new file opened. The name of the log file is je.stat.csv. + Successively older files are named by adding "0", "1", "2", etc into + the file name. The file name format is je.stat.[version number].csv. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.stats.max.files"IntegerYes101-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            STATS_FILE_ROW_COUNT

            +
            public static final java.lang.String STATS_FILE_ROW_COUNT
            +
            Log file maximum row count for Stat collection. When the number of + rows in the statistics file reaches the maximum row count, the file + is closed, rotated out, and a new file opened. The name of the log + file is je.stat.csv. Successively older files are named by adding "0", + "1", "2", etc into the file name. The file name format is + je.stat.[version number].csv. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.stats.file.row.count"IntegerYes14401-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            STATS_COLLECT_INTERVAL

            +
            public static final java.lang.String STATS_COLLECT_INTERVAL
            +
            The duration of the statistics capture interval. Statistics are captured + and written to the log file at this interval. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.stats.collect.interval"DurationYes1 min1 s24 d

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            STATS_FILE_DIRECTORY

            +
            public static final java.lang.String STATS_FILE_DIRECTORY
            +
            The directory to save the statistics log file. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.stats.file.directory"StringNo"NULL-> Environment home directory"

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EnvironmentConfig

            +
            public EnvironmentConfig()
            +
            Creates an EnvironmentConfig initialized with the system default + settings.
            +
          • +
          + + + +
            +
          • +

            EnvironmentConfig

            +
            public EnvironmentConfig(java.util.Properties properties)
            +                  throws java.lang.IllegalArgumentException
            +
            Creates an EnvironmentConfig which includes the properties specified in + the properties parameter.
            +
            +
            Parameters:
            +
            properties - Supported properties are described in this class
            +
            Throws:
            +
            java.lang.IllegalArgumentException - If any properties read from the + properties param are invalid.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setAllowCreate

            +
            public EnvironmentConfig setAllowCreate(boolean allowCreate)
            +
            If true, creates the database environment if it doesn't already exist.
            +
            +
            Parameters:
            +
            allowCreate - If true, the database environment is created if it + doesn't already exist.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getAllowCreate

            +
            public boolean getAllowCreate()
            +
            Returns a flag that specifies if we may create this environment.
            +
            +
            Returns:
            +
            true if we may create this environment.
            +
            +
          • +
          + + + +
            +
          • +

            setLockTimeout

            +
            public EnvironmentConfig setLockTimeout(long timeout,
            +                                        java.util.concurrent.TimeUnit unit)
            +                                 throws java.lang.IllegalArgumentException
            +
            Convenience method for setting LOCK_TIMEOUT.
            +
            +
            Parameters:
            +
            timeout - The lock timeout for all transactional and + non-transactional operations, or zero to disable lock timeouts.
            +
            unit - the TimeUnit of the timeout value. May be null only + if timeout is zero.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the value of timeout is invalid
            +
            See Also:
            +
            LOCK_TIMEOUT, +Transaction.setLockTimeout(long,TimeUnit)
            +
            +
          • +
          + + + +
            +
          • +

            setLockTimeout

            +
            public EnvironmentConfig setLockTimeout(long timeout)
            +                                 throws java.lang.IllegalArgumentException
            +
            Deprecated. as of 4.0, replaced by setLockTimeout(long, + TimeUnit).
            +
            Configures the lock timeout, in microseconds. This method is equivalent + to: + +
            setLockTimeout(long, TimeUnit.MICROSECONDS);
            +
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            +
          • +
          + + + +
            +
          • +

            getLockTimeout

            +
            public long getLockTimeout(java.util.concurrent.TimeUnit unit)
            +
            Returns the lock timeout setting.
            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value. May not be null. + + A value of 0 means no timeout is set.
            +
            +
          • +
          + + + +
            +
          • +

            getLockTimeout

            +
            public long getLockTimeout()
            +
            Deprecated. as of 4.0, replaced by getLockTimeout(TimeUnit).
            +
            Returns the lock timeout setting, in microseconds. This method is + equivalent to: + +
            getLockTimeout(TimeUnit.MICROSECONDS);
            +
          • +
          + + + +
            +
          • +

            setReadOnly

            +
            public EnvironmentConfig setReadOnly(boolean readOnly)
            +
            Convenience method for setting ENV_READ_ONLY.
            +
            +
            Parameters:
            +
            readOnly - If true, configure the database environment to be read + only, and any attempt to modify a database will fail.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getReadOnly

            +
            public boolean getReadOnly()
            +
            Returns true if the database environment is configured to be read only. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the database environment is configured to be read only.
            +
            +
          • +
          + + + +
            +
          • +

            setTransactional

            +
            public EnvironmentConfig setTransactional(boolean transactional)
            +
            Convenience method for setting + ENV_IS_TRANSACTIONAL.
            +
            +
            Parameters:
            +
            transactional - If true, configure the database environment for + transactions.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getTransactional

            +
            public boolean getTransactional()
            +
            Returns true if the database environment is configured for transactions. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the database environment is configured for transactions.
            +
            +
          • +
          + + + +
            +
          • +

            setLocking

            +
            public EnvironmentConfig setLocking(boolean locking)
            +
            Convenience method for setting + ENV_IS_LOCKING.
            +
            +
            Parameters:
            +
            locking - If false, configure the database environment for no + locking. The default is true.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getLocking

            +
            public boolean getLocking()
            +
            Returns true if the database environment is configured for locking. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the database environment is configured for locking.
            +
            +
          • +
          + + + +
            +
          • +

            setTxnTimeout

            +
            public EnvironmentConfig setTxnTimeout(long timeout,
            +                                       java.util.concurrent.TimeUnit unit)
            +                                throws java.lang.IllegalArgumentException
            +
            A convenience method for setting TXN_TIMEOUT.
            +
            +
            Parameters:
            +
            timeout - The transaction timeout. A value of 0 turns off + transaction timeouts.
            +
            unit - the TimeUnit of the timeout value. May be null only + if timeout is zero.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - If the value of timeout is negative
            +
            See Also:
            +
            TXN_TIMEOUT, +Transaction.setTxnTimeout(long, java.util.concurrent.TimeUnit)
            +
            +
          • +
          + + + +
            +
          • +

            setTxnTimeout

            +
            public EnvironmentConfig setTxnTimeout(long timeout)
            +                                throws java.lang.IllegalArgumentException
            +
            Deprecated. as of 4.0, replaced by setTxnTimeout(long, + TimeUnit).
            +
            Configures the transaction timeout, in microseconds. This method is + equivalent to: + +
            setTxnTimeout(long, TimeUnit.MICROSECONDS);
            +
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            +
          • +
          + + + +
            +
          • +

            getTxnTimeout

            +
            public long getTxnTimeout(java.util.concurrent.TimeUnit unit)
            +
            A convenience method for getting TXN_TIMEOUT. + +

            A value of 0 means transaction timeouts are not configured.

            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value. May not be null.
            +
            Returns:
            +
            The transaction timeout.
            +
            +
          • +
          + + + +
            +
          • +

            getTxnTimeout

            +
            public long getTxnTimeout()
            +
            Deprecated. as of 4.0, replaced by getTxnTimeout(TimeUnit).
            +
            Returns the transaction timeout, in microseconds. This method is + equivalent to: + +
            getTxnTimeout(TimeUnit.MICROSECONDS);
            +
          • +
          + + + + + + + +
            +
          • +

            getTxnSerializableIsolation

            +
            public boolean getTxnSerializableIsolation()
            +
            A convenience method for getting + TXN_SERIALIZABLE_ISOLATION.
            +
            +
            Returns:
            +
            true if the environment has been configured to have repeatable + read isolation.
            +
            See Also:
            +
            LockMode
            +
            +
          • +
          + + + +
            +
          • +

            setSharedCache

            +
            public EnvironmentConfig setSharedCache(boolean sharedCache)
            +
            A convenience method for setting the + SHARED_CACHE parameter.
            +
            +
            Parameters:
            +
            sharedCache - If true, the shared cache is used by this + environment.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getSharedCache

            +
            public boolean getSharedCache()
            +
            A convenience method for getting the + SHARED_CACHE parameter.
            +
            +
            Returns:
            +
            true if the shared cache is used by this environment. @see + #setSharedCache
            +
            +
          • +
          + + + +
            +
          • +

            setNodeName

            +
            public EnvironmentConfig setNodeName(java.lang.String nodeName)
            +
            Sets the user defined nodeName for the Environment. If set, exception + messages, logging messages, and thread names will have this nodeName + included in them. If a user has multiple Environments in a single JVM, + setting this to a string unique to each Environment may make it easier + to diagnose certain exception conditions as well as thread dumps.
            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the user defined nodeName for the Environment.
            +
          • +
          + + + +
            +
          • +

            setCustomStats

            +
            public EnvironmentConfig setCustomStats(CustomStats customStats)
            +
            Sets the custom statistics object.
            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getCustomStats

            +
            public CustomStats getCustomStats()
            +
            Gets the custom statstics object.
            +
            +
            Returns:
            +
            customStats
            +
            +
          • +
          + + + +
            +
          • +

            setLoggingHandler

            +
            public EnvironmentConfig setLoggingHandler(java.util.logging.Handler handler)
            +
            Set a java.util.logging.Handler which will be used by all + java.util.logging.Loggers instantiated by this Environment. This lets + the application specify a handler which +
              +
            • requires a constructor with arguments
            • +
            • is specific to this environment, which is important if the + application is using multiple environments within the same process. +
            + Note that Handler is not serializable, and the logging + handler should be set within the same process.
            +
          • +
          + + + +
            +
          • +

            getLoggingHandler

            +
            public java.util.logging.Handler getLoggingHandler()
            +
            Returns the custom java.util.logging.Handler specified by the + application.
            +
          • +
          + + + +
            +
          • +

            setConfigParam

            +
            public EnvironmentConfig setConfigParam(java.lang.String paramName,
            +                                        java.lang.String value)
            +                                 throws java.lang.IllegalArgumentException
            +
            Description copied from class: EnvironmentMutableConfig
            +
            Set this configuration parameter. First validate the value specified for + the configuration parameter; if it is valid, the value is set in the + configuration.
            +
            +
            Overrides:
            +
            setConfigParam in class EnvironmentMutableConfig
            +
            Parameters:
            +
            paramName - the configuration parameter name, one of the String + constants in this class
            +
            value - The configuration value
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the paramName or value is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            setRecoveryProgressListener

            +
            public EnvironmentConfig setRecoveryProgressListener(ProgressListener<RecoveryProgress> progressListener)
            +
            Configure the environment to make periodic calls to a ProgressListener to + provide feedback on environment startup (recovery). The + ProgressListener.progress() method is called at different stages of + the recovery process. See RecoveryProgress for information about + those stages. +

            + When using progress listeners, review the information at ProgressListener.progress(T, long, long) to avoid any unintended disruption to + environment startup.

            +
            +
            Parameters:
            +
            progressListener - The ProgressListener to callback during + environment startup (recovery).
            +
            +
          • +
          + + + +
            +
          • +

            getRecoveryProgressListener

            +
            public ProgressListener<RecoveryProgress> getRecoveryProgressListener()
            +
            Return the ProgressListener to be used at this environment startup.
            +
          • +
          + + + +
            +
          • +

            setClassLoader

            +
            public EnvironmentConfig setClassLoader(java.lang.ClassLoader classLoader)
            +
            Configure the environment to use a specified ClassLoader for loading + user-supplied classes by name.
            +
          • +
          + + + +
            +
          • +

            getClassLoader

            +
            public java.lang.ClassLoader getClassLoader()
            +
            Returns the ClassLoader for loading user-supplied classes by name, or + null if no specified ClassLoader is configured.
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public EnvironmentConfig clone()
            +
            Returns a copy of this configuration object.
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentFailureException.html b/docs/java/com/sleepycat/je/EnvironmentFailureException.html new file mode 100644 index 0000000..f4fc4cb --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentFailureException.html @@ -0,0 +1,389 @@ + + + + + +EnvironmentFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentFailureException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        EnvironmentLockedException, EnvironmentNotFoundException, EnvironmentWedgedException, GroupShutdownException, LogWriteException, RestartRequiredException, ThreadInterruptedException, VersionMismatchException
        +
        +
        +
        +
        public class EnvironmentFailureException
        +extends RunRecoveryException
        +
        Indicates that a failure has occurred that could impact the Environment as a whole. For failures that impact only the current + operation and/or transaction, see OperationFailureException). For + an overview of all exceptions thrown by JE, see DatabaseException. + +

        Depending on the nature of the failure, this exception may indicate that + Environment.close() must be called. The application should catch + EnvironmentFailureException and then call Environment.isValid(). If false is returned, all Environment + handles (instances) must be closed and re-opened in order to run recovery + and continue operating. If true is returned, the Environment can continue operating without being closed and re-opened. + Also note that Environment.isValid() may be called at any time, not + just during exception handling.

        + +

        The use of the Environment.isValid() method allows JE to determine + dynamically whether the failure requires recovery or not, and allows for + this determination to change in future releases. Over time, internal + improvements to error handling may allow more error conditions to be handled + without invalidating the Environment.

        + +

        (Although this exception class extends RunRecoveryException, it + does not always indicate that recovery is necessary, as described above. + RunRecoveryException has been deprecated and EnvironmentFailureException should be used instead.)

        + +

        If an EnvironmentFailureException consistently occurs soon after + opening the Environment, this may indicate a persistent problem. It may + indicate a system problem or a persistent storage problem. In this case, + human intervention is normally required and restoring from a backup may be + necessary.

        + +

        Note that subclasses of EnvironmentFailureException indicate how + to handle the exception in more specific ways.

        +
          +
        • If Thread.interrupt is called for a thread performing JE + operations, a ThreadInterruptedException is thrown. Since + interrupting a thread is intentional, it does not indicate a persistent + problem and human intervention is not normally required. +
        • +
        • If an IOException occurs while writing to the JE log, a + LogWriteException is thrown. Although an IOException can + occur for different reasons, it is a hint that the disk may be full and + applications may wish to attempt recovery after making more disk space + available. +
        • +
        • For replicated environments, see the subclasses of EnvironmentFailureException in the com.sleepycat.je.rep package for + more information. Such exceptions may require special handling. +
        • +
        + +

        If Environment.close() is not called after an EnvironmentFailureException invalidates the Environment, all + subsequent method calls for the Environment will throw the same + exception. This provides more than one opportunity to catch and handle the + specific exception subclass that caused the failure.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetMessage() 
          booleanisCorrupted() +
          Whether the EnvironmentFailureException indicates that the log is + corrupt, meaning that a network restore (or restore from backup) should + be performed.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            isCorrupted

            +
            public boolean isCorrupted()
            +
            Whether the EnvironmentFailureException indicates that the log is + corrupt, meaning that a network restore (or restore from backup) should + be performed. +

            + This method currently returns true only when corruption has been + detected and is persistent. This may have been detected by verifying + checksums in the disk data log, and in this case the corruption + indicates a media/disk failure. The checksum error may have + been detected when accessing data normally via the JE API, or by the + background data verifier (see EnvironmentConfig.VERIFY_LOG). + Or a persistent Btree corruption may have been detected by the data + verifier (see EnvironmentConfig.VERIFY_BTREE) or by the + Environment.verify(VerifyConfig, PrintStream) or + Database.verify(VerifyConfig) methods. This method will + returns true in all such cases. +

            + Additionally, when a persistent corruption is detected and the + Environment is open for read-write access, a marker file named + 7fffffff.jdb is created in the Environment directory that will + prevent re-opening the environment. If an attempt is made to + re-open the Environment, the original EnvironmentFailureException + will be thrown. This is meant to safeguard against using a corrupt + environment when the original exception is accidentally overlooked. + While the marker file can be deleted to allow re-opening the + environment, this is normally unsafe and is not recommended.

            +
            +
            Returns:
            +
            true if the environment is corrupt.
            +
            Since:
            +
            7.3
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentLockedException.html b/docs/java/com/sleepycat/je/EnvironmentLockedException.html new file mode 100644 index 0000000..cf393ea --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentLockedException.html @@ -0,0 +1,260 @@ + + + + + +EnvironmentLockedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentLockedException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class EnvironmentLockedException
        +extends EnvironmentFailureException
        +
        Thrown by the Environment constructor when an environment cannot be + opened for write access because another process has the same environment + open for write access. + +

        Warning: This exception should be handled when an + environment is opened by more than one process.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentMutableConfig.html b/docs/java/com/sleepycat/je/EnvironmentMutableConfig.html new file mode 100644 index 0000000..d51fe76 --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentMutableConfig.html @@ -0,0 +1,875 @@ + + + + + +EnvironmentMutableConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentMutableConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.EnvironmentMutableConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Cloneable
        +
        +
        +
        Direct Known Subclasses:
        +
        EnvironmentConfig
        +
        +
        +
        +
        public class EnvironmentMutableConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable, java.io.Serializable
        +
        Specifies the environment attributes that may be changed after the + environment has been opened. EnvironmentMutableConfig is a parameter to + Environment.setMutableConfig(com.sleepycat.je.EnvironmentMutableConfig) and is returned by Environment.getMutableConfig(). + +

        There are two types of mutable environment properties: per-environment + handle properties, and environment wide properties.

        + +

        Per-Environment Handle Properties

        + +

        Per-environment handle properties apply only to a single Environment + instance. For example, to change the default transaction commit behavior + for a single environment handle, do this:

        + +
        +     // Specify no-sync behavior for a given handle.
        +     EnvironmentMutableConfig mutableConfig = env.getMutableConfig();
        +     mutableConfig.setDurability(Durability.COMMIT_NO_SYNC);
        +     env.setMutableConfig(mutableConfig);
        + 
        + +

        The per-environment handle properties are listed below. These properties + are accessed using the setter and getter methods listed, as shown in the + example above.

        + + + +

        Environment-Wide Mutable Properties

        + +

        Environment-wide mutable properties are those that can be changed for an + environment as a whole, irrespective of which environment instance (for the + same physical environment) is used. For example, to stop the cleaner daemon + thread, do this:

        + +
        +     // Stop the cleaner daemon threads for the environment.
        +     EnvironmentMutableConfig mutableConfig = env.getMutableConfig();
        +     mutableConfig.setConfigParam(EnvironmentConfig.ENV_RUN_CLEANER, "false");
        +     env.setMutableConfig(mutableConfig);
        + 
        + +

        The environment-wide mutable properties are documented as such for each + EnvironmentConfig String constant.

        + +

        Getting the Current Environment Properties

        + + To get the current "live" properties of an environment after constructing it + or changing its properties, you must call Environment.getConfig() or + Environment.getMutableConfig(). The original EnvironmentConfig or + EnvironmentMutableConfig object used to set the properties is not kept up to + date as properties are changed, and does not reflect property validation or + properties that are computed.
        +
        +
        See Also:
        +
        EnvironmentConfig, +Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EnvironmentMutableConfig

            +
            public EnvironmentMutableConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setTxnNoSync

            +
            public EnvironmentMutableConfig setTxnNoSync(boolean noSync)
            + +
            Configures the database environment for asynchronous transactions.
            +
            +
            Parameters:
            +
            noSync - If true, do not write or synchronously flush the log on + transaction commit. This means that transactions exhibit the ACI + (Atomicity, Consistency, and Isolation) properties, but not D + (Durability); that is, database integrity is maintained, but if the JVM + or operating system fails, it is possible some number of the most + recently committed transactions may be undone during recovery. The + number of transactions at risk is governed by how many updates fit into + a log buffer, how often the operating system flushes dirty buffers to + disk, and how often the database environment is checkpointed. + +

            This attribute is false by default for this class and for the + database environment.

            +
            +
          • +
          + + + +
            +
          • +

            getTxnNoSync

            +
            public boolean getTxnNoSync()
            +
            Deprecated. replaced by getDurability()
            +
            Returns true if the database environment is configured for asynchronous + transactions.
            +
            +
            Returns:
            +
            true if the database environment is configured for asynchronous + transactions.
            +
            +
          • +
          + + + +
            +
          • +

            setTxnWriteNoSync

            +
            public EnvironmentMutableConfig setTxnWriteNoSync(boolean writeNoSync)
            + +
            Configures the database environment for transactions which write but do + not flush the log.
            +
            +
            Parameters:
            +
            writeNoSync - If true, write but do not synchronously flush the log + on transaction commit. This means that transactions exhibit the ACI + (Atomicity, Consistency, and Isolation) properties, but not D + (Durability); that is, database integrity is maintained, but if the + operating system fails, it is possible some number of the most recently + committed transactions may be undone during recovery. The number of + transactions at risk is governed by how often the operating system + flushes dirty buffers to disk, and how often the database environment is + checkpointed. + +

            The motivation for this attribute is to provide a transaction that + has more durability than asynchronous (nosync) transactions, but has + higher performance than synchronous transactions.

            + +

            This attribute is false by default for this class and for the + database environment.

            +
            +
          • +
          + + + +
            +
          • +

            getTxnWriteNoSync

            +
            public boolean getTxnWriteNoSync()
            +
            Deprecated. replaced by getDurability()
            +
            Returns true if the database environment is configured for transactions + which write but do not flush the log.
            +
            +
            Returns:
            +
            true if the database environment is configured for transactions + which write but do not flush the log.
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            setCacheSize

            +
            public EnvironmentMutableConfig setCacheSize(long totalBytes)
            +                                      throws java.lang.IllegalArgumentException
            +
            A convenience method for setting EnvironmentConfig.MAX_MEMORY.
            +
            +
            Parameters:
            +
            totalBytes - The memory available to the database system, in bytes.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            See Also:
            +
            EnvironmentConfig.MAX_MEMORY
            +
            +
          • +
          + + + +
            +
          • +

            getCacheSize

            +
            public long getCacheSize()
            +
            Returns the memory available to the database system, in bytes. A valid + value is only available if this EnvironmentConfig object has been + returned from Environment.getConfig().
            +
            +
            Returns:
            +
            The memory available to the database system, in bytes.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getCachePercent

            +
            public int getCachePercent()
            +
            A convenience method for getting EnvironmentConfig.MAX_MEMORY_PERCENT.
            +
            +
            Returns:
            +
            the percentage value used in the JE cache size calculation.
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            setMaxDisk

            +
            public EnvironmentMutableConfig setMaxDisk(long totalBytes)
            +                                    throws java.lang.IllegalArgumentException
            +
            A convenience method for setting EnvironmentConfig.MAX_DISK.
            +
            +
            Parameters:
            +
            totalBytes - is an upper limit on the number of bytes used for + data storage, or zero if no limit is desired.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            See Also:
            +
            EnvironmentConfig.MAX_DISK
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setExceptionListener

            +
            public EnvironmentMutableConfig setExceptionListener(ExceptionListener exceptionListener)
            +
            Sets the exception listener for an Environment. The listener is called + when a daemon thread throws an exception, in order to provide a + notification mechanism for these otherwise asynchronous exceptions. + Daemon thread exceptions are also printed through stderr. +

            + Not all daemon exceptions are fatal, and the application bears + responsibility for choosing how to respond to the notification. Since + exceptions may repeat, the application should also choose how to handle + a spate of exceptions. For example, the application may choose to act + upon each notification, or it may choose to batch up its responses + by implementing the listener so it stores exceptions, and only acts + when a certain number have been received.

            +
            +
            Parameters:
            +
            exceptionListener - the callback to be executed when an exception + occurs.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getExceptionListener

            +
            public ExceptionListener getExceptionListener()
            +
            Returns the exception listener, if set.
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            setConfigParam

            +
            public EnvironmentMutableConfig setConfigParam(java.lang.String paramName,
            +                                               java.lang.String value)
            +                                        throws java.lang.IllegalArgumentException
            +
            Set this configuration parameter. First validate the value specified for + the configuration parameter; if it is valid, the value is set in the + configuration.
            +
            +
            Parameters:
            +
            paramName - the configuration parameter name, one of the String + constants in this class
            +
            value - The configuration value
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the paramName or value is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            getConfigParam

            +
            public java.lang.String getConfigParam(java.lang.String paramName)
            +                                throws java.lang.IllegalArgumentException
            +
            Returns the value for this configuration parameter.
            +
            +
            Parameters:
            +
            paramName - a valid configuration parameter, one of the String + constants in this class.
            +
            Returns:
            +
            the configuration value.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the paramName is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Display configuration values.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentNotFoundException.html b/docs/java/com/sleepycat/je/EnvironmentNotFoundException.html new file mode 100644 index 0000000..2bc9f8c --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentNotFoundException.html @@ -0,0 +1,259 @@ + + + + + +EnvironmentNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentNotFoundException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class EnvironmentNotFoundException
        +extends EnvironmentFailureException
        +
        Thrown by the Environment constructor when EnvironmentConfig + AllowCreate property is false (environment creation is not permitted), but + there are no log files in the environment directory.
        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentStats.html b/docs/java/com/sleepycat/je/EnvironmentStats.html new file mode 100644 index 0000000..de8e28a --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentStats.html @@ -0,0 +1,5941 @@ + + + + + +EnvironmentStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.EnvironmentStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class EnvironmentStats
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Statistics for a single environment. Statistics provide indicators for + system monitoring and performance tuning. + +

        Each statistic has a name and a getter method in this class. For example, + the cacheTotalBytes stat is returned by the getCacheTotalBytes() method. Statistics are categorized into several + groups, for example, cacheTotalBytes is in the Cache + group. Each stat and group has a name and a description.

        + +

        Viewing the statistics through toString() shows the stat names + and values organized by group. Viewing the stats with toStringVerbose() additionally shows the description of each stat and + group.

        + +

        Statistics are periodically output in CSV format to the je.stat.csv file + (see EnvironmentConfig.STATS_COLLECT). The column header in the .csv + file has group:stat format, where 'group' is the group name and + 'stat' is the stat name. In Oracle NoSQL DB, in the addition to the .csv + file, JE stats are output in the .stat files.

        + +

        Stat values may also be obtained via JMX using the JEMonitor mbean. + In Oracle NoSQL DB, JE stats are obtained via a different JMX interface in + JSON format. The JSON format uses property names of the form group_stat where 'group' is the group name and 'stat' is the stat name.

        + +

        The stat groups are listed below. Each group name links to a summary of + the statistics in the group.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Group NameDescription
        "Cache" + "The main cache resides in the Java heap and holds data, keys, Btree internal nodes, locks and JE metadata." +
        "OffHeap" + "The optional off-heap cache resides outside the Java heap and serves as an overflow area for the main cache." +
        "I/O" + "The I/O portion of the append-only storage system includes access to data files and caching of file handles." +
        "Cleaning" + "Log cleaning involves garbage collection of data files in the append-only storage system." +
        "Node Compression" + "Deleted records are removed from Btree internal nodes asynchronously and nodes are deleted when they become empty." +
        "Checkpoints" + "Dirty Btree internal nodes are written to the data log periodically to bound recovery time." +
        "Locks" + "Record locking is used to provide transactional capabilities." +
        "Environment" + "Miscellaneous environment wide statistics." +
        + +

        The following sections describe each group of stats along with some + common strategies for using them for monitoring and performance tuning.

        + +

        Cache Statistics

        + +

        Group Name: "Cache" +
        Description: "The main cache resides in the Java heap and holds data, keys, Btree internal nodes, locks and JE metadata."

        + +

        Group Name: "OffHeap" +
        Description: "The optional off-heap cache resides outside the Java heap and serves as an overflow area for the main cache."

        + +

        The JE cache consists of the main (in-heap) cache and and optional + off-heap cache. The vast majority of the cache is occupied by Btree nodes, + including internal nodes (INs) and leaf nodes (LNs). INs contain record keys + while LNs contain record data.

        + +

        Each IN refers to a configured maximum number of child nodes (EnvironmentConfig.NODE_MAX_ENTRIES). The INs form a Btree of at least 2 + levels. With a large data set the Btree will normally have 4 or 5 levels. + The top level is a single node, the root IN. Levels are numbered from the + bottom up, starting with level 1 for bottom level INs (BINs). Levels are + added at the top when the root IN splits.

        + +

        When an off-heap cache is configured, it serves as an overflow for the + main cache. See EnvironmentConfig.MAX_OFF_HEAP_MEMORY.

        + +

        Cache Statistics: Sizing

        + +

        Operation performance is often directly proportional to how much of the + active data set is cached. BINs and LNs form the vast majority of the cache. + Caching of BINs and LNs have different performance impacts, and behavior + varies depending on whether an off-heap cache is configured and which CacheMode is used.

        + +

        Main cache current usage is indicated by the following stats. Note that + there is currently no stat for the number of LNs in the main cache.

        + + +

        Off-heap cache current usage is indicated by:

        + +

        + +

        A cache miss is considered a miss only when the object is not found in + either cache. Misses often result in file I/O and are a primary indicator + of cache performance. Fetches (access requests) and misses are indicated + by:

        + + +

        When the number of LN misses (nLNsFetchMiss) or the number of + BIN misses (nBINsFetchMiss + nFullBINsMiss) are significant, the + JE cache may be undersized, as discussed below. But note that it is not + practical to correlate the number of fetches and misses directly to + application operations, because LNs are sometimes + embedded, BINs are sometimes + accessed multiple times per operation, and internal Btree accesses are + included in the stat values.

        + +

        Ideally, all BINs and LNs for the active data set should fit in cache so + that operations do not result in fetch misses, which often perform random + read I/O. When this is not practical, which is often the case for large + data sets, the next best thing is to ensure that all BINs fit in cache, + so that an operation will perform at most one random read I/O to fetch + the LN. The DbCacheSize javadoc describes how to size the cache + to ensure that all BINs and/or LNs fit in cache.

        + +

        Normally EnvironmentConfig.MAX_MEMORY_PERCENT determines the JE + cache size as a value relative to the JVM heap size, i.e., the heap size + determines the cache size.

        + +

        For configuring cache size and behavior, see:

        + + +

        When using Oracle NoSQL DB, a sizing exercise and DbCacheSize are + used to determine the cache size needed to hold all BINs in memory. The + memory available to each node is divided between a 32 GB heap for the JVM + process (so that CompressedOops may be used) and the off-heap cache (when + more than 32 GB of memory is available).

        + +

        It is also important not to configured the cache size too large, relative + to the JVM heap size. If there is not enough free space in the heap, Java + GC pauses may become a problem. Increasing the default value for MAX_MEMORY_PERCENT, or setting MAX_MEMORY (which overrides MAX_MEMORY_PERCENT), should be done carefully.

        + +

        Java GC performance may also be improved by using CacheMode.EVICT_LN. Record data sizes should also be kept below 1 MB to + avoid "humongous objects" (see Java GC documentation).

        + +

        When using Oracle NoSQL DB, by default, MAX_MEMORY_PERCENT is + set to 70% and CacheMode.EVICT_LN is used. The LOB (large object) + API is implemented using multiple JE records per LOB where the data size of + each record is 1 MB or less.

        + +

        When a shared cache is configured, the main and off-heap cache may be + shared by multiple JE Environments in a single JVM process. See:

        + + +

        When using Oracle NoSQL DB, the JE shared cache feature is not used + because each node only uses a single JE Environment.

        + +

        Cache Statistics: Size + Optimizations

        + +

        Since a large portion of an IN consists of record keys, JE uses + key prefix compression. + Ideally, key suffixes are small enough to be stored using the compact key format. The + following stat indicates the number of INs using this compact format:

        + + +

        Configuration params impacting key prefixing and the compact key format + are:

        + + +

        Enabling key prefixing for all databases is strongly recommended. When + using Oracle NoSQL DB, key prefixing is always enabled.

        + +

        Another configuration param impacting BIN cache size is TREE_MAX_EMBEDDED_LN. There is currently no stat indicating the number of + embedded LNs. See:

        + + +

        Cache Statistics: Unexpected + Sizes

        + +

        Although the Btree normally occupies the vast majority of the cache, it + is possible that record locks occupy unexpected amounts of cache when + large transactions are used, or when cursors or transactions are left open + due to application bugs. The following stat indicates the amount of cache + used by record locks:

        + + +

        To reduce the amount of memory used for record locks:

        +
          +
        • Use a small number of write operations per transaction. Write + locks are held until the end of a transaction.
        • +
        • For transactions using Serializable isolation or RepeatableRead + isolation (the default), use a small number of read operations per + transaction.
        • +
        • To read large numbers of records, use LockMode.READ_COMMITTED isolation or use a null Transaction (which + implies ReadCommitted). With ReadCommitted isolation, locks are + released after each read operation. Using LockMode.READ_UNCOMMITTED will also avoid record locks, but does not + provide any transactional guarantees.
        • +
        • Ensure that all cursors and transactions are closed + promptly.
        • +
        + +

        Note that the above guidelines are also important for reducing contention + when records are accessed concurrently from multiple threads and + transactions. When using Oracle NoSQL DB, the application should avoid + performing a large number of write operations in a single request. For read + operations, NoSQL DB uses ReadCommitted isolation to avoid accumulation of + locks.

        + +

        Another unexpected use of cache is possible when using a DiskOrderedCursor or when calling Database.count(). The amount of + cache used by these operations is indicated by:

        + + +

        DiskOrderedCursor and Database.count should normally be + explicitly constrained to use a maximum amount of cache memory. See:

        + + +

        Oracle NoSQL DB does not currently use DiskOrderedCursor or + Database.count.

        + +

        Cache Statistics: Eviction

        + +

        Eviction is removal of Btree node from the cache in order to make room + for newly added nodes. See CacheMode for a description of + eviction.

        + +

        Normally eviction is performed via background threads in the eviction + thread pools. Disabling the eviction pool threads is not recommended.

        + + +

        Eviction stats are important indicator of cache efficiency and provide a + deeper understanding of cache behavior. Main cache eviction is indicated + by:

        + + +

        Note that objects evicted from the main cache are moved to the off-heap + cache whenever possible.

        + +

        Off-heap cache eviction is indicated by:

        + + +

        When analyzing Java GC performance, the most relevant stats are NLNsEvicted, NNodesMutated and NNodesEvicted, which all + indicate eviction from the main cache based on LRU. Large values for these + stats indicate that many old generation Java objects are being GC'd, which + is often a cause of GC pauses.

        + +

        Note that CacheMode.EVICT_LN is used or when LNs are embedded, NLNsEvicted will + be close to zero because LNs are not evicted based on LRU. And if an + off-heap cache is configured, NNodesMutated will be close to zero + because BIN mutation takes place in the off-heap cache. If any of the three + values are large, this points to a potential GC performance problem. The GC + logs should be consulted to confirm this.

        + +

        Large values for NDirtyNodesEvicted or OffHeapDirtyNodesEvicted indicate that the cache is severely undersized and + there is a risk of using all available disk space and severe performance + problems. Dirty nodes are evicted last (after evicting all non-dirty nodes) + because they must be written to disk. This causes excessive writing and JE + log cleaning may be unproductive.

        + +

        Note that when an off-heap cache is configured, NDirtyNodesEvicted will be zero because dirty nodes in the main cache are + moved to the off-heap cache if they don't fit in the main cache, and are + evicted completely and written to disk only when they don't fit in the + off-heap cache.

        + +

        Another type of eviction tuning for the main cache involves changing the + number of bytes evicted each time an evictor thread is awoken:

        + + +

        If the number of bytes is too large, it may cause a noticeable spike in + eviction activity, reducing resources available to other threads. If the + number of bytes is too small, the overhead of waking the evictor threads + more often may be noticeable. The default values for this parameter is + generally a good compromise. This parameter also impacts critical eviction, + which is described next.

        + +

        Note that the corresponding parameter for the off-heap cache, EnvironmentConfig.OFFHEAP_EVICT_BYTES, works differently and is described + in the next section.

        + +

        Cache Statistics: Critical + Eviction

        + +

        The following stats indicate that critical eviction is occurring:

        + + +

        Eviction is performed by eviction pool threads, calls to Environment.evictMemory() in application background threads, or via CacheMode.EVICT_LN or CacheMode.EVICT_BIN. If these mechanisms are + not sufficient to evict memory from cache as quickly as CRUD operations are + adding memory to cache, then critical eviction comes into play. Critical + eviction is performed in-line in the thread performing the CRUD operation, + which is very undesirable since it increases operation latency.

        + +

        Critical eviction in the main cache is indicated by large values for + NBytesEvictedCritical, as compared to the other NBytesEvictedXXX stats. Critical eviction in the off-heap cache is + indicated by large values for OffHeapCriticalNodesTargeted compared + to OffHeapNodesTargeted.

        + +

        Additional stats indicating that background eviction threads may be + insufficient are:

        + + +

        Critical eviction can sometimes be reduced by changing EnvironmentConfig.EVICTOR_CRITICAL_PERCENTAGE or modifying the eviction + thread pool parameters.

        + + +

        When using Oracle NoSQL DB, EVICTOR_CRITICAL_PERCENTAGE is set to + 20% rather than using the JE default of 0%.

        + +

        In the main cache, critical eviction uses the same parameter as + background eviction for determining how many bytes to evict at one + time:

        + + +

        Be careful when increasing this value, since this will cause longer + operation latencies when critical eviction is occurring in the main + cache.

        + +

        The corresponding parameter for the off-heap cache, OFFHEAP_EVICT_BYTES, works differently:

        + + +

        Unlike in the main cache, OFFHEAP_EVICT_BYTES defines the goal + for background eviction to be below MAX_OFF_HEAP_MEMORY. The + background evictor threads for the off-heap cache attempt to maintain the + size of the off-heap cache at MAX_OFF_HEAP_MEMORY - + OFFHEAP_EVICT_BYTES. If the off-heap cache size grows larger than MAX_OFF_HEAP_MEMORY, critical off-heap eviction will occur. The default + value for OFFHEAP_EVICT_BYTES is fairly large to ensure that + critical eviction does not occur. Be careful when lowering this value.

        + +

        This approach is intended to prevent the off-heap cache from exceeding + its maximum size. If the maximum is exceeded, there is a danger that the + JVM process will be killed by the OS. See getOffHeapAllocFailures().

        + +

        Cache Statistics: LRU List + Contention

        + +

        Another common tuning issue involves thread contention on the cache LRU + lists, although there is no stat to indicate such contention. Since each + time a node is accessed it must be moved to the end of the LRU list, a + single LRU list would cause contention among threads performing CRUD + operations. By default there are 4 LRU lists for each cache. If contention + is noticeable on internal Evictor.LRUList or OffHeapCache.LRUList methods, + consider increasing the number of LRU lists:

        + + +

        However, note that increasing the number of LRU lists will decrease the + accuracy of the LRU.

        + +

        Cache Statistics: Debugging

        + +

        The following cache stats are unlikely to be needed for monitoring or + tuning, but are sometimes useful for debugging and testing.

        + + +

        Likewise, the following cache configuration params are unlikely to be + needed for tuning, but are sometimes useful for debugging and testing.

        + + +
        +
        +
        See Also:
        +
        Viewing + Statistics with JConsole, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          longgetActiveLogSize() +
          "Bytes used by all active data files: files required for basic JE operation."
          +
          longgetAdminBytes() +
          "Number of bytes of JE main cache used for cleaner and checkpointer metadata, in bytes."
          +
          longgetAvailableLogSize() +
          "Bytes available for write operations when unprotected reserved files are deleted: free space + reservedLogSize - protectedLogSize."
          +
          longgetAvgBatchCacheMode() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetAvgBatchCritical() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetAvgBatchDaemon() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetAvgBatchEvictorThread() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetAvgBatchManual() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetBufferBytes() +
          The total memory currently consumed by log buffers, in bytes.
          +
          longgetCacheDataBytes() +
          Deprecated.  +
          Please use getDataBytes() to get the amount of cache + used for data and use getAdminBytes(), getLockBytes() and + getBufferBytes() to get other components of the total cache usage + (getCacheTotalBytes()).
          +
          +
          longgetCacheTotalBytes() +
          "Total amount of JE main cache in use, in bytes."
          +
          intgetCleanerBacklog() +
          Deprecated.  +
          in 7.0, always returns zero. Use getCurrentMinUtilization() and getCurrentMaxUtilization() to + monitor cleaner behavior.
          +
          +
          floatgetCorrectedAvgLNSize() +
          Deprecated.  +
          in JE 5.0.56, use getCorrectedAvgLNSize() instead.
          +
          +
          intgetCurrentMaxUtilization() +
          "The current maximum (upper bound) log utilization as a percentage."
          +
          intgetCurrentMinUtilization() +
          "The current minimum (lower bound) log utilization as a percentage."
          +
          longgetCursorsBins() +
          The number of BINs encountered by the INCompressor that had cursors + referring to them when the compressor ran.
          +
          longgetDataAdminBytes() +
          "Amount of JE main cache used for holding per-database cleaner utilization metadata, in bytes."
          +
          longgetDataBytes() +
          "Amount of JE main cache used for holding data, keys and internal Btree nodes, in bytes."
          +
          longgetDbClosedBins() +
          The number of BINs encountered by the INCompressor that had their + database closed between the time they were put on the compressor queue + and when the compressor ran.
          +
          longgetDirtyLRUSize() +
          "Number of INs in the dirty/priority-2 LRU "
          +
          longgetDOSBytes() +
          "Amount of JE main cache consumed by disk-ordered cursor and Database.count operations, in bytes."
          +
          longgetEndOfLog() +
          The location of the next entry to be written to the log.
          +
          longgetEnvironmentCreationTime() +
          The time the Environment was created.
          +
          floatgetEstimatedAvgLNSize() +
          Deprecated.  +
          in JE 5.0.56, use getCorrectedAvgLNSize() instead.
          +
          +
          intgetFileDeletionBacklog() +
          Deprecated.  +
          in 7.5, always returns zero. Use getProtectedLogSize() getProtectedLogSizeMap() to monitor + file protection.
          +
          +
          longgetFSyncMaxTime() +
          The maximum number of milliseconds used to perform a single fsync.
          +
          longgetFSyncTime() +
          The total number of milliseconds used to perform fsyncs.
          +
          longgetInCompQueueSize() +
          The number of entries in the INCompressor queue when the getStats() + call was made.
          +
          longgetLastCheckpointEnd() +
          The location in the log of the last checkpoint end.
          +
          longgetLastCheckpointId() +
          The Id of the last checkpoint.
          +
          longgetLastCheckpointInterval() +
          Byte length from last checkpoint start to the previous checkpoint start.
          +
          longgetLastCheckpointStart() +
          The location in the log of the last checkpoint start.
          +
          intgetLastKnownUtilization() +
          Deprecated.  + +
          +
          floatgetLNSizeCorrectionFactor() +
          Deprecated.  +
          in JE 6.3. Adjustments are no longer needed because LN log + sizes have been stored in the Btree since JE 6.0.
          +
          +
          longgetLockBytes() +
          "Number of bytes of JE cache used for holding locks and transactions, in bytes."
          +
          longgetMixedLRUSize() +
          "Number of INs in the mixed/priority-1 LRU "
          +
          intgetNAcquiresNoWaiters() +
          Number of acquires of lock table latch with no contention.
          +
          intgetNAcquiresNoWaitSuccessful() +
          Number of successful no-wait acquires of the lock table latch.
          +
          intgetNAcquiresNoWaitUnSuccessful() +
          Number of unsuccessful no-wait acquires of the lock table latch.
          +
          intgetNAcquiresSelfOwned() +
          Number of acquires of lock table latch when it was already owned + by the caller.
          +
          intgetNAcquiresWithContention() +
          Number of acquires of lock table latch when it was already owned by + another thread.
          +
          longgetNBatchesCacheMode() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBatchesCritical() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBatchesDaemon() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBatchesEvictorThread() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBatchesManual() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBINDeltaBlindOps() +
          "The number of operations performed blindly in BIN deltas"
          +
          longgetNBinDeltaDeleteOps() +
          The number of user (non-internal) Cursor and Database delete operations + performed in BIN deltas.
          +
          longgetNBinDeltaGetOps() +
          The number of user (non-internal) Cursor and Database get operations + performed in BIN deltas.
          +
          longgetNBinDeltaInsertOps() +
          The number of user (non-internal) Cursor and Database insert operations + performed in BIN deltas (these are insertions performed via the various + put methods).
          +
          longgetNBINDeltasCleaned() +
          "Accumulated number of BIN-deltas cleaned."
          +
          longgetNBINDeltasDead() +
          "Accumulated number of BIN-deltas that were not found in the tree anymore (deleted)."
          +
          longgetNBINDeltasFetchMiss() +
          "Number of BIN-deltas (partial BINs) fetched to satisfy btree operations that were not in main cache."
          +
          longgetNBINDeltasMigrated() +
          "Accumulated number of BIN-deltas migrated."
          +
          longgetNBINDeltasObsolete() +
          "Accumulated number of BIN-deltas obsolete."
          +
          longgetNBinDeltaUpdateOps() +
          The number of user (non-internal) Cursor and Database update operations + performed in BIN deltas (these are updates performed via the various + put methods).
          +
          longgetNBINsEvictedCacheMode() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBINsEvictedCritical() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBINsEvictedDaemon() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBINsEvictedEvictorThread() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBINsEvictedManual() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNBINsFetch() +
          "Number of BINs (bottom internal nodes) and BIN-deltas requested by btree operations."
          +
          longgetNBINsFetchMiss() +
          "Number of full BINs (bottom internal nodes) and BIN-deltas fetched to satisfy btree operations that were not in main cache."
          +
          floatgetNBINsFetchMissRatio() +
          "The BIN fetch miss ratio (nBINsFetchMiss / nBINsFetch)"
          +
          longgetNBINsMutated() +
          Deprecated.  +
          Use getNNodesMutated() instead.
          +
          +
          longgetNBINsStripped() +
          Deprecated.  +
          Use getNNodesStripped() instead.
          +
          +
          longgetNBytesEvictedCacheMode() +
          "Number of bytes evicted by operations for which CacheMode.EVICT_BIN is specified."
          +
          longgetNBytesEvictedCritical() +
          "Number of bytes evicted in the application thread because the cache is over budget."
          +
          longgetNBytesEvictedDeamon() +
          "Number of bytes evicted by JE deamon threads."
          +
          longgetNBytesEvictedEvictorThread() +
          "Number of bytes evicted by evictor pool threads."
          +
          longgetNBytesEvictedManual() +
          "Number of bytes evicted by the Environment.evictMemory or during Environment startup."
          +
          longgetNBytesReadFromWriteQueue() +
          The number of bytes read to fulfill file read operations by reading out + of the pending write queue.
          +
          longgetNBytesWrittenFromWriteQueue() +
          The number of bytes written from the pending write queue.
          +
          longgetNCachedBINDeltas() +
          "Number of BIN-deltas (partial BINs) in main cache. This is a subset of the nCachedBINs value."
          +
          longgetNCachedBINs() +
          "Number of BINs (bottom internal nodes) and BIN-deltas in main cache."
          +
          longgetNCachedUpperINs() +
          "Number of upper INs (non-bottom internal nodes) in main cache."
          +
          longgetNCacheMiss() +
          The total number of requests for database objects which were not in + memory.
          +
          longgetNCheckpoints() +
          The total number of checkpoints run so far.
          +
          longgetNCleanerDeletions() +
          "Number of cleaner file deletions."
          +
          longgetNCleanerDiskRead() +
          "Number of disk reads by the cleaner."
          +
          longgetNCleanerEntriesRead() +
          "Accumulated number of log entries read by the cleaner."
          +
          longgetNCleanerProbeRuns() +
          Deprecated.  +
          in JE 6.3, always returns zero.
          +
          +
          longgetNCleanerRevisalRuns() +
          "Number of cleaner runs that ended in revising expiration info, but not in any cleaning."
          +
          longgetNCleanerRuns() +
          "Number of cleaner runs, including two-pass runs."
          +
          longgetNCleanerTwoPassRuns() +
          "Number of cleaner two-pass runs."
          +
          longgetNClusterLNsProcessed() +
          "Accumulated number of LNs processed because they qualify for clustering."
          +
          longgetNDeltaINFlush() +
          The accumulated number of Delta INs flushed to the log.
          +
          longgetNDirtyNodesEvicted() +
          "Number of dirty target nodes logged and evicted."
          +
          longgetNEvictionRuns() +
          "Number of times the background eviction thread is awoken."
          +
          longgetNEvictPasses() +
          Deprecated.  +
          Use getNEvictionRuns() instead.
          +
          +
          intgetNFileOpens() +
          The number of times a log file has been opened.
          +
          longgetNFSyncRequests() +
          The number of fsyncs requested through the group commit manager.
          +
          longgetNFSyncs() +
          The number of fsyncs issued through the group commit manager.
          +
          longgetNFSyncTimeouts() +
          The number of fsync requests submitted to the group commit manager which + timed out.
          +
          longgetNFullBINFlush() +
          The accumulated number of full BINs flushed to the log.
          +
          longgetNFullBINsMiss() +
          "Number of times a BIN-delta had to be mutated to a full BIN (and as a result a full BIN had to be read in from the log)."
          +
          longgetNFullINFlush() +
          The accumulated number of full INs flushed to the log.
          +
          longgetNINCompactKeyIN() +
          "Number of INs that use a compact key representation to minimize the key object representation overhead."
          +
          longgetNINNoTarget() +
          "Number of INs that use a compact representation when none of its child nodes are in the main cache."
          +
          longgetNINsCleaned() +
          "Accumulated number of INs cleaned."
          +
          longgetNINsDead() +
          "Accumulated number of INs that were not found in the tree anymore (deleted)."
          +
          longgetNINsMigrated() +
          "Accumulated number of INs migrated."
          +
          longgetNINsObsolete() +
          "Accumulated number of INs obsolete."
          +
          longgetNINSparseTarget() +
          "Number of INs that use a compact sparse array representation to point to child nodes in the main cache."
          +
          longgetNLNQueueHits() +
          "Accumulated number of LNs processed without a tree lookup."
          +
          longgetNLNsCleaned() +
          "Accumulated number of LNs cleaned."
          +
          longgetNLNsDead() +
          "Accumulated number of LNs that were not found in the tree anymore (deleted)."
          +
          longgetNLNsEvicted() +
          "Number of LNs evicted as a result of LRU-based eviction (but not CacheMode.EVICT_LN)."
          +
          longgetNLNsExpired() +
          "Accumulated number of obsolete LNs that were expired."
          +
          longgetNLNsFetch() +
          "Number of LNs (data records) requested by btree operations."
          +
          longgetNLNsFetchMiss() +
          "Number of LNs (data records) requested by btree operations that were not in main cache."
          +
          longgetNLNsLocked() +
          "Accumulated number of LNs encountered that were locked."
          +
          longgetNLNsMarked() +
          "Accumulated number of LNs in temporary DBs that were dirtied by the cleaner and subsequently logging during checkpoint/eviction."
          +
          longgetNLNsMigrated() +
          "Accumulated number of LNs that were migrated forward in the log by the cleaner."
          +
          longgetNLNsObsolete() +
          "Accumulated number of LNs obsolete."
          +
          intgetNLogBuffers() +
          The number of log buffers currently instantiated.
          +
          longgetNLogFSyncs() +
          The total number of fsyncs of the JE log.
          +
          longgetNMarkedLNsProcessed() +
          "Accumulated number of LNs processed because they were previously marked for migration."
          +
          longgetNNodesEvicted() +
          "Number of target nodes (INs) evicted from the main cache."
          +
          longgetNNodesExplicitlyEvicted() +
          Deprecated.  +
          Use getNNodesEvicted() instead.
          +
          +
          longgetNNodesMovedToDirtyLRU() +
          "Number of nodes (INs) moved from the mixed/priority-1 to the dirty/priority-2 LRU list."
          +
          longgetNNodesMutated() +
          "Number of target BINs mutated to BIN-deltas."
          +
          longgetNNodesPutBack() +
          "Number of target nodes (INs) moved to the cold end of the LRU list without any action taken on them."
          +
          longgetNNodesScanned() +
          Deprecated.  +
          This statistic has no meaning after the implementation + of the new evictor in JE 6.0. The method returns 0 always.
          +
          +
          longgetNNodesSelected() +
          Deprecated.  +
          use getNNodesTargeted() instead.
          +
          +
          longgetNNodesSkipped() +
          "Number of nodes (INs) that did not require any action."
          +
          longgetNNodesStripped() +
          "Number of target BINs whose child LNs were evicted (stripped)."
          +
          longgetNNodesTargeted() +
          "Number of nodes (INs) selected as eviction targets."
          +
          longgetNNotResident() +
          The number of requests for database objects not contained within the + in memory data structures.
          +
          longgetNonEmptyBins() +
          The number of BINs encountered by the INCompressor that were not + actually empty when the compressor ran.
          +
          intgetNOpenFiles() +
          The number of files currently open in the file cache.
          +
          intgetNOwners() +
          Total lock owners in lock table.
          +
          longgetNPendingLNsLocked() +
          "Accumulated number of pending LNs that could not be locked for migration because of a long duration application lock."
          +
          longgetNPendingLNsProcessed() +
          "Accumulated number of LNs processed because they were previously locked."
          +
          longgetNRandomReadBytes() +
          The number of bytes read which required repositioning the disk head + more than 1MB from the previous file position.
          +
          longgetNRandomReads() +
          The number of disk reads which required repositioning the disk head + more than 1MB from the previous file position.
          +
          longgetNRandomWriteBytes() +
          The number of bytes written which required repositioning the disk head + more than 1MB from the previous file position.
          +
          longgetNRandomWrites() +
          The number of disk writes which required repositioning the disk head by + more than 1MB from the previous file position.
          +
          intgetNReadLocks() +
          Total read locks currently held.
          +
          longgetNReadsFromWriteQueue() +
          The number of file read operations which were fulfilled by reading out + of the pending write queue.
          +
          intgetNReleases() +
          Number of releases of the lock table latch.
          +
          longgetNRepeatFaultReads() +
          The number of reads which had to be repeated when faulting in an object + from disk because the read chunk size controlled by je.log.faultReadSize + is too small.
          +
          longgetNRepeatIteratorReads() +
          "Number of attempts to read a log entry larger than the read buffer size during which the log buffer couldn\'t be grown enough to accommodate the object."
          +
          longgetNRequests() +
          Total number of lock requests to date.
          +
          longgetNRootNodesEvicted() +
          "Number of database root nodes (INs) evicted."
          +
          longgetNSequentialReadBytes() +
          The number of bytes read which did not require repositioning the disk + head more than 1MB from the previous file position.
          +
          longgetNSequentialReads() +
          The number of disk reads which did not require repositioning the disk + head more than 1MB from the previous file position.
          +
          longgetNSequentialWriteBytes() +
          The number of bytes written which did not require repositioning the + disk head more than 1MB from the previous file position.
          +
          longgetNSequentialWrites() +
          The number of disk writes which did not require repositioning the disk + head by more than 1MB from the previous file position.
          +
          intgetNSharedCacheEnvironments() +
          "Number of Environments sharing the main cache."
          +
          longgetNTempBufferWrites() +
          The number of writes which had to be completed using the temporary + marshalling buffer because the fixed size log buffers specified by + je.log.totalBufferBytes and je.log.numBuffers were not large enough.
          +
          longgetNThreadUnavailable() +
          "Number of eviction tasks that were submitted to the background evictor pool, but were refused because all eviction threads were busy."
          +
          longgetNToBeCleanedLNsProcessed() +
          "Accumulated number of LNs processed because they are soon to be cleaned."
          +
          intgetNTotalLocks() +
          Total locks currently in lock table.
          +
          longgetNUpperINsEvictedCacheMode() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNUpperINsEvictedCritical() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNUpperINsEvictedDaemon() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNUpperINsEvictedEvictorThread() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNUpperINsEvictedManual() +
          Deprecated.  +
          This statistic has been removed. The method returns 0 + always.
          +
          +
          longgetNUpperINsFetch() +
          "Number of Upper INs (non-bottom internal nodes) requested by btree operations."
          +
          longgetNUpperINsFetchMiss() +
          "Number of Upper INs (non-bottom internal nodes) requested by btree operations that were not in main cache."
          +
          intgetNWaiters() +
          Total transactions waiting for locks.
          +
          longgetNWaits() +
          Total number of lock waits to date.
          +
          intgetNWriteLocks() +
          Total write locks currently held.
          +
          longgetNWriteQueueOverflow() +
          The number of writes operations which would overflow the Write Queue.
          +
          longgetNWriteQueueOverflowFailures() +
          The number of writes operations which would overflow the Write Queue + and could not be queued.
          +
          longgetNWritesFromWriteQueue() +
          The number of file writes operations executed from the pending write + queue.
          +
          longgetOffHeapAllocFailures() +
          "Number of off-heap allocation failures due to lack of system memory."
          +
          longgetOffHeapAllocOverflows() +
          "Number of off-heap allocation attempts that exceeded the cache size."
          +
          longgetOffHeapBINsLoaded() +
          "Number of BINs loaded from the off-heap cache."
          +
          longgetOffHeapBINsStored() +
          "Number of BINs stored into the off-heap cache."
          +
          intgetOffHeapCachedBINDeltas() +
          "Number of BIN-deltas residing in the off-heap cache."
          +
          intgetOffHeapCachedBINs() +
          "Number of BINs (full BINs and BIN-deltas) residing in the off-heap cache."
          +
          intgetOffHeapCachedLNs() +
          "Number of LNs residing in the off-heap cache."
          +
          longgetOffHeapCriticalNodesTargeted() +
          "Number of nodes targeted in \'critical eviction\' mode."
          +
          longgetOffHeapDirtyNodesEvicted() +
          "Number of target BINs evicted from the off-heap cache that were dirty and therefore were logged."
          +
          longgetOffHeapLNsEvicted() +
          "Number of LNs evicted from the off-heap cache as a result of BIN stripping."
          +
          longgetOffHeapLNsLoaded() +
          "Number of LNs loaded from the off-heap cache."
          +
          longgetOffHeapLNsStored() +
          "Number of LNs stored into the off-heap cache."
          +
          longgetOffHeapLRUSize() +
          "Number of LRU entries used for the off-heap cache."
          +
          longgetOffHeapNodesEvicted() +
          "Number of target BINs (including BIN-deltas) evicted from the off-heap cache."
          +
          longgetOffHeapNodesMutated() +
          "Number of off-heap target BINs mutated to BIN-deltas."
          +
          longgetOffHeapNodesSkipped() +
          "Number of off-heap target BINs on which no action was taken."
          +
          longgetOffHeapNodesStripped() +
          "Number of target BINs whose off-heap child LNs were evicted (stripped)."
          +
          longgetOffHeapNodesTargeted() +
          "Number of BINs selected as off-heap eviction targets."
          +
          longgetOffHeapThreadUnavailable() +
          "Number of eviction tasks that were submitted to the background off-heap evictor pool, but were refused because all eviction threads were busy."
          +
          longgetOffHeapTotalBlocks() +
          "Total number of memory blocks in off-heap cache."
          +
          longgetOffHeapTotalBytes() +
          "Total number of estimated bytes in off-heap cache."
          +
          intgetPendingLNQueueSize() +
          "Number of LNs pending because they were locked and could not be migrated."
          +
          longgetPriDeleteFailOps() +
          Number of failed primary DB deletion operations.
          +
          longgetPriDeleteOps() +
          Number of successful primary DB deletion operations.
          +
          longgetPriInsertFailOps() +
          Number of failed primary DB insertion operations.
          +
          longgetPriInsertOps() +
          Number of successful primary DB insertion operations.
          +
          longgetPriPositionOps() +
          Number of successful primary DB position operations.
          +
          longgetPriSearchFailOps() +
          Number of failed primary DB key search operations.
          +
          longgetPriSearchOps() +
          Number of successful primary DB key search operations.
          +
          longgetPriUpdateOps() +
          Number of successful primary DB update operations.
          +
          longgetProcessedBins() +
          The number of BINs that were successfully processed by the IN + Compressor.
          +
          longgetProtectedLogSize() +
          "Bytes used by all protected data files: the subset of reserved files that are temporarily protected and cannot be deleted."
          +
          java.util.SortedMap<java.lang.String,java.lang.Long>getProtectedLogSizeMap() +
          "A breakdown of protectedLogSize as a map of protecting entity name to protected size in bytes."
          +
          longgetRelatchesRequired() +
          Returns the number of latch upgrades (relatches) required while + operating on this Environment.
          +
          longgetRequiredEvictBytes() +
          Deprecated.  +
          The method returns 0 always.
          +
          +
          longgetReservedLogSize() +
          "Bytes used by all reserved data files: files that have beencleaned and can be deleted if they are not protected."
          +
          longgetSecDeleteOps() +
          Number of successful secondary DB deletion operations.
          +
          longgetSecInsertOps() +
          Number of successful secondary DB insertion operations.
          +
          longgetSecPositionOps() +
          Number of successful secondary DB position operations.
          +
          longgetSecSearchFailOps() +
          Number of failed secondary DB key search operations.
          +
          longgetSecSearchOps() +
          Number of successful secondary DB key search operations.
          +
          longgetSecUpdateOps() +
          Number of successful secondary DB update operations.
          +
          longgetSharedCacheTotalBytes() +
          "Total amount of the shared JE main cache in use, in bytes."
          +
          longgetSplitBins() +
          The number of BINs encountered by the INCompressor that were split + between the time they were put on the compressor queue and when the + compressor ran.
          +
          longgetTotalLogSize() +
          "Total bytes used by data files on disk: activeLogSize + reservedLogSize."
          +
          java.lang.StringtoString() +
          Returns a String representation of the stats in the form of + <stat>=<value>
          +
          java.lang.StringtoStringVerbose() +
          Returns a String representation of the stats which includes stats + descriptions in addition to <stat>=<value>
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getCursorsBins

            +
            public long getCursorsBins()
            +
            The number of BINs encountered by the INCompressor that had cursors + referring to them when the compressor ran.
            +
          • +
          + + + +
            +
          • +

            getEnvironmentCreationTime

            +
            public long getEnvironmentCreationTime()
            +
            The time the Environment was created.
            +
          • +
          + + + +
            +
          • +

            getDbClosedBins

            +
            public long getDbClosedBins()
            +
            The number of BINs encountered by the INCompressor that had their + database closed between the time they were put on the compressor queue + and when the compressor ran.
            +
          • +
          + + + +
            +
          • +

            getInCompQueueSize

            +
            public long getInCompQueueSize()
            +
            The number of entries in the INCompressor queue when the getStats() + call was made.
            +
          • +
          + + + +
            +
          • +

            getNonEmptyBins

            +
            public long getNonEmptyBins()
            +
            The number of BINs encountered by the INCompressor that were not + actually empty when the compressor ran.
            +
          • +
          + + + +
            +
          • +

            getProcessedBins

            +
            public long getProcessedBins()
            +
            The number of BINs that were successfully processed by the IN + Compressor.
            +
          • +
          + + + +
            +
          • +

            getSplitBins

            +
            public long getSplitBins()
            +
            The number of BINs encountered by the INCompressor that were split + between the time they were put on the compressor queue and when the + compressor ran.
            +
          • +
          + + + +
            +
          • +

            getLastCheckpointId

            +
            public long getLastCheckpointId()
            +
            The Id of the last checkpoint.
            +
          • +
          + + + +
            +
          • +

            getNCheckpoints

            +
            public long getNCheckpoints()
            +
            The total number of checkpoints run so far.
            +
          • +
          + + + +
            +
          • +

            getNFullINFlush

            +
            public long getNFullINFlush()
            +
            The accumulated number of full INs flushed to the log.
            +
          • +
          + + + +
            +
          • +

            getNFullBINFlush

            +
            public long getNFullBINFlush()
            +
            The accumulated number of full BINs flushed to the log.
            +
          • +
          + + + +
            +
          • +

            getNDeltaINFlush

            +
            public long getNDeltaINFlush()
            +
            The accumulated number of Delta INs flushed to the log.
            +
          • +
          + + + +
            +
          • +

            getLastCheckpointInterval

            +
            public long getLastCheckpointInterval()
            +
            Byte length from last checkpoint start to the previous checkpoint start.
            +
          • +
          + + + +
            +
          • +

            getLastCheckpointStart

            +
            public long getLastCheckpointStart()
            +
            The location in the log of the last checkpoint start.
            +
          • +
          + + + +
            +
          • +

            getLastCheckpointEnd

            +
            public long getLastCheckpointEnd()
            +
            The location in the log of the last checkpoint end.
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            getCurrentMinUtilization

            +
            public int getCurrentMinUtilization()
            +

            "The current minimum (lower bound) log utilization as a percentage."

            + +

            Group: "Cleaning" +
            Name: "minUtilization"

            + + The last known log minimum utilization as a percentage. This statistic + provides a cheap way of checking the log utilization without having to + run the DbSpace utility. +

            + The log utilization is the percentage of the total log size (all .jdb + files) that is utilized or active. The remaining portion of the log + is obsolete. The log cleaner is responsible for keeping the log + utilization below the configured threshold, + EnvironmentConfig.CLEANER_MIN_UTILIZATION. +

            + This statistic is computed every time the log cleaner examines the + utilization of the log, in order to determine whether cleaning is + needed. The frequency can be configured using + EnvironmentConfig.CLEANER_BYTES_INTERVAL. +

            + The obsolete portion of the log includes data that has expired at the + time the statistic was last computed. An expiration histogram is stored + for each file and used to compute the expired size. The minimum and + maximum utilization are the lower and upper bounds of computed + utilization, which may be different when some data has expired. See + getNCleanerTwoPassRuns() for more information. +

            + Note that the size of the utilized data in the log is always greater + than the amount of user data (total size of keys and data). The active + Btree internal nodes and other metadata are also included. +

            +
            +
            Returns:
            +
            the current minimum utilization, or -1 if the utilization has + not been calculated for this environment since it was last opened.
            +
            Since:
            +
            6.5
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getCurrentMaxUtilization

            +
            public int getCurrentMaxUtilization()
            +

            "The current maximum (upper bound) log utilization as a percentage."

            + +

            Group: "Cleaning" +
            Name: "maxUtilization"

            + + The last known log maximum utilization as a percentage. This statistic + provides a cheap way of checking the log utilization without having to + run the DbSpace utility. +

            + The log utilization is the percentage of the total log size (all .jdb + files) that is utilized or active. The remaining portion of the log + is obsolete. The log cleaner is responsible for keeping the log + utilization below the configured threshold, + EnvironmentConfig.CLEANER_MIN_UTILIZATION. +

            + This statistic is computed every time the log cleaner examines the + utilization of the log, in order to determine whether cleaning is + needed. The frequency can be configured using + EnvironmentConfig.CLEANER_BYTES_INTERVAL. +

            + The obsolete portion of the log includes data that has expired at the + time the statistic was last computed. An expiration histogram is stored + for each file and used to compute the expired size. The minimum and + maximum utilization are the lower and upper bounds of computed + utilization, which may be different when some data has expired. See + getNCleanerTwoPassRuns() for more information. +

            + Note that the size of the utilized data in the log is always greater + than the amount of user data (total size of keys and data). The active + Btree internal nodes and other metadata are also included. +

            +
            +
            Returns:
            +
            the current maximum utilization, or -1 if the utilization has + not been calculated for this environment since it was last opened.
            +
            Since:
            +
            6.5
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getLNSizeCorrectionFactor

            +
            public float getLNSizeCorrectionFactor()
            +
            Deprecated. in JE 6.3. Adjustments are no longer needed because LN log + sizes have been stored in the Btree since JE 6.0.
            +
          • +
          + + + +
            +
          • +

            getCorrectedAvgLNSize

            +
            public float getCorrectedAvgLNSize()
            +
            Deprecated. in JE 5.0.56, use getCorrectedAvgLNSize() instead.
            +
          • +
          + + + +
            +
          • +

            getEstimatedAvgLNSize

            +
            public float getEstimatedAvgLNSize()
            +
            Deprecated. in JE 5.0.56, use getCorrectedAvgLNSize() instead.
            +
          • +
          + + + +
            +
          • +

            getNCleanerRuns

            +
            public long getNCleanerRuns()
            +

            "Number of cleaner runs, including two-pass runs."

            + +

            Group: "Cleaning" +
            Name: "nCleanerRuns"

            + + Total number of cleaner runs, including two-pass runs but not including revisal runs. The minimum and + maximum utilization values are used + to drive cleaning.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNCleanerTwoPassRuns

            +
            public long getNCleanerTwoPassRuns()
            +

            "Number of cleaner two-pass runs."

            + +

            Group: "Cleaning" +
            Name: "nTwoPassRuns"

            + + Number of cleaner two-pass runs, which are a subset of the + total cleaner runs. The minimum and maximum utilization values are used to + drive cleaning. +

            + The obsolete portion of the log includes data that has expired. An + expiration histogram is stored for each file and used to compute the + expired size. The minimum and maximum utilization are the lower and + upper bounds of computed utilization. They are different only when the + TTL feature is used, and some data in the file has expired while other + data has become obsolete for other reasons, such as record updates, + record deletions or checkpoints. In this case the strictly obsolete size + and the expired size may overlap because they are maintained separately. +

            + If they overlap completely then the minimum utilization is correct, + while if there is no overlap then the maximum utilization is correct. + Both utilization values trigger cleaning, but when there is significant + overlap, the cleaner will perform two-pass cleaning. +

            + In the first pass of two-pass cleaning, the file is read to recompute + obsolete and expired sizes, but the file is not cleaned. As a result of + recomputing the expired sizes, the strictly obsolete and expired sizes + will no longer overlap, and the minimum and maximum utilization will be + equal. If the file should still be cleaned, based on the recomputed + utilization, it is cleaned as usual, and in this case the number of + two-pass runs (this statistic) is incremented. +

            + If the file should not be cleaned because its recomputed utilization is + higher than expected, the file will not be cleaned. Instead, its + recomputed expiration histogram, which has size information that now + does not overlap with the strictly obsolete data, is stored for future + use. By storing the revised histogram, the cleaner can select the most + appropriate files for cleaning in the future. In this case the number of + revisal runs is incremented, and the + number of total runs is not incremented.

            +
            +
            Since:
            +
            6.5.0
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNCleanerRevisalRuns

            +
            public long getNCleanerRevisalRuns()
            +

            "Number of cleaner runs that ended in revising expiration info, but not in any cleaning."

            + +

            Group: "Cleaning" +
            Name: "nRevisalRuns"

            + + Number of cleaner runs that ended in revising expiration info, but not + in any cleaning.
            +
            +
            Since:
            +
            6.5.0
            +
            See Also:
            +
            getNCleanerTwoPassRuns(), +Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNCleanerProbeRuns

            +
            public long getNCleanerProbeRuns()
            +
            Deprecated. in JE 6.3, always returns zero.
            +
          • +
          + + + +
            +
          • +

            getNCleanerDeletions

            +
            public long getNCleanerDeletions()
            +

            "Number of cleaner file deletions."

            + +

            Group: "Cleaning" +
            Name: "nCleanerDeletions"

            + + The number of cleaner file deletions this session.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getPendingLNQueueSize

            +
            public int getPendingLNQueueSize()
            +

            "Number of LNs pending because they were locked and could not be migrated."

            + +

            Group: "Cleaning" +
            Name: "pendingLNQueueSize"

            + + The number of LNs pending because they were locked and could not be + migrated.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNCleanerDiskRead

            +
            public long getNCleanerDiskRead()
            +

            "Number of disk reads by the cleaner."

            + +

            Group: "Cleaning" +
            Name: "nCleanerDisksReads"

            + + The number of disk reads performed by the cleaner.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNCleanerEntriesRead

            +
            public long getNCleanerEntriesRead()
            +

            "Accumulated number of log entries read by the cleaner."

            + +

            Group: "Cleaning" +
            Name: "nCleanerEntriesRead"

            + + The accumulated number of log entries read by the cleaner.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNINsObsolete

            +
            public long getNINsObsolete()
            +

            "Accumulated number of INs obsolete."

            + +

            Group: "Cleaning" +
            Name: "nINsObsolete"

            + + The accumulated number of INs obsolete.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNINsCleaned

            +
            public long getNINsCleaned()
            +

            "Accumulated number of INs cleaned."

            + +

            Group: "Cleaning" +
            Name: "nINsCleaned"

            + + The accumulated number of INs cleaned.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNINsDead

            +
            public long getNINsDead()
            +

            "Accumulated number of INs that were not found in the tree anymore (deleted)."

            + +

            Group: "Cleaning" +
            Name: "nINsDead"

            + + The accumulated number of INs that were not found in the tree anymore + (deleted).
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNINsMigrated

            +
            public long getNINsMigrated()
            +

            "Accumulated number of INs migrated."

            + +

            Group: "Cleaning" +
            Name: "nINsMigrated"

            + + The accumulated number of INs migrated.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNBINDeltasObsolete

            +
            public long getNBINDeltasObsolete()
            +

            "Accumulated number of BIN-deltas obsolete."

            + +

            Group: "Cleaning" +
            Name: "nBINDeltasObsolete"

            + + The accumulated number of BIN-deltas obsolete.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNBINDeltasCleaned

            +
            public long getNBINDeltasCleaned()
            +

            "Accumulated number of BIN-deltas cleaned."

            + +

            Group: "Cleaning" +
            Name: "nBINDeltasCleaned"

            + + The accumulated number of BIN-deltas cleaned.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNBINDeltasDead

            +
            public long getNBINDeltasDead()
            +

            "Accumulated number of BIN-deltas that were not found in the tree anymore (deleted)."

            + +

            Group: "Cleaning" +
            Name: "nBINDeltasDead"

            + + The accumulated number of BIN-deltas that were not found in the tree + anymore (deleted).
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNBINDeltasMigrated

            +
            public long getNBINDeltasMigrated()
            +

            "Accumulated number of BIN-deltas migrated."

            + +

            Group: "Cleaning" +
            Name: "nBINDeltasMigrated"

            + + The accumulated number of BIN-deltas migrated.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsObsolete

            +
            public long getNLNsObsolete()
            +

            "Accumulated number of LNs obsolete."

            + +

            Group: "Cleaning" +
            Name: "nLNsObsolete"

            + + The accumulated number of LNs obsolete.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsExpired

            +
            public long getNLNsExpired()
            +

            "Accumulated number of obsolete LNs that were expired."

            + +

            Group: "Cleaning" +
            Name: "nLNsExpired"

            + + The accumulated number of obsolete LNs that were expired. Note that + this does not included embedded LNs (those having a data size less than + EnvironmentConfig.TREE_MAX_EMBEDDED_LN), because embedded LNs + are always considered obsolete.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsCleaned

            +
            public long getNLNsCleaned()
            +

            "Accumulated number of LNs cleaned."

            + +

            Group: "Cleaning" +
            Name: "nLNsCleaned"

            + + The accumulated number of LNs cleaned.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsDead

            +
            public long getNLNsDead()
            +

            "Accumulated number of LNs that were not found in the tree anymore (deleted)."

            + +

            Group: "Cleaning" +
            Name: "nLNsDead"

            + + The accumulated number of LNs that were not found in the tree anymore + (deleted).
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsLocked

            +
            public long getNLNsLocked()
            +

            "Accumulated number of LNs encountered that were locked."

            + +

            Group: "Cleaning" +
            Name: "nLNsLocked"

            + + The accumulated number of LNs encountered that were locked.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsMigrated

            +
            public long getNLNsMigrated()
            +

            "Accumulated number of LNs that were migrated forward in the log by the cleaner."

            + +

            Group: "Cleaning" +
            Name: "nLNsMigrated"

            + + The accumulated number of LNs encountered that were migrated forward in + the log by the cleaner.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsMarked

            +
            public long getNLNsMarked()
            +

            "Accumulated number of LNs in temporary DBs that were dirtied by the cleaner and subsequently logging during checkpoint/eviction."

            + +

            Group: "Cleaning" +
            Name: "nLNsMarked"

            + + The accumulated number of LNs in temporary DBs that were dirtied by the + cleaner and subsequently logging during checkpoint/eviction.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNLNQueueHits

            +
            public long getNLNQueueHits()
            +

            "Accumulated number of LNs processed without a tree lookup."

            + +

            Group: "Cleaning" +
            Name: "nLNQueueHits"

            + + The accumulated number of LNs processed without a tree lookup.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNPendingLNsProcessed

            +
            public long getNPendingLNsProcessed()
            +

            "Accumulated number of LNs processed because they were previously locked."

            + +

            Group: "Cleaning" +
            Name: "nPendingLNsProcessed"

            + + The accumulated number of LNs processed because they were previously + locked.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNMarkedLNsProcessed

            +
            public long getNMarkedLNsProcessed()
            +

            "Accumulated number of LNs processed because they were previously marked for migration."

            + +

            Group: "Cleaning" +
            Name: "nMarkLNsProcessed"

            + + The accumulated number of LNs processed because they were previously + marked for migration.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNToBeCleanedLNsProcessed

            +
            public long getNToBeCleanedLNsProcessed()
            +

            "Accumulated number of LNs processed because they are soon to be cleaned."

            + +

            Group: "Cleaning" +
            Name: "nToBeCleanedLNsProcessed"

            + + The accumulated number of LNs processed because they are soon to be + cleaned.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNClusterLNsProcessed

            +
            public long getNClusterLNsProcessed()
            +

            "Accumulated number of LNs processed because they qualify for clustering."

            + +

            Group: "Cleaning" +
            Name: "nClusterLNsProcessed"

            + + The accumulated number of LNs processed because they qualify for + clustering.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNPendingLNsLocked

            +
            public long getNPendingLNsLocked()
            +

            "Accumulated number of pending LNs that could not be locked for migration because of a long duration application lock."

            + +

            Group: "Cleaning" +
            Name: "nPendingLNsLocked"

            + + The accumulated number of pending LNs that could not be locked for + migration because of a long duration application lock.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNRepeatIteratorReads

            +
            public long getNRepeatIteratorReads()
            +

            "Number of attempts to read a log entry larger than the read buffer size during which the log buffer couldn\'t be grown enough to accommodate the object."

            + +

            Group: "Cleaning" +
            Name: "nRepeatIteratorReads"

            + + The number of times we tried to read a log entry larger than the read + buffer size and couldn't grow the log buffer to accommodate the large + object. This happens during scans of the log during activities like + environment open or log cleaning. Implies that the read chunk size + controlled by je.log.iteratorReadSize is too small.
            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getActiveLogSize

            +
            public long getActiveLogSize()
            +

            "Bytes used by all active data files: files required for basic JE operation."

            + +

            Group: "Cleaning" +
            Name: "activeLogSize"

            + +

            The log utilization is the + percentage of activeLogSize that is currently referenced or active.

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getReservedLogSize

            +
            public long getReservedLogSize()
            +

            "Bytes used by all reserved data files: files that have beencleaned and can be deleted if they are not protected."

            + +

            Group: "Cleaning" +
            Name: "reservedLogSize"

            + +

            Deletion of reserved files may be postponed for several reasons. + This occurs if an active file is protected (by a backup, for example), + and then the file is cleaned and becomes a reserved file. See + getProtectedLogSizeMap() for more information. In a + standalone JE environment, reserved files are normally deleted very + soon after being cleaned.

            + +

            In an HA environment, reserved files are retained because they might + be used for replication to electable nodes that have been offline + for the ReplicationConfig.FEEDER_TIMEOUT + interval or longer, or to offline secondary nodes. The replication + stream position of these nodes is unknown, so whether these files could + be used to avoid a network restore, when bringing these nodes online, + is also unknown. The files are retained just in case they can be used + for such replication. Files are reserved for replication on both master + and replicas, since a replica may become a master at a future time. + Such files will be deleted (oldest file first) to make room for a + write operation, if the write operation would have caused a disk limit + to be violated.

            + +

            In NoSQL DB, this retention of reserved files has the additional + benefit of supplying the replication stream to subscribers of the + Stream API, when such subscribers need to replay the stream from an + earlier point in time.

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getProtectedLogSize

            +
            public long getProtectedLogSize()
            +

            "Bytes used by all protected data files: the subset of reserved files that are temporarily protected and cannot be deleted."

            + +

            Group: "Cleaning" +
            Name: "protectedLogSize"

            + +

            Reserved files are protected for reasons described by getProtectedLogSizeMap().

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getProtectedLogSizeMap

            +
            public java.util.SortedMap<java.lang.String,java.lang.Long> getProtectedLogSizeMap()
            +

            "A breakdown of protectedLogSize as a map of protecting entity name to protected size in bytes."

            + +

            Group: "Cleaning" +
            Name: "protectedLogSizeMap"

            + +

            Reserved data files are temporarily + protected for a number of reasons. The + keys in the protected log size map are the names of the protecting + entities, and the values are the number of bytes protected by each + entity. The type and format of the entity names are as follows:

            + +
            +    Backup-N
            +    DatabaseCount-N
            +    DiskOrderedCursor-N
            +    Syncup-N
            +    Feeder-N
            +    NetworkRestore-N
            + 
            + +

            Where:

            +
              +
            • + Backup-N represents a DbBackup in progress, + i.e., for which DbBackup.startBackup() has been called + and DbBackup.endBackup() has not yet been called. All + active files are initially protected by the backup, but these + are not reserved files ond only appear in the map if they are + cleaned and become reserved after the backup starts. Files + are not protected if they have been copied and + DbBackup.removeFileProtection(String) has been called. + N is a sequentially assigned integer. +
            • +
            • + DatabaseCount-N represents an outstanding call to + Database.count(). + All active files are initially protected by this method, but + these are not reserved files ond only appear in the map if + they are cleaned and become reserved during the execution of + Database.count. + N is a sequentially assigned integer. +
            • +
            • + DiskOrderedCursor-N represents a + DiskOrderedCursor that has not yet been closed by + DiskOrderedCursor.close(). + All active files are initially protected when the cursor is + opened, but these are not reserved files ond only appear in + the map if they are cleaned and become reserved while the + cursor is open. + N is a sequentially assigned integer. +
            • +
            • + Syncup-N represents an in-progress negotiation between + a master and replica node in an HA replication group to + establish a replication stream. This is a normally a very short + negotiation and occurs when a replica joins the group or after + an election is held. During syncup, all reserved files are + protected. + N is the node name of the other node involved in the + syncup, i.e, if this node is a master then it is the name of + the replica, and vice versa. +
            • +
            • + Feeder-N represents an HA master node that is supplying + the replication stream to a replica. Normally data in active + files is being supplied and this data is not in the reserved + or protected categories. But if the replica is lagging, data + from reserved files may be supplied, and in that case will be + protected and appear in the map. + N is the node name of the replica receiving the + replication stream. +
            • +
            • + NetworkRestore-N represents an HA replica or master + node that is supplying files to a node that is performing a + NetworkRestore. The files supplied + are all active files plus the two most recently written + reserved files. The two reserved files will appear in the map, + as well as any of the active files that were cleaned and became + reserved during the network restore. Files that have already + been copied by the network restore are not protected. + N is the name of the node performing the + NetworkRestore. +
            • +
            + +

            When more than one entity is included in the map, in general the + largest value points to the entity primarily responsible for + preventing reclamation of disk space. Note that the values normally + sum to more than getProtectedLogSize(), since protection often + overlaps.

            + +

            The string format of this stat consists of name=size pairs + separated by semicolons, where name is the entity name described + above and size is the number of protected bytes.

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getAvailableLogSize

            +
            public long getAvailableLogSize()
            +

            "Bytes available for write operations when unprotected reserved files are deleted: free space + reservedLogSize - protectedLogSize."

            + +

            Group: "Cleaning" +
            Name: "availableLogSize"

            + +

            This is the amount that can be logged by write operations, and + other JE activity such as checkpointing, without violating a disk + limit. The files making up reservedLogSize can be deleted to + make room for these write operations, so availableLogSize is + the sum of the current disk free space and the reserved size that is not + protected (reservedLogSize - protectedLogSize). The + current disk free space is calculated using the disk volume's free + space, EnvironmentConfig.MAX_DISK and EnvironmentConfig.FREE_DISK.

            + +

            Note that when a record is written, the number of bytes includes JE + overheads for the record. Also, this causes Btree metadata to be + written during checkpoints, and other metadata is also written by JE. + So the space occupied on disk by a given set of records cannot be + calculated by simply summing the key/data sizes.

            + +

            Also note that availableLogSize will be negative when a disk + limit has been violated, representing the amount that needs to be freed + before write operations are allowed.

            +
            +
            Since:
            +
            7.5
            +
            See Also:
            +
            Cleaner Statistics, +EnvironmentConfig.MAX_DISK, +EnvironmentConfig.FREE_DISK
            +
            +
          • +
          + + + +
            +
          • +

            getTotalLogSize

            +
            public long getTotalLogSize()
            +

            "Total bytes used by data files on disk: activeLogSize + reservedLogSize."

            + +

            Group: "Cleaning" +
            Name: "totalLogSize"

            +
            +
            See Also:
            +
            Cleaner Statistics
            +
            +
          • +
          + + + +
            +
          • +

            getNCacheMiss

            +
            public long getNCacheMiss()
            +
            The total number of requests for database objects which were not in + memory.
            +
          • +
          + + + +
            +
          • +

            getEndOfLog

            +
            public long getEndOfLog()
            +
            The location of the next entry to be written to the log. + +

            Note that the log entries prior to this position may not yet have + been flushed to disk. Flushing can be forced using a Sync or + WriteNoSync commit, or a checkpoint.

            +
          • +
          + + + +
            +
          • +

            getNFSyncs

            +
            public long getNFSyncs()
            +
            The number of fsyncs issued through the group commit manager. A subset + of nLogFsyncs.
            +
          • +
          + + + +
            +
          • +

            getNFSyncRequests

            +
            public long getNFSyncRequests()
            +
            The number of fsyncs requested through the group commit manager.
            +
          • +
          + + + +
            +
          • +

            getNFSyncTimeouts

            +
            public long getNFSyncTimeouts()
            +
            The number of fsync requests submitted to the group commit manager which + timed out.
            +
          • +
          + + + +
            +
          • +

            getFSyncTime

            +
            public long getFSyncTime()
            +
            The total number of milliseconds used to perform fsyncs.
            +
            +
            Since:
            +
            7.0, although the stat was output by toString() and + appeared in the je.stat.csv file in earlier versions.
            +
            +
          • +
          + + + +
            +
          • +

            getFSyncMaxTime

            +
            public long getFSyncMaxTime()
            +
            The maximum number of milliseconds used to perform a single fsync.
            +
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            getNLogFSyncs

            +
            public long getNLogFSyncs()
            +
            The total number of fsyncs of the JE log. This includes those fsyncs + issued on behalf of transaction commits.
            +
          • +
          + + + +
            +
          • +

            getNLogBuffers

            +
            public int getNLogBuffers()
            +
            The number of log buffers currently instantiated.
            +
          • +
          + + + +
            +
          • +

            getNRandomReads

            +
            public long getNRandomReads()
            +
            The number of disk reads which required repositioning the disk head + more than 1MB from the previous file position. Reads in a different + *.jdb log file then the last IO constitute a random read. +

            + This number is approximate and may differ from the actual number of + random disk reads depending on the type of disks and file system, disk + geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNRandomReadBytes

            +
            public long getNRandomReadBytes()
            +
            The number of bytes read which required repositioning the disk head + more than 1MB from the previous file position. Reads in a different + *.jdb log file then the last IO constitute a random read. +

            + This number is approximate vary depending on the type of disks and file + system, disk geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNRandomWrites

            +
            public long getNRandomWrites()
            +
            The number of disk writes which required repositioning the disk head by + more than 1MB from the previous file position. Writes to a different + *.jdb log file (i.e. a file "flip") then the last IO constitute a random + write. +

            + This number is approximate and may differ from the actual number of + random disk writes depending on the type of disks and file system, disk + geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNRandomWriteBytes

            +
            public long getNRandomWriteBytes()
            +
            The number of bytes written which required repositioning the disk head + more than 1MB from the previous file position. Writes in a different + *.jdb log file then the last IO constitute a random write. +

            + This number is approximate vary depending on the type of disks and file + system, disk geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNSequentialReads

            +
            public long getNSequentialReads()
            +
            The number of disk reads which did not require repositioning the disk + head more than 1MB from the previous file position. Reads in a + different *.jdb log file then the last IO constitute a random read. +

            + This number is approximate and may differ from the actual number of + sequential disk reads depending on the type of disks and file system, + disk geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNSequentialReadBytes

            +
            public long getNSequentialReadBytes()
            +
            The number of bytes read which did not require repositioning the disk + head more than 1MB from the previous file position. Reads in a + different *.jdb log file then the last IO constitute a random read. +

            + This number is approximate vary depending on the type of disks and file + system, disk geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNSequentialWrites

            +
            public long getNSequentialWrites()
            +
            The number of disk writes which did not require repositioning the disk + head by more than 1MB from the previous file position. Writes to a + different *.jdb log file (i.e. a file "flip") then the last IO + constitute a random write. +

            + This number is approximate and may differ from the actual number of + sequential disk writes depending on the type of disks and file system, + disk geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNSequentialWriteBytes

            +
            public long getNSequentialWriteBytes()
            +
            The number of bytes written which did not require repositioning the + disk head more than 1MB from the previous file position. Writes in a + different *.jdb log file then the last IO constitute a random write. +

            + This number is approximate vary depending on the type of disks and file + system, disk geometry, and file system cache size.

            +
          • +
          + + + +
            +
          • +

            getNBytesReadFromWriteQueue

            +
            public long getNBytesReadFromWriteQueue()
            +
            The number of bytes read to fulfill file read operations by reading out + of the pending write queue.
            +
          • +
          + + + +
            +
          • +

            getNBytesWrittenFromWriteQueue

            +
            public long getNBytesWrittenFromWriteQueue()
            +
            The number of bytes written from the pending write queue.
            +
          • +
          + + + +
            +
          • +

            getNReadsFromWriteQueue

            +
            public long getNReadsFromWriteQueue()
            +
            The number of file read operations which were fulfilled by reading out + of the pending write queue.
            +
          • +
          + + + +
            +
          • +

            getNWritesFromWriteQueue

            +
            public long getNWritesFromWriteQueue()
            +
            The number of file writes operations executed from the pending write + queue.
            +
          • +
          + + + +
            +
          • +

            getNWriteQueueOverflow

            +
            public long getNWriteQueueOverflow()
            +
            The number of writes operations which would overflow the Write Queue.
            +
          • +
          + + + +
            +
          • +

            getNWriteQueueOverflowFailures

            +
            public long getNWriteQueueOverflowFailures()
            +
            The number of writes operations which would overflow the Write Queue + and could not be queued.
            +
          • +
          + + + +
            +
          • +

            getBufferBytes

            +
            public long getBufferBytes()
            +
            The total memory currently consumed by log buffers, in bytes. If this + environment uses the shared cache, this method returns only the amount + used by this environment.
            +
          • +
          + + + +
            +
          • +

            getNNotResident

            +
            public long getNNotResident()
            +
            The number of requests for database objects not contained within the + in memory data structures.
            +
          • +
          + + + +
            +
          • +

            getNRepeatFaultReads

            +
            public long getNRepeatFaultReads()
            +
            The number of reads which had to be repeated when faulting in an object + from disk because the read chunk size controlled by je.log.faultReadSize + is too small.
            +
          • +
          + + + +
            +
          • +

            getNTempBufferWrites

            +
            public long getNTempBufferWrites()
            +
            The number of writes which had to be completed using the temporary + marshalling buffer because the fixed size log buffers specified by + je.log.totalBufferBytes and je.log.numBuffers were not large enough.
            +
          • +
          + + + +
            +
          • +

            getNFileOpens

            +
            public int getNFileOpens()
            +
            The number of times a log file has been opened.
            +
          • +
          + + + +
            +
          • +

            getNOpenFiles

            +
            public int getNOpenFiles()
            +
            The number of files currently open in the file cache.
            +
          • +
          + + + +
            +
          • +

            getRequiredEvictBytes

            +
            public long getRequiredEvictBytes()
            +
            Deprecated. The method returns 0 always.
            +
          • +
          + + + +
            +
          • +

            getNNodesScanned

            +
            public long getNNodesScanned()
            +
            Deprecated. This statistic has no meaning after the implementation + of the new evictor in JE 6.0. The method returns 0 always.
            +
          • +
          + + + +
            +
          • +

            getNEvictPasses

            +
            public long getNEvictPasses()
            +
            Deprecated. Use getNEvictionRuns() instead.
            +
          • +
          + + + +
            +
          • +

            getNNodesSelected

            +
            public long getNNodesSelected()
            +
            Deprecated. use getNNodesTargeted() instead.
            +
          • +
          + + + +
            +
          • +

            getNNodesExplicitlyEvicted

            +
            public long getNNodesExplicitlyEvicted()
            +
            Deprecated. Use getNNodesEvicted() instead.
            +
          • +
          + + + +
            +
          • +

            getNBINsStripped

            +
            public long getNBINsStripped()
            +
            Deprecated. Use getNNodesStripped() instead.
            +
          • +
          + + + +
            +
          • +

            getNBINsMutated

            +
            public long getNBINsMutated()
            +
            Deprecated. Use getNNodesMutated() instead.
            +
          • +
          + + + + + + + +
            +
          • +

            getNNodesTargeted

            +
            public long getNNodesTargeted()
            +

            "Number of nodes (INs) selected as eviction targets."

            + +

            Group: "Cache" +
            Name: "nNodesTargeted"

            + +

            An eviction target may actually be evicted, or skipped, or put back + to the LRU, potentially after partial eviction (stripping) or + BIN-delta mutation is done on it. + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getNRootNodesEvicted

            +
            public long getNRootNodesEvicted()
            +

            "Number of database root nodes (INs) evicted."

            + +

            Group: "Cache" +
            Name: "nRootNodesEvicted"

            + +

            The root node of a Database is only evicted after all other nodes in + the Database, so this implies that the entire Database has fallen out of + cache and is probably closed. + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNDirtyNodesEvicted

            +
            public long getNDirtyNodesEvicted()
            +

            "Number of dirty target nodes logged and evicted."

            + +

            Group: "Cache" +
            Name: "nDirtyNodesEvicted"

            + +

            When a dirty IN is evicted from main cache and no off-heap cache is + configured, the IN must be logged. When an off-heap cache is configured, + dirty INs can be moved from main cache to off-heap cache based on LRU, + but INs are only logged when they are evicted from off-heap cache. + Therefore, this stat is always zero when an off-heap cache is configured. + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsEvicted

            +
            public long getNLNsEvicted()
            +

            "Number of LNs evicted as a result of LRU-based eviction (but not CacheMode.EVICT_LN)."

            + +

            Group: "Cache" +
            Name: "nLNsEvicted"

            + +

            When a BIN is considered for eviction based on LRU, if the BIN + contains resident LNs in main cache, it is stripped of the LNs rather + than being evicted. This stat reflects LNs evicted in this manner, but + not LNs evicted as a result of using CacheMode.EVICT_LN. Also + note that embedded LNs + are evicted immediately and are not reflected in this stat value. + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNNodesStripped

            +
            public long getNNodesStripped()
            +

            "Number of target BINs whose child LNs were evicted (stripped)."

            + +

            Group: "Cache" +
            Name: "nNodesStripped"

            + +

            BINs are stripped in order to evict LNs. + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNNodesMutated

            +
            public long getNNodesMutated()
            +

            "Number of target BINs mutated to BIN-deltas."

            + +

            Group: "Cache" +
            Name: "nNodesMutated"

            + +

            When a BIN is considered for eviction based on LRU, if the BIN + can be mutated to a BIN-delta, it is mutated rather than being evicted. + Note that when an off-heap cache is configured, this stat value will be + zero because BIN mutation will take place only in the off-heap cache; + see getOffHeapNodesMutated(). + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNNodesPutBack

            +
            public long getNNodesPutBack()
            +

            "Number of target nodes (INs) moved to the cold end of the LRU list without any action taken on them."

            + +

            Group: "Cache" +
            Name: "nNodesPutBack"

            + +

            Reasons for putting back a target IN are:

            +
              +
            • The IN was accessed by an operation while the evictor was + processing it.
            • +
            • To prevent the cache usage for Btree objects from falling below + EnvironmentConfig.TREE_MIN_MEMORY.
            • +
            + +

            See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNNodesMovedToDirtyLRU

            +
            public long getNNodesMovedToDirtyLRU()
            +

            "Number of nodes (INs) moved from the mixed/priority-1 to the dirty/priority-2 LRU list."

            + +

            Group: "Cache" +
            Name: "nNodesMovedToDirtyLRU"

            + +

            When an off-cache is not configured, dirty nodes are evicted last + from the main cache by moving them to a 2nd priority LRU list. When an + off-cache is configured, level-2 INs that reference off-heap BINs are + evicted last from the main cache, using the same approach. + See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNNodesSkipped

            +
            public long getNNodesSkipped()
            +

            "Number of nodes (INs) that did not require any action."

            + +

            Group: "Cache" +
            Name: "nNodesSkipped"

            + +

            Reasons for skipping a target IN are:

            +
              +
            • It has already been evicted by another thread.
            • +
            • It cannot be evicted because concurrent activity added resident + child nodes.
            • +
            • It cannot be evicted because it is dirty and the environment is + read-only.
            • +
            +

            See CacheMode for a description of eviction.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNThreadUnavailable

            +
            public long getNThreadUnavailable()
            +

            "Number of eviction tasks that were submitted to the background evictor pool, but were refused because all eviction threads were busy."

            + +

            Group: "Cache" +
            Name: "nThreadUnavailable"

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNSharedCacheEnvironments

            +
            public int getNSharedCacheEnvironments()
            +

            "Number of Environments sharing the main cache."

            + +

            Group: "Cache" +
            Name: "nSharedCacheEnvironments"

            + +

            This method says nothing about whether this environment is using + the shared cache or not.

            +
          • +
          + + + +
            +
          • +

            getNLNsFetch

            +
            public long getNLNsFetch()
            +

            "Number of LNs (data records) requested by btree operations."

            + +

            Group: "Cache" +
            Name: "nLNsFetch"

            + +

            Note that the number of LN fetches does not necessarily correspond + to the number of records accessed, since some LNs may be + embedded.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNBINsFetch

            +
            public long getNBINsFetch()
            +

            "Number of BINs (bottom internal nodes) and BIN-deltas requested by btree operations."

            + +

            Group: "Cache" +
            Name: "nBINsFetch"

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNUpperINsFetch

            +
            public long getNUpperINsFetch()
            +

            "Number of Upper INs (non-bottom internal nodes) requested by btree operations."

            + +

            Group: "Cache" +
            Name: "nUpperINsFetch"

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNLNsFetchMiss

            +
            public long getNLNsFetchMiss()
            +

            "Number of LNs (data records) requested by btree operations that were not in main cache."

            + +

            Group: "Cache" +
            Name: "nLNsFetchMiss"

            + +

            Note that the number of LN fetches does not necessarily correspond + to the number of records accessed, since some LNs may be + embedded.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNBINsFetchMiss

            +
            public long getNBINsFetchMiss()
            +

            "Number of full BINs (bottom internal nodes) and BIN-deltas fetched to satisfy btree operations that were not in main cache."

            + +

            Group: "Cache" +
            Name: "nBINsFetchMiss"

            + +

            This is the portion of getNBINsFetch() that resulted in a + fetch miss. The fetch may be for a full BIN or BIN-delta + (getNBINDeltasFetchMiss()), depending on whether a BIN-delta + currently exists (see EnvironmentConfig.TREE_BIN_DELTA). + However, additional full BIN fetches occur when mutating a BIN-delta to + a full BIN (getNFullBINsMiss()) whenever this is necessary for + completing an operation.

            + +

            Therefore, the total number of BIN fetch misses + (including BIN-deltas) is:

            + +

            nFullBINsMiss + nBINsFetchMiss

            + +

            And the total number of full BIN (vs BIN-delta) fetch misses is:

            + +

            nFullBINsMiss + nBINsFetchMiss - + nBINDeltasFetchMiss

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNBINDeltasFetchMiss

            +
            public long getNBINDeltasFetchMiss()
            +

            "Number of BIN-deltas (partial BINs) fetched to satisfy btree operations that were not in main cache."

            + +

            Group: "Cache" +
            Name: "nBINDeltasFetchMiss"

            + +

            This represents the portion of nBINsFetchMiss() that fetched + BIN-deltas rather than full BINs. See getNBINsFetchMiss().

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNFullBINsMiss

            +
            public long getNFullBINsMiss()
            +

            "Number of times a BIN-delta had to be mutated to a full BIN (and as a result a full BIN had to be read in from the log)."

            + +

            Group: "Cache" +
            Name: "nFullBINsMiss"

            + +

            Note that this stat does not include full BIN misses that are + not due to BIN-delta mutations. See + getNBINsFetchMiss()

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNUpperINsFetchMiss

            +
            public long getNUpperINsFetchMiss()
            +

            "Number of Upper INs (non-bottom internal nodes) requested by btree operations that were not in main cache."

            + +

            Group: "Cache" +
            Name: "nUpperINsFetchMiss"

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNBINsFetchMissRatio

            +
            public float getNBINsFetchMissRatio()
            +

            "The BIN fetch miss ratio (nBINsFetchMiss / nBINsFetch)"

            + +

            Group: "Cache" +
            Name: "nBINsFetchMissRatio"

            + +

            This stat can be misleading because it does not include the number + of full BIN fetch misses resulting from BIN-delta mutations (getNFullBINsMiss(). It may be improved, or perhaps deprecated, in a + future release.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNBINDeltaBlindOps

            +
            public long getNBINDeltaBlindOps()
            +

            "The number of operations performed blindly in BIN deltas"

            + +

            Group: "Cache" +
            Name: "nBinDeltaBlindOps"

            + +

            Note that this stat is misplaced. It should be in the + "Environment" group + and will probably be moved there in a future release.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging, +EnvironmentConfig.TREE_BIN_DELTA
            +
            +
          • +
          + + + +
            +
          • +

            getNCachedUpperINs

            +
            public long getNCachedUpperINs()
            +

            "Number of upper INs (non-bottom internal nodes) in main cache."

            + +

            Group: "Cache" +
            Name: "nCachedUpperINs"

            + +

            When used on shared environment caches, zero is returned when fast stats are requested.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNCachedBINs

            +
            public long getNCachedBINs()
            +

            "Number of BINs (bottom internal nodes) and BIN-deltas in main cache."

            + +

            Group: "Cache" +
            Name: "nCachedBINs"

            + +

            When used on shared environment caches, zero is returned when fast stats are requested.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNCachedBINDeltas

            +
            public long getNCachedBINDeltas()
            +

            "Number of BIN-deltas (partial BINs) in main cache. This is a subset of the nCachedBINs value."

            + +

            Group: "Cache" +
            Name: "nCachedBINDeltas"

            + +

            When used on shared environment caches, zero is returned when fast stats are requested.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getNINSparseTarget

            +
            public long getNINSparseTarget()
            +

            "Number of INs that use a compact sparse array representation to point to child nodes in the main cache."

            + +

            Group: "Cache" +
            Name: "nINSparseTarget"

            + +

            Each IN contains an array of references to child INs or LNs. When + there are between one and four children resident, the size of the array + is reduced to four. This saves a significant amount of cache memory for + BINs when CacheMode.EVICT_LN is used, because there are + typically only a small number of LNs resident in main cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getNINNoTarget

            +
            public long getNINNoTarget()
            +

            "Number of INs that use a compact representation when none of its child nodes are in the main cache."

            + +

            Group: "Cache" +
            Name: "nINNoTarget"

            + +

            Each IN contains an array of references to child INs or LNs. When + there are no children resident, no array is allocated. This saves a + significant amount of cache memory for BINs when CacheMode.EVICT_LN is used, because there are typically only a small + number of LNs resident in main cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + + + + + + + + + + + + + +
            +
          • +

            getNBINsEvictedEvictorThread

            +
            public long getNBINsEvictedEvictorThread()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBINsEvictedManual

            +
            public long getNBINsEvictedManual()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBINsEvictedCritical

            +
            public long getNBINsEvictedCritical()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBINsEvictedCacheMode

            +
            public long getNBINsEvictedCacheMode()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBINsEvictedDaemon

            +
            public long getNBINsEvictedDaemon()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNUpperINsEvictedEvictorThread

            +
            public long getNUpperINsEvictedEvictorThread()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNUpperINsEvictedManual

            +
            public long getNUpperINsEvictedManual()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNUpperINsEvictedCritical

            +
            public long getNUpperINsEvictedCritical()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNUpperINsEvictedCacheMode

            +
            public long getNUpperINsEvictedCacheMode()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNUpperINsEvictedDaemon

            +
            public long getNUpperINsEvictedDaemon()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBatchesEvictorThread

            +
            public long getNBatchesEvictorThread()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBatchesManual

            +
            public long getNBatchesManual()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBatchesCacheMode

            +
            public long getNBatchesCacheMode()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBatchesCritical

            +
            public long getNBatchesCritical()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBatchesDaemon

            +
            public long getNBatchesDaemon()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getNBytesEvictedEvictorThread

            +
            public long getNBytesEvictedEvictorThread()
            +

            "Number of bytes evicted by evictor pool threads."

            + +

            Group: "Cache" +
            Name: "nBytesEvictedEVICTORTHREAD"

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNBytesEvictedManual

            +
            public long getNBytesEvictedManual()
            +

            "Number of bytes evicted by the Environment.evictMemory or during Environment startup."

            + +

            Group: "Cache" +
            Name: "nBytesEvictedMANUAL"

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNBytesEvictedCacheMode

            +
            public long getNBytesEvictedCacheMode()
            +

            "Number of bytes evicted by operations for which CacheMode.EVICT_BIN is specified."

            + +

            Group: "Cache" +
            Name: "nBytesEvictedCACHEMODE"

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNBytesEvictedCritical

            +
            public long getNBytesEvictedCritical()
            +

            "Number of bytes evicted in the application thread because the cache is over budget."

            + +

            Group: "Cache" +
            Name: "nBytesEvictedCRITICAL"

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getNBytesEvictedDeamon

            +
            public long getNBytesEvictedDeamon()
            +

            "Number of bytes evicted by JE deamon threads."

            + +

            Group: "Cache" +
            Name: "nBytesEvictedDAEMON"

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getAvgBatchEvictorThread

            +
            public long getAvgBatchEvictorThread()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getAvgBatchManual

            +
            public long getAvgBatchManual()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getAvgBatchCacheMode

            +
            public long getAvgBatchCacheMode()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getAvgBatchCritical

            +
            public long getAvgBatchCritical()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getAvgBatchDaemon

            +
            public long getAvgBatchDaemon()
            +
            Deprecated. This statistic has been removed. The method returns 0 + always.
            +
          • +
          + + + +
            +
          • +

            getSharedCacheTotalBytes

            +
            public long getSharedCacheTotalBytes()
            +

            "Total amount of the shared JE main cache in use, in bytes."

            + +

            Group: "Cache" +
            Name: "sharedCacheTotalBytes"

            + +

            If this + environment uses the shared cache, this method returns the total size of + the shared cache, i.e., the sum of the getCacheTotalBytes() for + all environments that are sharing the cache. If this environment does + not use the shared cache, this method returns zero.

            + +

            To get the configured maximum cache size, see EnvironmentMutableConfig.getCacheSize().

            +
          • +
          + + + + + + + +
            +
          • +

            getDataBytes

            +
            public long getDataBytes()
            +

            "Amount of JE main cache used for holding data, keys and internal Btree nodes, in bytes."

            + +

            Group: "Cache" +
            Name: "dataBytes"

            + +

            The value returned by this method includes the amount returned by + getDataAdminBytes().

            + +

            If this environment uses the shared cache, this method returns only + the amount used by this environment.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getDataAdminBytes

            +
            public long getDataAdminBytes()
            +

            "Amount of JE main cache used for holding per-database cleaner utilization metadata, in bytes."

            + +

            Group: "Cache" +
            Name: "dataAdminBytes"

            + +

            If this environment uses the shared cache, this method returns only + the amount used by this environment.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getDOSBytes

            +
            public long getDOSBytes()
            +

            "Amount of JE main cache consumed by disk-ordered cursor and Database.count operations, in bytes."

            + +

            Group: "Cache" +
            Name: "DOSBytes"

            + +

            If this environment uses the shared cache, this method returns only + the amount used by this environment.

            +
            +
            See Also:
            +
            Cache Statistics: Unexpected + Sizes
            +
            +
          • +
          + + + +
            +
          • +

            getAdminBytes

            +
            public long getAdminBytes()
            +

            "Number of bytes of JE main cache used for cleaner and checkpointer metadata, in bytes."

            + +

            Group: "Cache" +
            Name: "adminBytes"

            + +

            If this environment uses the shared cache, this method returns only + the amount used by this environment.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getLockBytes

            +
            public long getLockBytes()
            +

            "Number of bytes of JE cache used for holding locks and transactions, in bytes."

            + +

            Group: "Cache" +
            Name: "lockBytes"

            + +

            If this environment uses the shared cache, this method returns only + the amount used by this environment.

            +
            +
            See Also:
            +
            Cache Statistics: Unexpected + Sizes
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getOffHeapAllocFailures

            +
            public long getOffHeapAllocFailures()
            +

            "Number of off-heap allocation failures due to lack of system memory."

            + +

            Group: "OffHeap" +
            Name: "offHeapAllocFailure"

            + +

            Currently, with the default off-heap allocator, an allocation + failure occurs only when OutOfMemoryError is thrown by Unsafe.allocateMemory. This might be considered a fatal error, since it + means that no memory is available on the machine or VM. In practice, + we have not seen this occur because Linux will automatically kill + processes that are rapidly allocating memory when available memory is + very low.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapAllocOverflows

            +
            public long getOffHeapAllocOverflows()
            +

            "Number of off-heap allocation attempts that exceeded the cache size."

            + +

            Group: "OffHeap" +
            Name: "offHeapAllocOverflow"

            + +

            Currently, with the default off-heap allocator, this never happens + because the allocator will perform the allocation as long as any memory + is available. Even so, the off-heap evictor normally prevents + overflowing of the off-heap cache by freeing memory before it is + needed.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapThreadUnavailable

            +
            public long getOffHeapThreadUnavailable()
            +

            "Number of eviction tasks that were submitted to the background off-heap evictor pool, but were refused because all eviction threads were busy."

            + +

            Group: "OffHeap" +
            Name: "offHeapThreadUnavailable"

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapNodesTargeted

            +
            public long getOffHeapNodesTargeted()
            +

            "Number of BINs selected as off-heap eviction targets."

            + +

            Group: "OffHeap" +
            Name: "offHeapNodesTargeted"

            + +

            Nodes are selected as targets by the evictor based on LRU, always + selecting from the cold end of the LRU list. First, non-dirty nodes and + nodes referring to off-heap LNs are selected based on LRU. When there + are no more such nodes then dirty nodes with no off-heap LNs are + selected, based on LRU.

            + +

            An eviction target may actually be evicted, or skipped, or put + back to the LRU, potentially after stripping child LNs or mutation to + a BIN-delta.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapCriticalNodesTargeted

            +
            public long getOffHeapCriticalNodesTargeted()
            +

            "Number of nodes targeted in \'critical eviction\' mode."

            + +

            Group: "OffHeap" +
            Name: "offHeapCriticalNodesTargeted"

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Critical + Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapNodesEvicted

            +
            public long getOffHeapNodesEvicted()
            +

            "Number of target BINs (including BIN-deltas) evicted from the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapNodesEvicted"

            + +

            An evicted BIN is completely removed from the off-heap cache and LRU + list. If it is dirty, it must be logged. A BIN is evicted only if it has + no off-heap child LNs and it cannot be mutated to a BIN-delta.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapDirtyNodesEvicted

            +
            public long getOffHeapDirtyNodesEvicted()
            +

            "Number of target BINs evicted from the off-heap cache that were dirty and therefore were logged."

            + +

            Group: "OffHeap" +
            Name: "offHeapDirtyNodesEvicted"

            + +

            This stat value is a subset of getOffHeapNodesEvicted().

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapNodesStripped

            +
            public long getOffHeapNodesStripped()
            +

            "Number of target BINs whose off-heap child LNs were evicted (stripped)."

            + +

            Group: "OffHeap" +
            Name: "offHeapNodesStripped"

            + +

            When a BIN is stripped, all off-heap LNs that the BIN refers to are + evicted. The getOffHeapLNsEvicted() stat is incremented + accordingly.

            + +

            A stripped BIN could be a BIN in main cache that is stripped of + off-heap LNs, or a BIN that is off-heap and also refers to off-heap + LNs. When a main cache BIN is stripped, it is removed from the + off-heap LRU. When an off-heap BIN is stripped, it is either modified + in place to remove the LN references (this is done when a small + number of LNs are referenced and the wasted space is small), or is + copied to a new, smaller off-heap block with no LN references.

            + +

            After stripping an off-heap BIN, it is moved to the hot end of the + LRU list. Off-heap BINs are only mutated to BIN-deltas or evicted + completely when they do not refer to any off-heap LNs. This gives + BINs precedence over LNs in the cache. + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapNodesMutated

            +
            public long getOffHeapNodesMutated()
            +

            "Number of off-heap target BINs mutated to BIN-deltas."

            + +

            Group: "OffHeap" +
            Name: "offHeapNodesMutated"

            + +

            Mutation to a BIN-delta is performed for full BINs that do not + refer to any off-heap LNs and can be represented as BIN-deltas in + cache and on disk (see EnvironmentConfig.TREE_BIN_DELTA). + When a BIN is mutated, it is is copied to a new, smaller off-heap + block. After mutating an off-heap BIN, it is moved to the hot end of + the LRU list.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapNodesSkipped

            +
            public long getOffHeapNodesSkipped()
            +

            "Number of off-heap target BINs on which no action was taken."

            + +

            Group: "OffHeap" +
            Name: "offHeapNodesSkipped"

            + +

            For example, a node will be skipped if it has been moved to the + hot end of the LRU list by another thread, or more rarely, already + processed by another evictor thread. This can occur because there is + a short period of time where a targeted node has been removed from + the LRU by the evictor thread, but not yet latched.

            + +

            The number of skipped nodes is normally very small, compared to the + number of targeted nodes.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapLNsEvicted

            +
            public long getOffHeapLNsEvicted()
            +

            "Number of LNs evicted from the off-heap cache as a result of BIN stripping."

            + +

            Group: "OffHeap" +
            Name: "offHeapLNsEvicted"

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Eviction
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapLNsLoaded

            +
            public long getOffHeapLNsLoaded()
            +

            "Number of LNs loaded from the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapLNsLoaded"

            + +

            LNs are loaded when requested by CRUD operations or other internal + btree operations.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapLNsStored

            +
            public long getOffHeapLNsStored()
            +

            "Number of LNs stored into the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapLNsStored"

            + +

            LNs are stored off-heap when they are evicted from the main cache. + Note that when CacheMode.EVICT_LN is used, the LN resides in + the main cache for a very short period since it is evicted after the + CRUD operation is complete.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapBINsLoaded

            +
            public long getOffHeapBINsLoaded()
            +

            "Number of BINs loaded from the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapBINsLoaded"

            + +

            BINs are loaded when needed by CRUD operations or other internal + btree operations.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapBINsStored

            +
            public long getOffHeapBINsStored()
            +

            "Number of BINs stored into the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapBINsStored"

            + +

            BINs are stored off-heap when they are evicted from the main cache. + Note that when CacheMode.EVICT_BIN is used, the BIN resides + in the main cache for a very short period since it is evicted after + the CRUD operation is complete.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapCachedLNs

            +
            public int getOffHeapCachedLNs()
            +

            "Number of LNs residing in the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapCachedLNs"

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapCachedBINs

            +
            public int getOffHeapCachedBINs()
            +

            "Number of BINs (full BINs and BIN-deltas) residing in the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapCachedBINs"

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapCachedBINDeltas

            +
            public int getOffHeapCachedBINDeltas()
            +

            "Number of BIN-deltas residing in the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapCachedBINDeltas"

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapTotalBytes

            +
            public long getOffHeapTotalBytes()
            +

            "Total number of estimated bytes in off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapTotalBytes"

            + +

            This includes the estimated overhead for off-heap memory blocks, as + well as their contents.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            + +

            To get the configured maximum off-heap cache size, see EnvironmentMutableConfig.getOffHeapCacheSize().

            +
            +
            See Also:
            +
            Cache Statistics: Sizing
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapTotalBlocks

            +
            public long getOffHeapTotalBlocks()
            +

            "Total number of memory blocks in off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapTotalBlocks"

            + +

            There is one block for each off-heap BIN and one for each off-heap + LN. So the total number of blocks is the sum of + getOffHeapCachedLNs() and getOffHeapCachedBINs().

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getOffHeapLRUSize

            +
            public long getOffHeapLRUSize()
            +

            "Number of LRU entries used for the off-heap cache."

            + +

            Group: "OffHeap" +
            Name: "offHeapLruSize"

            + +

            The off-heap LRU list is stored in the Java heap. Each entry occupies + 20 bytes of memory when compressed oops are used, or 24 bytes otherwise. + This memory is not considered part of the JE main cache, and is not + included in main cache statistics.

            + +

            There is one LRU entry for each off-heap BIN, and one for each BIN in + main cache that refers to one or more off-heap LNs. The latter approach + avoids an LRU entry per off-heap LN, which would use excessive amounts + of space in the Java heap. Similarly, when an off-heap BIN refers to + off-heap LNs, only one LRU entry (for the BIN) is used.

            + +

            If this environment uses the shared cache, the return value is the + total for all environments that are sharing the cache.

            +
            +
            See Also:
            +
            Cache Statistics: Debugging
            +
            +
          • +
          + + + +
            +
          • +

            getRelatchesRequired

            +
            public long getRelatchesRequired()
            +
            Returns the number of latch upgrades (relatches) required while + operating on this Environment. Latch upgrades are required when an + operation assumes that a shared (read) latch will be sufficient but + later determines that an exclusive (write) latch will actually be + required.
            +
            +
            Returns:
            +
            number of latch upgrades (relatches) required.
            +
            +
          • +
          + + + +
            +
          • +

            getNOwners

            +
            public int getNOwners()
            +
            Total lock owners in lock table. Only provided when Environment.getStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNReadLocks

            +
            public int getNReadLocks()
            +
            Total read locks currently held. Only provided when Environment.getStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNTotalLocks

            +
            public int getNTotalLocks()
            +
            Total locks currently in lock table. Only provided when Environment.getStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNWaiters

            +
            public int getNWaiters()
            +
            Total transactions waiting for locks. Only provided when Environment.getStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNWriteLocks

            +
            public int getNWriteLocks()
            +
            Total write locks currently held. Only provided when Environment.getStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNRequests

            +
            public long getNRequests()
            +
            Total number of lock requests to date.
            +
          • +
          + + + +
            +
          • +

            getNWaits

            +
            public long getNWaits()
            +
            Total number of lock waits to date.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresNoWaiters

            +
            public int getNAcquiresNoWaiters()
            +
            Number of acquires of lock table latch with no contention.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresSelfOwned

            +
            public int getNAcquiresSelfOwned()
            +
            Number of acquires of lock table latch when it was already owned + by the caller.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresWithContention

            +
            public int getNAcquiresWithContention()
            +
            Number of acquires of lock table latch when it was already owned by + another thread.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresNoWaitSuccessful

            +
            public int getNAcquiresNoWaitSuccessful()
            +
            Number of successful no-wait acquires of the lock table latch.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresNoWaitUnSuccessful

            +
            public int getNAcquiresNoWaitUnSuccessful()
            +
            Number of unsuccessful no-wait acquires of the lock table latch.
            +
          • +
          + + + +
            +
          • +

            getNReleases

            +
            public int getNReleases()
            +
            Number of releases of the lock table latch.
            +
          • +
          + + + +
            +
          • +

            getNBinDeltaGetOps

            +
            public long getNBinDeltaGetOps()
            +
            The number of user (non-internal) Cursor and Database get operations + performed in BIN deltas.
            +
          • +
          + + + +
            +
          • +

            getNBinDeltaInsertOps

            +
            public long getNBinDeltaInsertOps()
            +
            The number of user (non-internal) Cursor and Database insert operations + performed in BIN deltas (these are insertions performed via the various + put methods).
            +
          • +
          + + + +
            +
          • +

            getNBinDeltaUpdateOps

            +
            public long getNBinDeltaUpdateOps()
            +
            The number of user (non-internal) Cursor and Database update operations + performed in BIN deltas (these are updates performed via the various + put methods).
            +
          • +
          + + + +
            +
          • +

            getNBinDeltaDeleteOps

            +
            public long getNBinDeltaDeleteOps()
            +
            The number of user (non-internal) Cursor and Database delete operations + performed in BIN deltas.
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            getSecSearchOps

            +
            public long getSecSearchOps()
            +
            Number of successful secondary DB key search operations. +

            + This operation corresponds to a successful call to SecondaryCursor.get or SecondaryDatabase.get with + Get.SEARCH, Get.SEARCH_GTE, Get.SEARCH_BOTH, or + Get.SEARCH_BOTH_GTE. +

            + Note: Operations are currently counted as secondary DB (rather than + primary DB) operations only if the DB has been opened by the application + as a secondary DB. In particular the stats may be confusing on an HA + replica node if a secondary DB has not been opened by the application on + the replica.

            +
          • +
          + + + +
            +
          • +

            getSecSearchFailOps

            +
            public long getSecSearchFailOps()
            +
            Number of failed secondary DB key search operations. +

            + This operation corresponds to a call to SecondaryCursor.get or SecondaryDatabase.get with Get.SEARCH, Get.SEARCH_GTE, Get.SEARCH_BOTH, or Get.SEARCH_BOTH_GTE, when the specified key is not found in the DB. +

            + Note: Operations are currently counted as secondary DB (rather than + primary DB) operations only if the DB has been opened by the application + as a secondary DB. In particular the stats may be confusing on an HA + replica node if a secondary DB has not been opened by the application on + the replica.

            +
          • +
          + + + + + + + +
            +
          • +

            getSecPositionOps

            +
            public long getSecPositionOps()
            +
            Number of successful secondary DB position operations. +

            + This operation corresponds to a successful call to SecondaryCursor.get or SecondaryDatabase.get with + Get.FIRST, Get.LAST, + Get.NEXT, Get.NEXT_DUP, Get.NEXT_NO_DUP, + Get.PREV, Get.PREV_DUP or Get.PREV_NO_DUP. +

            + Note: Operations are currently counted as secondary DB (rather than + primary DB) operations only if the DB has been opened by the application + as a secondary DB. In particular the stats may be confusing on an HA + replica node if a secondary DB has not been opened by the application on + the replica.

            +
          • +
          + + + +
            +
          • +

            getPriInsertOps

            +
            public long getPriInsertOps()
            +
            Number of successful primary DB insertion operations. +

            + This operation corresponds to a successful call to Cursor.put + or Database.put in one of the following cases: +

            +
          • +
          + + + +
            +
          • +

            getPriInsertFailOps

            +
            public long getPriInsertFailOps()
            +
            Number of failed primary DB insertion operations. +

            + This operation corresponds to a call to Cursor.put or Database.put with Put.NO_OVERWRITE or Put.NO_DUP_DATA, when the key could not be inserted because it + previously existed in the DB.

            +
          • +
          + + + +
            +
          • +

            getSecInsertOps

            +
            public long getSecInsertOps()
            +
            Number of successful secondary DB insertion operations. +

            + This operation corresponds to a successful call to Cursor.put + or Database.put, for a primary DB with an associated + secondary DB. A secondary record is inserted when inserting a primary + record with a non-null secondary key, or when updating a primary record + and the secondary key is changed to to a non-null value that is + different than the previously existing value. +

            + Note: Operations are currently counted as secondary DB (rather than + primary DB) operations only if the DB has been opened by the application + as a secondary DB. In particular the stats may be confusing on an HA + replica node if a secondary DB has not been opened by the application on + the replica.

            +
          • +
          + + + +
            +
          • +

            getPriUpdateOps

            +
            public long getPriUpdateOps()
            +
            Number of successful primary DB update operations. +

            + This operation corresponds to a successful call to Cursor.put + or Database.put in one of the following cases: +

              +
            • + When Put.OVERWRITE is specified and the key previously + existed in the DB. +
            • +
            • + When calling Cursor.put with Put.CURRENT. +
            • +
            +
          • +
          + + + +
            +
          • +

            getSecUpdateOps

            +
            public long getSecUpdateOps()
            +
            Number of successful secondary DB update operations. +

            + This operation corresponds to a successful call to Cursor.put + or Database.put, when a primary record is updated and its + TTL is changed. The associated secondary records must also be updated to + reflect the change in the TTL. +

            + Note: Operations are currently counted as secondary DB (rather than + primary DB) operations only if the DB has been opened by the application + as a secondary DB. In particular the stats may be confusing on an HA + replica node if a secondary DB has not been opened by the application on + the replica.

            +
          • +
          + + + + + + + +
            +
          • +

            getPriDeleteFailOps

            +
            public long getPriDeleteFailOps()
            +
            Number of failed primary DB deletion operations. +

            + This operation corresponds to a call to Database.delete or SecondaryDatabase.delete, when the key could not be deleted because it + did not previously exist in the DB.

            +
          • +
          + + + +
            +
          • +

            getSecDeleteOps

            +
            public long getSecDeleteOps()
            +
            Number of successful secondary DB deletion operations. +

            + This operation corresponds to one of the following API calls: +

            +

            + Note: Operations are currently counted as secondary DB (rather than + primary DB) operations only if the DB has been opened by the application + as a secondary DB. In particular the stats may be confusing on an HA + replica node if a secondary DB has not been opened by the application on + the replica.

            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns a String representation of the stats in the form of + <stat>=<value>
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toStringVerbose

            +
            public java.lang.String toStringVerbose()
            +
            Returns a String representation of the stats which includes stats + descriptions in addition to <stat>=<value>
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/EnvironmentWedgedException.html b/docs/java/com/sleepycat/je/EnvironmentWedgedException.html new file mode 100644 index 0000000..ffe6f46 --- /dev/null +++ b/docs/java/com/sleepycat/je/EnvironmentWedgedException.html @@ -0,0 +1,278 @@ + + + + + +EnvironmentWedgedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class EnvironmentWedgedException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class EnvironmentWedgedException
        +extends EnvironmentFailureException
        +
        Thrown by the Environment.close() when the current process must be + shut down and restarted before re-opening the Environment. +

        + If during close(), a badly behaved internal thread cannot be stopped, + then the JVM process must be stopped and restarted. The close() method first + attempts a soft shutdown of each thread. If that fails to stop the thread, + it is interrupted. If that fails to stop the thread, because it never + becomes interruptible, then EnvironmentWedgedException is thrown by + close(), after performing as much of the normal shutdown process as + possible. Before this exception is thrown, a full thread dump is logged, to + aid in debugging. +

        + Note that prior to calling close(), if JE attempts to shut down an internal + thread and it cannot be shut down, the Environment will be invalidated, also causing an EnvironmentWedgedException to be thrown. In this case (as in all other + cases where an EnvironmentFailureException is thrown and the + Environment is invalidated), the application should call Environment.close(). The close() method will throw EnvironmentWedgedException in this case, as described above. +

        + If the application fails to restart the process when this exception is + thrown, it is likely that re-opening the Environment will not be possible, + or will result in unpredictable behavior. This is because the thread that + stopped may be holding a resource that is needed by the newly opened + Environment.

        +
        +
        Since:
        +
        7.1
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ExceptionEvent.html b/docs/java/com/sleepycat/je/ExceptionEvent.html new file mode 100644 index 0000000..c1e0f4e --- /dev/null +++ b/docs/java/com/sleepycat/je/ExceptionEvent.html @@ -0,0 +1,328 @@ + + + + + +ExceptionEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class ExceptionEvent

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.ExceptionEvent
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class ExceptionEvent
        +extends java.lang.Object
        +
        A class representing an exception event. Contains an exception and the name + of the daemon thread that it was thrown from.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          ExceptionEvent(java.lang.Exception exception) 
          ExceptionEvent(java.lang.Exception exception, + java.lang.String threadName) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.ExceptiongetException() +
          Returns the exception in the event.
          +
          java.lang.StringgetThreadName() +
          Returns the name of the daemon thread that threw the exception.
          +
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ExceptionEvent

            +
            public ExceptionEvent(java.lang.Exception exception,
            +                      java.lang.String threadName)
            +
          • +
          + + + +
            +
          • +

            ExceptionEvent

            +
            public ExceptionEvent(java.lang.Exception exception)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getException

            +
            public java.lang.Exception getException()
            +
            Returns the exception in the event.
            +
          • +
          + + + +
            +
          • +

            getThreadName

            +
            public java.lang.String getThreadName()
            +
            Returns the name of the daemon thread that threw the exception.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ExceptionListener.html b/docs/java/com/sleepycat/je/ExceptionListener.html new file mode 100644 index 0000000..f0ddb4d --- /dev/null +++ b/docs/java/com/sleepycat/je/ExceptionListener.html @@ -0,0 +1,236 @@ + + + + + +ExceptionListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface ExceptionListener

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface ExceptionListener
        +
        A callback to notify the application program when an exception occurs in a + JE Daemon thread.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            exceptionThrown

            +
            void exceptionThrown(ExceptionEvent event)
            +
            This method is called if an exception is seen in a JE Daemon thread.
            +
            +
            Parameters:
            +
            event - the ExceptionEvent representing the exception that was + thrown.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ForeignConstraintException.html b/docs/java/com/sleepycat/je/ForeignConstraintException.html new file mode 100644 index 0000000..d605e1b --- /dev/null +++ b/docs/java/com/sleepycat/je/ForeignConstraintException.html @@ -0,0 +1,283 @@ + + + + + +ForeignConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class ForeignConstraintException

      +
      +
      + +
      + +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ForeignKeyDeleteAction.html b/docs/java/com/sleepycat/je/ForeignKeyDeleteAction.html new file mode 100644 index 0000000..8faaabc --- /dev/null +++ b/docs/java/com/sleepycat/je/ForeignKeyDeleteAction.html @@ -0,0 +1,408 @@ + + + + + +ForeignKeyDeleteAction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum ForeignKeyDeleteAction

      +
      +
      +
        +
      • java.lang.Object
      • +
      • + +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<ForeignKeyDeleteAction>
        +
        +
        +
        +
        public enum ForeignKeyDeleteAction
        +extends java.lang.Enum<ForeignKeyDeleteAction>
        +
        The action taken when a referenced record in the foreign key database is + deleted. + +

        The delete action applies to a secondary database that is configured to + have a foreign key integrity constraint. The delete action is specified by + calling SecondaryConfig.setForeignKeyDeleteAction(com.sleepycat.je.ForeignKeyDeleteAction).

        + +

        When a record in the foreign key database is deleted, it is checked to + see if it is referenced by any record in the associated secondary database. + If the key is referenced, the delete action is applied. By default, the + delete action is ABORT.

        +
        +
        See Also:
        +
        SecondaryConfig
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ABORT +
          When a referenced record in the foreign key database is deleted, abort + the transaction by throwing a DeleteConstraintException.
          +
          CASCADE +
          When a referenced record in the foreign key database is deleted, delete + the primary database record that references it.
          +
          NULLIFY +
          When a referenced record in the foreign key database is deleted, set the + reference to null in the primary database record that references it, + thereby deleting the secondary key.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringtoString() 
          static ForeignKeyDeleteActionvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static ForeignKeyDeleteAction[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + + + + + +
            +
          • +

            CASCADE

            +
            public static final ForeignKeyDeleteAction CASCADE
            +
            When a referenced record in the foreign key database is deleted, delete + the primary database record that references it.
            +
          • +
          + + + +
            +
          • +

            NULLIFY

            +
            public static final ForeignKeyDeleteAction NULLIFY
            +
            When a referenced record in the foreign key database is deleted, set the + reference to null in the primary database record that references it, + thereby deleting the secondary key. @see ForeignKeyNullifier @see + ForeignMultiKeyNullifier
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static ForeignKeyDeleteAction[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (ForeignKeyDeleteAction c : ForeignKeyDeleteAction.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static ForeignKeyDeleteAction valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Enum<ForeignKeyDeleteAction>
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ForeignKeyNullifier.html b/docs/java/com/sleepycat/je/ForeignKeyNullifier.html new file mode 100644 index 0000000..eaedbb4 --- /dev/null +++ b/docs/java/com/sleepycat/je/ForeignKeyNullifier.html @@ -0,0 +1,271 @@ + + + + + +ForeignKeyNullifier (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface ForeignKeyNullifier

      +
      +
      +
      + +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            nullifyForeignKey

            +
            boolean nullifyForeignKey(SecondaryDatabase secondary,
            +                          DatabaseEntry data)
            +                   throws DatabaseException
            +
            Sets the foreign key reference to null in the datum of the primary + database.
            +
            +
            Parameters:
            +
            secondary - the database in which the foreign key integrity + constraint is defined. This parameter is passed for informational + purposes but is not commonly used.
            +
            data - the existing primary datum in which the foreign key + reference should be set to null. This parameter should be updated by + this method if it returns true.
            +
            Returns:
            +
            true if the datum was modified, or false to indicate that the + key is not present.
            +
            Throws:
            +
            DatabaseException - if an error occurs attempting to clear the key + reference.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ForeignMultiKeyNullifier.html b/docs/java/com/sleepycat/je/ForeignMultiKeyNullifier.html new file mode 100644 index 0000000..ed1806a --- /dev/null +++ b/docs/java/com/sleepycat/je/ForeignMultiKeyNullifier.html @@ -0,0 +1,272 @@ + + + + + +ForeignMultiKeyNullifier (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface ForeignMultiKeyNullifier

      +
      +
      +
      + +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            nullifyForeignKey

            +
            boolean nullifyForeignKey(SecondaryDatabase secondary,
            +                          DatabaseEntry key,
            +                          DatabaseEntry data,
            +                          DatabaseEntry secKey)
            +                   throws DatabaseException
            +
            Sets the foreign key reference to null in the datum of the primary + database.
            +
            +
            Parameters:
            +
            secondary - the database in which the foreign key integrity + constraint is defined. This parameter is passed for informational + purposes but is not commonly used.
            +
            key - the existing primary key. This parameter is passed for + informational purposes but is not commonly used.
            +
            data - the existing primary datum in which the foreign key + reference should be set to null. This parameter should be updated by + this method if it returns true.
            +
            secKey - the secondary key to be nullified. This parameter is + needed for knowing which key to nullify when multiple keys are present, + as when SecondaryMultiKeyCreator is used.
            +
            Returns:
            +
            true if the datum was modified, or false to indicate that the + key is not present.
            +
            Throws:
            +
            DatabaseException - if an error occurs attempting to clear the key + reference.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ForwardCursor.html b/docs/java/com/sleepycat/je/ForwardCursor.html new file mode 100644 index 0000000..3865271 --- /dev/null +++ b/docs/java/com/sleepycat/je/ForwardCursor.html @@ -0,0 +1,423 @@ + + + + + +ForwardCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface ForwardCursor

      +
      +
      +
      +
        +
      • +
        +
        All Superinterfaces:
        +
        java.lang.AutoCloseable, java.io.Closeable
        +
        +
        +
        All Known Implementing Classes:
        +
        Cursor, DiskOrderedCursor, JoinCursor, SecondaryCursor
        +
        +
        +
        +
        public interface ForwardCursor
        +extends java.io.Closeable
        +
        The interface for forward-moving Cursor operations. Specific implementations + may modify the documented behavior on each of these methods.
        +
        +
        Since:
        +
        5.0
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDatabase

            +
            Database getDatabase()
            +
            Returns the Database handle associated with this ForwardCursor.
            +
            +
            Returns:
            +
            The Database handle associated with this ForwardCursor.
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            void close()
            +
            Discards the cursor. + +

            The cursor handle may not be used again after this method has been + called, regardless of the method's success or failure.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            OperationResult get(DatabaseEntry key,
            +                    DatabaseEntry data,
            +                    Get getType,
            +                    ReadOptions options)
            +
            Moves the cursor to a record according to the specified Get + type.
            +
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            getType - is Get.NEXT or Get.CURRENT. + interface. Get.CURRENT is permitted only if the cursor is + initialized (positioned on a record).
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + the cursor is uninitialized (not positioned on a record) and this is not + permitted (see above), or the non-transactional cursor was created in a + different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null getType, a null input key/data parameter, + an input key/data parameter with a null data array, a partial key/data + input parameter, and specifying a lock mode of READ_COMMITTED.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + + + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Get.html b/docs/java/com/sleepycat/je/Get.html new file mode 100644 index 0000000..dbfb186 --- /dev/null +++ b/docs/java/com/sleepycat/je/Get.html @@ -0,0 +1,689 @@ + + + + + +Get (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum Get

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<Get>
        • +
        • +
            +
          • com.sleepycat.je.Get
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<Get>
        +
        +
        +
        +
        public enum Get
        +extends java.lang.Enum<Get>
        +
        The operation type passed to "get" methods on databases and cursors.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          CURRENT +
          Accesses the current record.
          +
          FIRST +
          Finds the first record in the database.
          +
          LAST +
          Finds the last record in the database.
          +
          NEXT +
          Moves to the next record.
          +
          NEXT_DUP +
          Moves to the next record with the same key.
          +
          NEXT_NO_DUP +
          Moves to the next record with a different key.
          +
          PREV +
          Moves to the previous record.
          +
          PREV_DUP +
          Moves to the previous record with the same key.
          +
          PREV_NO_DUP +
          Moves to the previous record with a different key.
          +
          SEARCH +
          Searches using an exact match by key.
          +
          SEARCH_BOTH +
          Searches using an exact match by key and data (or pKey).
          +
          SEARCH_BOTH_GTE +
          Searches using an exact match by key and a GTE match by data (or pKey).
          +
          SEARCH_GTE +
          Searches using a GTE match by key.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static GetvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static Get[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            SEARCH

            +
            public static final Get SEARCH
            +
            Searches using an exact match by key. + +

            Returns, or moves the cursor to, the record having a key exactly + matching the given key parameter.

            + +

            If the database has duplicate keys, the record with the matching key + and lowest data value (or the lowest primary key, for secondary + databases) is selected.

            + +

            The operation does not succeed if no record matches.

            +
          • +
          + + + +
            +
          • +

            SEARCH_BOTH

            +
            public static final Get SEARCH_BOTH
            +
            Searches using an exact match by key and data (or pKey). + +

            Returns, or moves the cursor to, the record having a key exactly + matching the given key parameter, and having a data value (or primary + key) exactly matching the given data (or pKey) parameter. The data is + matched for Database and Cursor operations, while the primary key is + matched for SecondaryDatabase and SecondaryCursor operations.

            + +

            If the database has duplicate keys, the search is performed by key + and data (or pKey) using the database Btree. If the database has does + not have duplicate keys, the search is performed by key alone using the + Btree, and then the data (or primary key) of the matching record is + simply compared to the data (pKey) parameter. In other words, using + this operation has no performance advantage over SEARCH when + the database does not have duplicates.

            + +

            The operation does not succeed (null is returned) if no record + matches.

            +
          • +
          + + + +
            +
          • +

            SEARCH_GTE

            +
            public static final Get SEARCH_GTE
            +
            Searches using a GTE match by key. + +

            Returns, or moves the cursor to, the record with a key that is + greater than or equal to (GTE) the given key parameter.

            + +

            If the database has duplicate keys, the record with the lowest data + value (or the lowest primary key, for a secondary database) is selected + among the duplicates with the matching key.

            + +

            The operation does not succeed (null is returned) if no record + matches.

            +
          • +
          + + + +
            +
          • +

            SEARCH_BOTH_GTE

            +
            public static final Get SEARCH_BOTH_GTE
            +
            Searches using an exact match by key and a GTE match by data (or pKey). + +

            Returns, or moves the cursor to, the record with a key exactly + matching the given key parameter, and having a data value (or primary + key) that is greater than or equal to (GTE) the given data (or pKey) + parameter. The data is matched for Database and Cursor operations, while + the primary key is matched for SecondaryDatabase and SecondaryCursor + operations.

            + +

            If the database does not have duplicate keys, the data (or pKey) is + matched exactly and this operation is equivalent to SEARCH_BOTH.

            + +

            The operation does not succeed (null is returned) if no record + matches.

            +
          • +
          + + + +
            +
          • +

            CURRENT

            +
            public static final Get CURRENT
            +
            Accesses the current record. + +

            Accesses the record at the current cursor position. If the cursor is + uninitialized (not positioned on a record), IllegalStateException is thrown.

            + +

            The operation does not succeed (null is returned) if the record at + the current position has been deleted. This can occur in two cases: 1. + If the record was deleted using this cursor and then accessed. 2. If the + record was not locked by this cursor or transaction, and was deleted by + another thread or transaction after this cursor was positioned on + it.

            +
          • +
          + + + +
            +
          • +

            FIRST

            +
            public static final Get FIRST
            +
            Finds the first record in the database. + +

            Moves the cursor to the record in the database with the lowest valued + key.

            + +

            If the database has duplicate keys, the record with the lowest data + value (or the lowest primary key, for a secondary database) is selected + among the duplicates for the lowest key.

            + +

            The operation does not succeed (null is returned) if the database is + empty.

            +
          • +
          + + + +
            +
          • +

            LAST

            +
            public static final Get LAST
            +
            Finds the last record in the database. + +

            Moves the cursor to the record in the database with the highest + valued key.

            + +

            If the database has duplicate keys, the record with the highest data + value (or the highest primary key, for a secondary database) is selected + among the duplicates for the highest key.

            + +

            The operation does not succeed (null is returned) if the database is + empty.

            +
          • +
          + + + +
            +
          • +

            NEXT

            +
            public static final Get NEXT
            +
            Moves to the next record. + +

            Moves the cursor to the record following the record at the current + cursor position. If the cursor is uninitialized (not positioned on a + record), moves to the first record and this operation is equivalent to + FIRST.

            + +

            If the database does not have duplicate keys, the following record is + defined as the record with the next highest key. If the database does + have duplicate keys, the following record is defined as the record with + the same key and the next highest data value (or the next highest + primary key, for a secondary database) among the duplicates for that + key; or if there are no more records with the same key, the following + record is the record with the next highest key and the lowest data value + (or the lowest primary key, for a secondary database) among the + duplicates for that key.

            + +

            The operation does not succeed (null is returned) if the record at + the cursor position is the last record in the database.

            +
          • +
          + + + +
            +
          • +

            NEXT_DUP

            +
            public static final Get NEXT_DUP
            +
            Moves to the next record with the same key. + +

            Moves the cursor to the record following the record at the current + cursor position and having the same key. If the cursor is uninitialized + (not positioned on a record), IllegalStateException is + thrown.

            + +

            If the database has duplicate keys, moves to the record with the same + key and the next highest data value (or the next highest primary key, + for a secondary database) among the duplicates for that key.

            + +

            The operation does not succeed (null is returned) if there are no + following records with the same key. This is always the case when + database does not have duplicate keys.

            +
          • +
          + + + +
            +
          • +

            NEXT_NO_DUP

            +
            public static final Get NEXT_NO_DUP
            +
            Moves to the next record with a different key. + +

            Moves the cursor to the record following the record at the current + cursor position and having the next highest key. If the cursor is + uninitialized (not positioned on a record), moves to the first record + and this operation is equivalent to FIRST.

            + +

            If the database has duplicate keys, moves to the record with the next + highest key and the lowest data value (or the lowest primary key, for a + secondary database) among the duplicates for that key; this effectively + skips over records having the same key and a higher data value (or a + higher primary key, for a secondary database). If the database does not + have duplicate keys, this operation is equivalent to NEXT.

            + +

            The operation does not succeed (null is returned) if there are no + following records with a different key.

            +
          • +
          + + + +
            +
          • +

            PREV

            +
            public static final Get PREV
            +
            Moves to the previous record. + +

            Moves the cursor to the record preceding the record at the current + cursor position. If the cursor is uninitialized (not positioned on a + record), moves to the last record and this operation is equivalent to + LAST.

            + +

            If the database does not have duplicate keys, the preceding record is + defined as the record with the next lowest key. If the database does + have duplicate keys, the preceding record is defined as the record with + the same key and the next lowest data value (or the next lowest primary + key, for a secondary database) among the duplicates for that key; or if + there are no preceding records with the same key, the preceding record + is the record with the next lowest key and the highest data value (or + the highest primary key, for a secondary database) among the duplicates + for that key.

            + +

            The operation does not succeed (null is returned) if the record at + the cursor position is the first record in the database.

            +
          • +
          + + + +
            +
          • +

            PREV_DUP

            +
            public static final Get PREV_DUP
            +
            Moves to the previous record with the same key. + +

            Moves the cursor to the record preceding the record at the current + cursor position and having the same key. If the cursor is uninitialized + (not positioned on a record), IllegalStateException is + thrown.

            + +

            If the database has duplicate keys, moves to the record with the same + key and the next lowest data value (or the next lowest primary key, for + a secondary database) among the duplicates for that key.

            + +

            The operation does not succeed (null is returned) if there are no + preceding records with the same key. This is always the case when + database does not have duplicate keys.

            +
          • +
          + + + +
            +
          • +

            PREV_NO_DUP

            +
            public static final Get PREV_NO_DUP
            +
            Moves to the previous record with a different key. + +

            Moves the cursor to the record preceding the record at the current + cursor position and having the next lowest key. If the cursor is + uninitialized (not positioned on a record), moves to the last record + and this operation is equivalent to LAST.

            + +

            If the database has duplicate keys, moves to the record with the next + lowest key and the highest data value (or the highest primary key, for a + secondary database) among the duplicates for that key; this effectively + skips over records having the same key and a lower data value (or a + lower primary key, for a secondary database). If the database does not + have duplicate keys, this operation is equivalent to PREV.

            + +

            The operation does not succeed (null is returned) if there are no + preceding records with a different key.

            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static Get[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (Get c : Get.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static Get valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/JEVersion.html b/docs/java/com/sleepycat/je/JEVersion.html new file mode 100644 index 0000000..d03fe9d --- /dev/null +++ b/docs/java/com/sleepycat/je/JEVersion.html @@ -0,0 +1,484 @@ + + + + + +JEVersion (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class JEVersion

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.JEVersion
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<JEVersion>
        +
        +
        +
        +
        public class JEVersion
        +extends java.lang.Object
        +implements java.lang.Comparable<JEVersion>, java.io.Serializable
        +
        Berkeley DB Java Edition version information. Versions consist of major, + minor and patch numbers. +

        + There is one JEVersion object per running JVM and it may be accessed using + the static field JEVersion.CURRENT_VERSION.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static JEVersionCURRENT_VERSION +
          Release version.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          JEVersion(java.lang.String version) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intcompareTo(JEVersion comparedVersion) 
          booleanequals(java.lang.Object o) 
          intgetMajor() +
          Major number of the release version.
          +
          intgetMinor() +
          Minor number of the release version.
          +
          java.lang.StringgetNumericVersionString() +
          The numeric version string, without the patch tag.
          +
          intgetPatch() +
          Patch number of the release version.
          +
          java.lang.StringgetVersionString() +
          Release version, suitable for display.
          +
          inthashCode() 
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            CURRENT_VERSION

            +
            public static final JEVersion CURRENT_VERSION
            +
            Release version.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JEVersion

            +
            public JEVersion(java.lang.String version)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            getMajor

            +
            public int getMajor()
            +
            Major number of the release version.
            +
            +
            Returns:
            +
            The major number of the release version.
            +
            +
          • +
          + + + +
            +
          • +

            getMinor

            +
            public int getMinor()
            +
            Minor number of the release version.
            +
            +
            Returns:
            +
            The minor number of the release version.
            +
            +
          • +
          + + + +
            +
          • +

            getPatch

            +
            public int getPatch()
            +
            Patch number of the release version.
            +
            +
            Returns:
            +
            The patch number of the release version.
            +
            +
          • +
          + + + +
            +
          • +

            getNumericVersionString

            +
            public java.lang.String getNumericVersionString()
            +
            The numeric version string, without the patch tag.
            +
            +
            Returns:
            +
            The release version
            +
            +
          • +
          + + + +
            +
          • +

            getVersionString

            +
            public java.lang.String getVersionString()
            +
            Release version, suitable for display.
            +
            +
            Returns:
            +
            The release version, suitable for display.
            +
            +
          • +
          + + + +
            +
          • +

            compareTo

            +
            public int compareTo(JEVersion comparedVersion)
            +
            +
            Specified by:
            +
            compareTo in interface java.lang.Comparable<JEVersion>
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object o)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/JoinConfig.html b/docs/java/com/sleepycat/je/JoinConfig.html new file mode 100644 index 0000000..306d718 --- /dev/null +++ b/docs/java/com/sleepycat/je/JoinConfig.html @@ -0,0 +1,436 @@ + + + + + +JoinConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class JoinConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.JoinConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class JoinConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        The configuration properties of a JoinCursor. The join cursor + configuration is specified when calling Database.join. + +

        To create a configuration object with default attributes:

        + +
        +     JoinConfig config = new JoinConfig();
        + 
        + +

        To set custom attributes:

        + +
        +     JoinConfig config = new JoinConfig();
        +     config.setNoSort(true);
        + 
        +
        +
        See Also:
        +
        Database.join, +JoinCursor
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static JoinConfigDEFAULT +
          Default configuration used if null is passed to Database.join.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          JoinConfig() +
          Creates an instance with the system's default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          JoinConfigclone() +
          Returns a copy of this configuration object.
          +
          booleangetNoSort() +
          Returns whether automatic sorting of the input cursors is disabled.
          +
          JoinConfigsetNoSort(boolean noSort) +
          Specifies whether automatic sorting of the input cursors is disabled.
          +
          java.lang.StringtoString() +
          Returns the values for each configuration attribute.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JoinConfig

            +
            public JoinConfig()
            +
            Creates an instance with the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setNoSort

            +
            public JoinConfig setNoSort(boolean noSort)
            +
            Specifies whether automatic sorting of the input cursors is disabled. + +

            Joined values are retrieved by doing a sequential iteration over the + first cursor in the cursor array, and a nested iteration over each + following cursor in the order they are specified in the array. This + requires database traversals to search for the current datum in all the + cursors after the first. For this reason, the best join performance + normally results from sorting the cursors from the one that refers to + the least number of data items to the one that refers to the + most. Unless this method is called with true, Database.join + does this sort on behalf of its caller using the Cursor.countEstimate() method.

            + +

            If the data are structured so that cursors with many data items also + share many common elements, higher performance will result from listing + those cursors before cursors with fewer data items; that is, a sort + order other than the default. Calling this method permits applications + to perform join optimization prior to calling + Database.join.

            +
            +
            Parameters:
            +
            noSort - whether automatic sorting of the input cursors is + disabled.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            Database.join
            +
            +
          • +
          + + + +
            +
          • +

            getNoSort

            +
            public boolean getNoSort()
            +
            Returns whether automatic sorting of the input cursors is disabled.
            +
            +
            Returns:
            +
            whether automatic sorting of the input cursors is disabled.
            +
            See Also:
            +
            setNoSort(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public JoinConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/JoinCursor.html b/docs/java/com/sleepycat/je/JoinCursor.html new file mode 100644 index 0000000..a6f9008 --- /dev/null +++ b/docs/java/com/sleepycat/je/JoinCursor.html @@ -0,0 +1,558 @@ + + + + + +JoinCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class JoinCursor

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.JoinCursor
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ForwardCursor, java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class JoinCursor
        +extends java.lang.Object
        +implements ForwardCursor, java.io.Closeable
        +
        A specialized join cursor for use in performing equality or natural joins on + secondary indices. + +

        A join cursor is returned when calling Database.join.

        + +

        To open a join cursor using two secondary cursors:

        + +
        +     Transaction txn = ...
        +     Database primaryDb = ...
        +     SecondaryDatabase secondaryDb1 = ...
        +     SecondaryDatabase secondaryDb2 = ...
        +     

        + SecondaryCursor cursor1 = null; + SecondaryCursor cursor2 = null; + JoinCursor joinCursor = null; + try { + DatabaseEntry key = new DatabaseEntry(); + DatabaseEntry data = new DatabaseEntry(); +

        + cursor1 = secondaryDb1.openSecondaryCursor(txn, null); + cursor2 = secondaryDb2.openSecondaryCursor(txn, null); +

        + key.setData(...); // initialize key for secondary index 1 + OperationStatus status1 = + cursor1.getSearchKey(key, data, LockMode.DEFAULT); + key.setData(...); // initialize key for secondary index 2 + OperationStatus status2 = + cursor2.getSearchKey(key, data, LockMode.DEFAULT); +

        + if (status1 == OperationStatus.SUCCESS && + status2 == OperationStatus.SUCCESS) { +

        + SecondaryCursor[] cursors = {cursor1, cursor2}; + joinCursor = primaryDb.join(cursors, null); +

        + while (true) { + OperationStatus joinStatus = joinCursor.getNext(key, data, + LockMode.DEFAULT); + if (joinStatus == OperationStatus.SUCCESS) { + // Do something with the key and data. + } else { + break; + } + } + } + } finally { + if (cursor1 != null) { + cursor1.close(); + } + if (cursor2 != null) { + cursor2.close(); + } + if (joinCursor != null) { + joinCursor.close(); + } + } +

        + +

        The join algorithm is described here so that its cost can be estimated and + compared to other approaches for performing a query. Say that N cursors are + provided for the join operation. According to the order they appear in the + array the cursors are labeled C(1) through C(n), and the keys at each cursor + position are labeled K(1) through K(n).

        + +
          + +
        1. Using C(1), the join algorithm iterates sequentially through all records + having K(1). This iteration is equivalent to a Cursor.getNextDup operation on the secondary index. The primary key of a + candidate record is determined in this manner. The primary record itself is + not retrieved and the primary database is not accessed.
        2. + +
        3. For each candidate primary key found in step 1, a Btree lookup is + performed using C(2) through C(n), in that order. The Btree lookups are + exact searches to determine whether the candidate record also contains + secondary keys K(2) through K(n). The lookups are equivalent to a Cursor.getSearchBoth operation on the secondary index. + The primary record itself is not retrieved and the primary database is not + accessed.
        4. + +
        5. If any lookup in step 2 fails, the algorithm advances to the next + candidate record using C(1). Lookups are performed in the order of the + cursor array, and the algorithm proceeds to the next C(1) candidate key as + soon as a single lookup fails.
        6. + +
        7. If all lookups in step 2 succeed, then the matching key and/or data is + returned by the getNext method. If the getNext(DatabaseEntry,DatabaseEntry,LockMode) method signature is used, + then the primary database is read to obtain the record data, as if Cursor.getSearchKey were called for the primary + database. If the getNext(DatabaseEntry,LockMode) method signature + is used, then only the primary key is returned and the primary database is + not accessed.
        8. + +
        9. The algorithm ends when C(1) has no more candidate records with K(1), + and the getNext method will then return OperationStatus.NOTFOUND.
        10. + +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws DatabaseException
            +
            Closes the cursors that have been opened by this join cursor. + +

            The cursors passed to Database.join are not + closed by this method, and should be closed by the caller.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface ForwardCursor
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getDatabase

            +
            public Database getDatabase()
            +
            Returns the primary database handle associated with this cursor.
            +
            +
            Specified by:
            +
            getDatabase in interface ForwardCursor
            +
            Returns:
            +
            the primary database handle associated with this cursor.
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public JoinConfig getConfig()
            +
            Returns this object's configuration.
            +
            +
            Returns:
            +
            this object's configuration.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationResult get(DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Returns the next primary key and data resulting from the join operation.
            +
            +
            Specified by:
            +
            get in interface ForwardCursor
            +
            Parameters:
            +
            getType - is Get.NEXT.
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getNext

            +
            public OperationStatus getNext(DatabaseEntry key,
            +                               LockMode lockMode)
            +
            Returns the next primary key resulting from the join operation. + +

            An entry is returned by the join cursor for each primary key/data + pair having all secondary key values that were specified using the array + of secondary cursors passed to Database.join.

            +
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LockConflictException.html b/docs/java/com/sleepycat/je/LockConflictException.html new file mode 100644 index 0000000..81f99d8 --- /dev/null +++ b/docs/java/com/sleepycat/je/LockConflictException.html @@ -0,0 +1,420 @@ + + + + + +LockConflictException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class LockConflictException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        DeadlockException, LockNotAvailableException, LockPreemptedException, LockTimeoutException, TransactionTimeoutException
        +
        +
        +
        +
        public abstract class LockConflictException
        +extends OperationFailureException
        +
        The common base class for all exceptions that result from record lock + conflicts during read and write operations. + +

        This exception normally indicates that a transaction may be retried. + Catching this exception, rather than its subclasses, is convenient and + recommended for handling lock conflicts and performing transaction retries + in a general purpose manner. See below for information on performing + transaction retries.

        + +

        The exception carries two arrays of transaction ids, one of the owners and + the other of the waiters, at the time of the lock conflict. This + information may be used along with the Transaction + ID for diagnosing locking problems. See getOwnerTxnIds() and getWaiterTxnIds().

        + +

        The Transaction handle is invalidated as a result of this + exception.

        + +

        Performing Transaction Retries

        + +

        If a lock conflict occurs during a transaction, the transaction may be + retried by performing the following steps. Some applications may also wish + to sleep for a short interval before retrying, to give other concurrent + transactions a chance to finish and release their locks.

        +
          +
        1. Close all cursors opened under the transaction.
        2. +
        3. Abort the transaction.
        4. +
        5. Begin a new transaction and repeat the operations.
        6. +
        + +

        To handle LockConflictException reliably for all types of JE + applications including JE-HA applications, it is important to handle it when + it is thrown by all Database and Cursor read and write + operations.

        + +

        The following example code illustrates the recommended approach. Note + that the Environment.beginTransaction and Transaction.commit + calls are intentially inside the try block. When using JE-HA, this + will make it easy to add a catch for other exceptions that can be + resolved by retrying the transaction, such as consistency exceptions.

        + +
        +  void doTransaction(final Environment env,
        +                     final Database db1,
        +                     final Database db2,
        +                     final int maxTries)
        +      throws DatabaseException {
        +
        +      boolean success = false;
        +      long sleepMillis = 0;
        +      for (int i = 0; i < maxTries; i++) {
        +          // Sleep before retrying.
        +          if (sleepMillis != 0) {
        +              Thread.sleep(sleepMillis);
        +              sleepMillis = 0;
        +          }
        +          Transaction txn = null;
        +          try {
        +              txn = env.beginTransaction(null, null);
        +              final Cursor cursor1 = db1.openCursor(txn, null);
        +              try {
        +                  final Cursor cursor2 = db2.openCursor(txn, null);
        +                  try {
        +                      // INSERT APP-SPECIFIC CODE HERE:
        +                      // Perform read and write operations.
        +                  } finally {
        +                      cursor2.close();
        +                  }
        +              } finally {
        +                  cursor1.close();
        +              }
        +              txn.commit();
        +              success = true;
        +              return;
        +          } catch (LockConflictException e) {
        +              sleepMillis = LOCK_CONFLICT_RETRY_SEC * 1000;
        +              continue;
        +          } finally {
        +              if (!success) {
        +                  if (txn != null) {
        +                      txn.abort();
        +                  }
        +              }
        +          }
        +      }
        +      // INSERT APP-SPECIFIC CODE HERE:
        +      // Transaction failed, despite retries.
        +      // Take some app-specific course of action.
        +  }
        + +

        For more information on transactions and lock conflicts, see Writing Transactional Applications.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          long[]getOwnerTxnIds() +
          Returns an array of longs containing transaction ids of owners at the + the time of the timeout.
          +
          long[]getWaiterTxnIds() +
          Returns an array of longs containing transaction ids of waiters at the + the time of the timeout.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getOwnerTxnIds

            +
            public long[] getOwnerTxnIds()
            +
            Returns an array of longs containing transaction ids of owners at the + the time of the timeout.
            +
            +
            Returns:
            +
            an array of longs containing transaction ids of owners at the + the time of the timeout.
            +
            +
          • +
          + + + +
            +
          • +

            getWaiterTxnIds

            +
            public long[] getWaiterTxnIds()
            +
            Returns an array of longs containing transaction ids of waiters at the + the time of the timeout.
            +
            +
            Returns:
            +
            an array of longs containing transaction ids of waiters at the + the time of the timeout.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LockMode.html b/docs/java/com/sleepycat/je/LockMode.html new file mode 100644 index 0000000..1f7d4dc --- /dev/null +++ b/docs/java/com/sleepycat/je/LockMode.html @@ -0,0 +1,704 @@ + + + + + +LockMode (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum LockMode

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<LockMode>
        • +
        • +
            +
          • com.sleepycat.je.LockMode
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<LockMode>
        +
        +
        +
        +
        public enum LockMode
        +extends java.lang.Enum<LockMode>
        +
        Record lock modes for read operations. Lock mode parameters may be specified + for all operations that retrieve data. + +

        Locking Rules

        + +

        Together with CursorConfig, TransactionConfig and EnvironmentConfig settings, lock mode parameters determine how records are + locked during read operations. Record locking is used to enforce the + isolation modes that are configured. Record locking is summarized below for + read and write operations. For more information on isolation levels and + transactions, see Writing Transactional Applications.

        + +

        With one exception, a record lock is always acquired when a record is + read or written, and a cursor will always hold the lock as long as it is + positioned on the record. The exception is when READ_UNCOMMITTED + is specified, which allows a record to be read without any locking.

        + +

        Both read (shared) and write (exclusive) locks are used. Read locks are + normally acquired on read (get method) operations and write locks on + write (put method) operations. The only exception is that a write + lock will be acquired on a read operation if RMW is specified.

        + +

        Because read locks are shared, multiple accessors may read the same + record. Because write locks are exclusive, if a record is written by one + accessor it may not be read or written by another accessor. An accessor is + either a transaction or a thread (for non-transactional operations).

        + +

        Whether additional locking is performed and how locks are released depend + on whether the operation is transactional and other configuration + settings.

        + +

        Transactional Locking

        + +

        Transactional operations include all write operations for a transactional + database, and read operations when a non-null Transaction parameter + is passed. When a null transaction parameter is passed for a write + operation for a transactional database, an auto-commit transaction is + automatically used.

        + +

        With transactions, read and write locks are normally held until the end + of the transaction (commit or abort). Write locks are always held until the + end of the transaction. However, if READ_COMMITTED is configured, + then read locks for cursor operations are only held during the operation and + while the cursor is positioned on the record. The read lock is released + when the cursor is moved to a different record or closed. When READ_COMMITTED is used for a database (non-cursor) operation, the read + lock is released before the method returns.

        + +

        When neither READ_UNCOMMITTED nor READ_COMMITTED is + specified, read and write locking as described above provide Repeatable Read + isolation, which is the default transactional isolation level. If + Serializable isolation is configured, additional "next key" locking is + performed to prevent "phantoms" -- records that are not visible at one point + in a transaction but that become visible at a later point after being + inserted by another transaction. Serializable isolation is configured via + TransactionConfig.setSerializableIsolation(boolean) or EnvironmentConfig.setTxnSerializableIsolation(boolean).

        + +

        Non-Transactional Locking

        + +

        Non-transactional operations include all operations for a + non-transactional database (including a Deferred Write database), and read + operations for a transactional database when a null Transaction + parameter is passed.

        + +

        For non-transactional operations, both read and write locks are only held + while a cursor is positioned on the record, and are released when the cursor + is moved to a different record or closed. For database (non-cursor) + operations, the read or write lock is released before the method + returns.

        + +

        This behavior is similar to READ_COMMITTED, except that both + read and write locks are released. Configuring READ_COMMITTED for + a non-transactional database cursor has no effect.

        + +

        Because the current thread is the accessor (locker) for non-transactional + operations, a single thread may have multiple cursors open without locking + conflicts. Two non-transactional cursors in the same thread may access the + same record via write or read operations without conflicts, and the changes + make by one cursor will be visible to the other cursor.

        + +

        However, a non-transactional operation will conflict with a transactional + operation for the same record even when performed in the same thread. When + using a transaction in a particular thread for a particular database, to + avoid conflicts you should use that transaction for all access to that + database in that thread. In other words, to avoid conflicts always pass the + transaction parameter, not null, for all operations. If you don't wish to + hold the read lock for the duration of the transaction, specify READ_COMMITTED.

        + +

        Read Uncommitted (Dirty-Read)

        + +

        When READ_UNCOMMITTED is configured, no locking is performed + by a read operation. READ_UNCOMMITTED does not apply to write + operations.

        + +

        READ_UNCOMMITTED is sometimes called dirty-read because records + are visible to the caller in their current state in the Btree at the time of + the read, even when that state is due to operations performed using a + transaction that has not yet committed. In addition, because no lock is + acquired by the dirty read operation, the record's state may change at any + time, even while a cursor used to do the dirty-read is still positioned on + the record.

        + +

        To illustrate this, let's say a record is read with dirty-read + (READ_UNCOMMITTED) by calling Cursor.getNext + with a cursor C, and changes to the record are also being made in another + thread using transaction T. When a locking (non-dirty-read) call to Cursor.getCurrent is subsequently made to read the same + record again with C at the current position, a result may be returned that + is different than the result returned by the earlier call to getNext. For example: +

          +
        • If the record is updated by T after the dirty-read getNext + call, and T is committed, a subsequent call to getCurrent will + return the data updated by T.
        • + +
        • If the record is updated by T before the dirty-read getNext + call, the getNext will returned the data updated by T. But if + call, the getNext will return the data updated by T. But if + T is then aborted, a subsequent call to getCurrent will return + the version of the data before it was updated by T.
        • + +
        • If the record was inserted by T before the dirty-read getNext call, the getNext call will return the inserted record. + But if T is aborted, a subsequent call to getCurrent will return + OperationStatus.KEYEMPTY.
        • + +
        • If the record is deleted by T after the dirty-read getNext + call, and T is committed, a subsequent call to getCurrent will + return OperationStatus.KEYEMPTY.
        • +
        +

        + +

        Note that deleted records are handled specially in JE. Deleted records + remain in the Btree until after the deleting transaction is committed, and + they are removed from the Btree asynchronously (not immediately at commit + time). When using #READ_UNCOMMITTED, any record encountered in the + Btree that was previously deleted, whether or not the deleting transaction + has been committed, will be ignored (skipped over) by the read operation. + Of course, if the deleting transaction is aborted, the record will no longer + be deleted. If the application is scanning records, for example, this means + that such records may be skipped by the scan. If this behavior is not + desirable, READ_UNCOMMITTED_ALL may be used instead. This mode + ensures that records deleted by a transaction that is later aborted will not + be skipped by a read operation. This is accomplished in two different ways + depending on the type of database and whether the record's data is requested + by the operation. +

          +
        1. If the DB is configured for duplicates or the record's data + is not requested, then a record that has been deleted by an open + transaction is returned by the read operation.
        2. + +
        3. If the DB is not configured for duplicates and the record's data is + requested, then the read operation must wait for the deleting + transaction to close (commit or abort). After the transaction is + closed, the record will be returned if it is actually not deleted and + otherwise will be skipped.
        4. +
        + +

        By "record data" we mean both the data parameter for a regular or + primary DB, and the pKey parameter for a secondary DB. By "record + data requested" we mean that all or part of the DatabaseEntry will + be returned by the read operation. Unless explicitly not + requested, the complete DatabaseEntry is returned. See + Using Partial DatabaseEntry + Parameters for more information.

        + +

        Because of this difference in behavior, although #READ_UNCOMMITTED is fully non-blocking, #READ_UNCOMMITTED_ALL is + not (under the conditions described). As a result, when using #READ_UNCOMMITTED_ALL under these conditions, a LockConflictException will be thrown when blocking results in a deadlock or + lock timeout.

        + +

        To summarize, callers that use READ_UNCOMMITTED or #READ_UNCOMMITTED_ALL should be prepared for the following behaviors. +

          +
        • After a successful dirty-read operation, because no lock is acquired + the record can be changed by another transaction, even when the cursor + used to perform the dirty-read operation is still positioned on the + record.
        • + +
        • After a successful dirty-read operation using a cursor C, say that + another transaction T deletes the record, and T is committed. In this + case, OperationStatus.KEYEMPTY will be returned by the following + methods if they are called while C is still positioned on the deleted + record: Cursor.getCurrent, Cursor.putCurrent and Cursor.delete.
        • + +
        • When using READ_UNCOMMITTED, deleted records will be skipped + even when the deleting transaction is still open. No blocking will occur + and LockConflictException is never thrown when using this + mode.
        • + +
        • When using #READ_UNCOMMITTED_ALL, deleted records will not + be skipped even when the deleting transaction is open. If the DB is a + duplicates DB or the record's data is not requested, the deleted record + will be returned. If the DB is not a duplicates DB and the record's + data is requested, blocking will occur until the deleting transaction is + closed. In the latter case, LockConflictException will be thrown + when this blocking results in a deadlock or a lock timeout.
        • +
        +

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          DEFAULT +
          Uses the default lock mode and is equivalent to passing null for + the lock mode parameter.
          +
          READ_COMMITTED +
          Read committed isolation provides for cursor stability but not + repeatable reads.
          +
          READ_UNCOMMITTED +
          Reads modified but not yet committed data.
          +
          READ_UNCOMMITTED_ALL +
          Reads modified but not yet committed data, ensuring that records are not + skipped due to transaction aborts.
          +
          RMW +
          Acquire write locks instead of read locks when doing the retrieval.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          ReadOptionstoReadOptions() +
          Returns a ReadOptions with this LockMode property, and default values + for all other properties.
          +
          java.lang.StringtoString() 
          static LockModevalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static LockMode[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + + + + + +
            +
          • +

            READ_UNCOMMITTED

            +
            public static final LockMode READ_UNCOMMITTED
            +
            Reads modified but not yet committed data. + +

            The Read Uncommitted mode is used if this lock mode is explicitly + passed for the lock mode parameter, or if null or DEFAULT is + passed and Read Uncommitted is the default -- see DEFAULT for + details.

            + +

            Unlike READ_UNCOMMITTED_ALL, deleted records will be skipped + even when the deleting transaction is still open. No blocking will occur + and LockConflictException is never thrown when using this + mode.

            + +

            See the locking rules for information on how Read + Uncommitted impacts transactional and non-transactional locking.

            +
          • +
          + + + +
            +
          • +

            READ_UNCOMMITTED_ALL

            +
            public static final LockMode READ_UNCOMMITTED_ALL
            +
            Reads modified but not yet committed data, ensuring that records are not + skipped due to transaction aborts. + +

            The Read Uncommitted mode is used only when this lock mode is + explicitly passed for the lock mode parameter.

            + +

            Unlike READ_UNCOMMITTED, deleted records will not be skipped + even when the deleting transaction is open. If the DB is a duplicates DB + or the record's data is not requested, the deleted record will be + returned. If the DB is not a duplicates DB and the record's data is + requested, blocking will occur until the deleting transaction is closed. + In the latter case, LockConflictException will be thrown when + this blocking results in a deadlock or a lock timeout.

            + +

            See the locking rules for information on how Read + Uncommitted impacts transactional and non-transactional locking.

            +
          • +
          + + + +
            +
          • +

            READ_COMMITTED

            +
            public static final LockMode READ_COMMITTED
            +
            Read committed isolation provides for cursor stability but not + repeatable reads. Data items which have been previously read by this + transaction may be deleted or modified by other transactions before the + cursor is closed or the transaction completes. + +

            Note that this LockMode may only be passed to Database get + methods, not to Cursor methods. To configure a cursor for Read + Committed isolation, use CursorConfig.setReadCommitted(boolean).

            + +

            See the locking rules for information on how Read + Committed impacts transactional and non-transactional locking.

            +
            +
            See Also:
            +
            Cache + Statistics: Unexpected Sizes
            +
            +
          • +
          + + + +
            +
          • +

            RMW

            +
            public static final LockMode RMW
            +
            Acquire write locks instead of read locks when doing the retrieval. + +

            Because it causes a write lock to be acquired, specifying this lock + mode as a Cursor or Database get (read) method + parameter will override the Read Committed or Read Uncommitted isolation + mode that is configured using CursorConfig or TransactionConfig. The write lock will acquired and held until the end + of the transaction. For non-transactional use, the write lock will be + released when the cursor is moved to a new position or closed.

            + +

            Setting this flag can eliminate deadlock during a read-modify-write + cycle by acquiring the write lock during the read part of the cycle so + that another thread of control acquiring a read lock for the same item, + in its own read-modify-write cycle, will not result in deadlock.

            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static LockMode[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (LockMode c : LockMode.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static LockMode valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            toReadOptions

            +
            public ReadOptions toReadOptions()
            +
            Returns a ReadOptions with this LockMode property, and default values + for all other properties. + +

            WARNING: Do not modify the returned object, since it is a singleton.

            +
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Enum<LockMode>
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LockNotAvailableException.html b/docs/java/com/sleepycat/je/LockNotAvailableException.html new file mode 100644 index 0000000..faddcd4 --- /dev/null +++ b/docs/java/com/sleepycat/je/LockNotAvailableException.html @@ -0,0 +1,273 @@ + + + + + +LockNotAvailableException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class LockNotAvailableException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class LockNotAvailableException
        +extends LockConflictException
        +
        Thrown when a non-blocking operation fails to get a lock. Non-blocking + transactions are configured using TransactionConfig.setNoWait(boolean). + +

        The Transaction handle is not invalidated as a result of + this exception.

        + +

        Normally, applications should catch the base class LockConflictException rather than catching one of its subclasses. All lock + conflicts are typically handled in the same way, which is normally to abort + and retry the transaction. See LockConflictException for more + information.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LockNotGrantedException.html b/docs/java/com/sleepycat/je/LockNotGrantedException.html new file mode 100644 index 0000000..c316ecf --- /dev/null +++ b/docs/java/com/sleepycat/je/LockNotGrantedException.html @@ -0,0 +1,284 @@ + + + + + +LockNotGrantedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class LockNotGrantedException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LockStats.html b/docs/java/com/sleepycat/je/LockStats.html new file mode 100644 index 0000000..dc33c8e --- /dev/null +++ b/docs/java/com/sleepycat/je/LockStats.html @@ -0,0 +1,534 @@ + + + + + +LockStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class LockStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.LockStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Deprecated.  +
        as of 4.0.10, replaced by Environment.getStats(StatsConfig).

        +
        +
        +
        public class LockStats
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Lock statistics for a database environment. + +

        Note that some of the lock statistics may be expensive to obtain because + the lock table is unavailable to other operations while the statistics are + gathered. These expensive statistics are only provided if Environment.getLockStats is + called with a StatsConfig parameter that has been configured for "slow" + stats.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          intgetNAcquiresNoWaiters() +
          Deprecated. 
          +
          Number of acquires of lock table latch with no contention.
          +
          intgetNAcquiresNoWaitSuccessful() +
          Deprecated. 
          +
          Number of successful no-wait acquires of the lock table latch.
          +
          intgetNAcquiresNoWaitUnSuccessful() +
          Deprecated. 
          +
          Number of unsuccessful no-wait acquires of the lock table latch.
          +
          intgetNAcquiresSelfOwned() +
          Deprecated. 
          +
          Number of acquires of lock table latch when it was already owned + by the caller.
          +
          intgetNAcquiresWithContention() +
          Deprecated. 
          +
          Number of acquires of lock table latch when it was already owned by + another thread.
          +
          intgetNOwners() +
          Deprecated. 
          +
          Total lock owners in lock table.
          +
          intgetNReadLocks() +
          Deprecated. 
          +
          Total read locks currently held.
          +
          intgetNReleases() +
          Deprecated. 
          +
          Number of releases of the lock table latch.
          +
          longgetNRequests() +
          Deprecated. 
          +
          Total number of lock requests to date.
          +
          intgetNTotalLocks() +
          Deprecated. 
          +
          Total locks currently in lock table.
          +
          intgetNWaiters() +
          Deprecated. 
          +
          Total transactions waiting for locks.
          +
          longgetNWaits() +
          Deprecated. 
          +
          Total number of lock waits to date.
          +
          intgetNWriteLocks() +
          Deprecated. 
          +
          Total write locks currently held.
          +
          java.lang.StringtoString() +
          Deprecated. 
          +
          For convenience, LockTable.toString will display all stats in + an easily readable format.
          +
          java.lang.StringtoStringVerbose() +
          Deprecated. 
          +
          Like #toString, display all stats.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNOwners

            +
            public int getNOwners()
            +
            Deprecated. 
            +
            Total lock owners in lock table. Only provided when Environment.getLockStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNReadLocks

            +
            public int getNReadLocks()
            +
            Deprecated. 
            +
            Total read locks currently held. Only provided when Environment.getLockStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNTotalLocks

            +
            public int getNTotalLocks()
            +
            Deprecated. 
            +
            Total locks currently in lock table. Only provided when Environment.getLockStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNWaiters

            +
            public int getNWaiters()
            +
            Deprecated. 
            +
            Total transactions waiting for locks. Only provided when Environment.getLockStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNWriteLocks

            +
            public int getNWriteLocks()
            +
            Deprecated. 
            +
            Total write locks currently held. Only provided when Environment.getLockStats is + called in "slow" mode.
            +
          • +
          + + + +
            +
          • +

            getNRequests

            +
            public long getNRequests()
            +
            Deprecated. 
            +
            Total number of lock requests to date.
            +
          • +
          + + + +
            +
          • +

            getNWaits

            +
            public long getNWaits()
            +
            Deprecated. 
            +
            Total number of lock waits to date.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresNoWaiters

            +
            public int getNAcquiresNoWaiters()
            +
            Deprecated. 
            +
            Number of acquires of lock table latch with no contention.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresSelfOwned

            +
            public int getNAcquiresSelfOwned()
            +
            Deprecated. 
            +
            Number of acquires of lock table latch when it was already owned + by the caller.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresWithContention

            +
            public int getNAcquiresWithContention()
            +
            Deprecated. 
            +
            Number of acquires of lock table latch when it was already owned by + another thread.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresNoWaitSuccessful

            +
            public int getNAcquiresNoWaitSuccessful()
            +
            Deprecated. 
            +
            Number of successful no-wait acquires of the lock table latch.
            +
          • +
          + + + +
            +
          • +

            getNAcquiresNoWaitUnSuccessful

            +
            public int getNAcquiresNoWaitUnSuccessful()
            +
            Deprecated. 
            +
            Number of unsuccessful no-wait acquires of the lock table latch.
            +
          • +
          + + + +
            +
          • +

            getNReleases

            +
            public int getNReleases()
            +
            Deprecated. 
            +
            Number of releases of the lock table latch.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Deprecated. 
            +
            For convenience, LockTable.toString will display all stats in + an easily readable format.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toStringVerbose

            +
            public java.lang.String toStringVerbose()
            +
            Deprecated. 
            +
            Like #toString, display all stats. Includes a description of each + stat.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LockTimeoutException.html b/docs/java/com/sleepycat/je/LockTimeoutException.html new file mode 100644 index 0000000..348229a --- /dev/null +++ b/docs/java/com/sleepycat/je/LockTimeoutException.html @@ -0,0 +1,285 @@ + + + + + +LockTimeoutException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class LockTimeoutException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class LockTimeoutException
        +extends LockConflictException
        +
        Thrown when multiple threads are competing for a lock and the lock timeout + interval is exceeded for the current operation. This is normally because + another transaction or cursor holds a lock for longer than the timeout + interval. It may also occur if the application fails to close a cursor, or + fails to commit or abort a transaction, since any locks held by the cursor + or transaction will be held indefinitely. + +

        This exception is not thrown if a deadlock is detected, even if the + timeout elapses before the deadlock is broken. If a deadlock is detected, + DeadlockException is always thrown instead.

        + +

        The lock timeout interval may be set using + EnvironmentConfig.setLockTimeout(long, java.util.concurrent.TimeUnit) or + Transaction.setLockTimeout(long, java.util.concurrent.TimeUnit).

        + +

        The Transaction handle is invalidated as a result of this + exception.

        + +

        Normally, applications should catch the base class LockConflictException rather than catching one of its subclasses. All lock + conflicts are typically handled in the same way, which is normally to abort + and retry the transaction. See LockConflictException for more + information.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/LogWriteException.html b/docs/java/com/sleepycat/je/LogWriteException.html new file mode 100644 index 0000000..a265a81 --- /dev/null +++ b/docs/java/com/sleepycat/je/LogWriteException.html @@ -0,0 +1,266 @@ + + + + + +LogWriteException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class LogWriteException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class LogWriteException
        +extends EnvironmentFailureException
        +
        Thrown when an IOException or other failure occurs when writing to + the JE log. This exception may be indicative of a full disk, although an + IOException does not contain enough information to determine this + definitively. + +

        This exception may be thrown as the result of any write operation, + including record writes, checkpoints, etc.

        + +

        Existing Environment handles are invalidated as a result of this + exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/OperationFailureException.html b/docs/java/com/sleepycat/je/OperationFailureException.html new file mode 100644 index 0000000..016ce48 --- /dev/null +++ b/docs/java/com/sleepycat/je/OperationFailureException.html @@ -0,0 +1,404 @@ + + + + + +OperationFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class OperationFailureException

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • + +
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/OperationResult.html b/docs/java/com/sleepycat/je/OperationResult.html new file mode 100644 index 0000000..fa7ac12 --- /dev/null +++ b/docs/java/com/sleepycat/je/OperationResult.html @@ -0,0 +1,299 @@ + + + + + +OperationResult (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class OperationResult

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.OperationResult
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class OperationResult
        +extends java.lang.Object
        +
        The result of an operation that successfully reads or writes a record. +

        + An OperationResult does not contain any failure information. Methods that + perform unsuccessful reads or writes return null or throw an exception. Null + is returned if the operation failed for commonly expected reasons, such as a + read that fails because the key does not exist, or an insertion that fails + because the key does exist. +

        + Methods that return OperationResult can be compared to methods that return + OperationStatus as follows: If OperationStatus.SUCCESS is + returned by the latter methods, this is equivalent to returning a non-null + OperationResult by the former methods.

        +
        +
        Since:
        +
        7.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          longgetExpirationTime() +
          Returns the expiration time of the record, in milliseconds, or zero + if the record has no TTL and does not expire.
          +
          booleanisUpdate() +
          Returns whether the operation was an update, for distinguishing inserts + and updates performed by a Put.OVERWRITE operation.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            isUpdate

            +
            public boolean isUpdate()
            +
            Returns whether the operation was an update, for distinguishing inserts + and updates performed by a Put.OVERWRITE operation.
            +
            +
            Returns:
            +
            whether an existing record was updated by this operation.
            +
            +
          • +
          + + + +
            +
          • +

            getExpirationTime

            +
            public long getExpirationTime()
            +
            Returns the expiration time of the record, in milliseconds, or zero + if the record has no TTL and does not expire. +

            + For 'get' operations, this is the expiration time of the current record. + For 'put operations, this is the expiration time of the newly written + record. For 'delete' operation, this is the expiration time of the + record that was deleted. +

            + The return value will always be evenly divisible by the number of + milliseconds in one hour. If TimeUnit.Days was specified + when the record was written, the return value will also be evenly + divisible by the number of milliseconds in one day.

            +
            +
            Returns:
            +
            the expiration time in milliseconds, or zero.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/OperationStatus.html b/docs/java/com/sleepycat/je/OperationStatus.html new file mode 100644 index 0000000..323e0ad --- /dev/null +++ b/docs/java/com/sleepycat/je/OperationStatus.html @@ -0,0 +1,406 @@ + + + + + +OperationStatus (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum OperationStatus

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<OperationStatus>
        • +
        • +
            +
          • com.sleepycat.je.OperationStatus
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<OperationStatus>
        +
        +
        +
        +
        public enum OperationStatus
        +extends java.lang.Enum<OperationStatus>
        +
        Status values from database operations.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          KEYEMPTY +
          The cursor operation was unsuccessful because the current record was + deleted.
          +
          KEYEXIST +
          The operation to insert data was configured to not allow overwrite and + the key already exists in the database.
          +
          NOTFOUND +
          The requested key/data pair was not found.
          +
          SUCCESS +
          The operation was successful.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringtoString()
          static OperationStatusvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static OperationStatus[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            SUCCESS

            +
            public static final OperationStatus SUCCESS
            +
            The operation was successful.
            +
          • +
          + + + +
            +
          • +

            KEYEXIST

            +
            public static final OperationStatus KEYEXIST
            +
            The operation to insert data was configured to not allow overwrite and + the key already exists in the database.
            +
          • +
          + + + +
            +
          • +

            KEYEMPTY

            +
            public static final OperationStatus KEYEMPTY
            +
            The cursor operation was unsuccessful because the current record was + deleted. This can only occur if a Cursor is positioned to an existing + record, then the record is deleted, and then the getCurrent, putCurrent, + or delete methods is called.
            +
          • +
          + + + +
            +
          • +

            NOTFOUND

            +
            public static final OperationStatus NOTFOUND
            +
            The requested key/data pair was not found.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static OperationStatus[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (OperationStatus c : OperationStatus.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static OperationStatus valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Enum<OperationStatus>
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/PartialComparator.html b/docs/java/com/sleepycat/je/PartialComparator.html new file mode 100644 index 0000000..70af63a --- /dev/null +++ b/docs/java/com/sleepycat/je/PartialComparator.html @@ -0,0 +1,200 @@ + + + + + +PartialComparator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface PartialComparator

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface PartialComparator
        +
        A tag interface used to mark a B-tree or duplicate comparator class as a + partial comparator. + + Comparators are configured using + DatabaseConfig.setBtreeComparator(java.util.Comparator) or + DatabaseConfig.setBtreeComparator(Class), and + DatabaseConfig.setDuplicateComparator(java.util.Comparator) or + DatabaseConfig.setDuplicateComparator(Class). +

        + As described in the javadoc for these methods, a partial comparator is a + comparator that allows for the keys of a database to be updated, but only + if the updates are not significant with respect to uniqueness and ordering. + Also described is the fact that comparators must be used with great caution, + since a badly behaved comparator can cause B-tree corruption. +

        + Even greater caution is needed when using partial comparators, for several + reasons. Partial comparators are normally used for performance reasons in + certain situations, but the performance trade-offs are very subtle and + difficult to understand. In addition, as of JE 6, this tag interface must + be added to all partial comparator classes so that JE can correctly perform + transaction aborts, while maintaining the last committed key or duplicate + data values properly. In addition, for a database with duplicates + configured, a partial comparator (implementing this tag interface) will + disable optimizations in JE 6 that drastically reduce cleaner costs. +

        + For these reasons, we do not recommend using partial comparators, although + they are supported in order to avoid breaking applications that used them + prior to JE 6. Whenever possible, please avoid using partial comparators.

        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/PreloadConfig.Phases.html b/docs/java/com/sleepycat/je/PreloadConfig.Phases.html new file mode 100644 index 0000000..74ac66d --- /dev/null +++ b/docs/java/com/sleepycat/je/PreloadConfig.Phases.html @@ -0,0 +1,343 @@ + + + + + +PreloadConfig.Phases (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum PreloadConfig.Phases

      +
      +
      +
        +
      • java.lang.Object
      • +
      • + +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<PreloadConfig.Phases>
        +
        +
        +
        Enclosing class:
        +
        PreloadConfig
        +
        +
        +
        +
        public static enum PreloadConfig.Phases
        +extends java.lang.Enum<PreloadConfig.Phases>
        +
        Preload progress listeners report this phase value, along with a + count of the number if times that the preload has fetched from disk.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          PRELOAD +
          Preload is in progress and resulted in a fetch from disk.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static PreloadConfig.PhasesvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static PreloadConfig.Phases[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            PRELOAD

            +
            public static final PreloadConfig.Phases PRELOAD
            +
            Preload is in progress and resulted in a fetch from disk.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static PreloadConfig.Phases[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (PreloadConfig.Phases c : PreloadConfig.Phases.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static PreloadConfig.Phases valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/PreloadConfig.html b/docs/java/com/sleepycat/je/PreloadConfig.html new file mode 100644 index 0000000..5c125c8 --- /dev/null +++ b/docs/java/com/sleepycat/je/PreloadConfig.html @@ -0,0 +1,631 @@ + + + + + +PreloadConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class PreloadConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.PreloadConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class PreloadConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of an application invoked preload operation.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Nested Class Summary

          + + + + + + + + + + +
          Nested Classes 
          Modifier and TypeClass and Description
          static class PreloadConfig.Phases +
          Preload progress listeners report this phase value, along with a + count of the number if times that the preload has fetched from disk.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          PreloadConfig() +
          Default configuration used if null is passed to Database.preload.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            PreloadConfig

            +
            public PreloadConfig()
            +
            Default configuration used if null is passed to Database.preload.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setMaxBytes

            +
            public PreloadConfig setMaxBytes(long maxBytes)
            +
            Configure the maximum number of bytes to preload. + +

            The default is 0 for this class.

            +
            +
            Parameters:
            +
            maxBytes - If the maxBytes parameter is non-zero, a preload will + stop when the cache contains this number of bytes.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getMaxBytes

            +
            public long getMaxBytes()
            +
            Return the number of bytes in the cache to stop the preload at. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The number of bytes in the cache to stop the preload at.
            +
            +
          • +
          + + + +
            +
          • +

            setMaxMillisecs

            +
            public PreloadConfig setMaxMillisecs(long maxMillisecs)
            +
            Configure the maximum number of milliseconds to execute preload. + +

            The default is 0 for this class.

            +
            +
            Parameters:
            +
            maxMillisecs - If the maxMillisecs parameter is non-zero, a preload + will stop when this amount of time has passed.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getMaxMillisecs

            +
            public long getMaxMillisecs()
            +
            Return the number of millisecs to stop the preload after. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The number of millisecs to stop the preload after.
            +
            +
          • +
          + + + +
            +
          • +

            setLoadLNs

            +
            public PreloadConfig setLoadLNs(boolean loadLNs)
            +
            Configure the preload load LNs option. + +

            The default is false for this class.

            +
            +
            Parameters:
            +
            loadLNs - If set to true, the preload will load Leaf Nodes (LNs) + containing the data values.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getLoadLNs

            +
            public boolean getLoadLNs()
            +
            Return the configuration of the preload load LNs option.
            +
            +
            Returns:
            +
            The configuration of the preload load LNs option.
            +
            +
          • +
          + + + +
            +
          • +

            setProgressListener

            +
            public PreloadConfig setProgressListener(ProgressListener<PreloadConfig.Phases> progressListener)
            +
            Configure the preload operation to make periodic calls to a ProgressListener to provide feedback on preload progress. + The ProgressListener.progress() method is called each time the preload + mush fetch a btree node or data record from disk. +

            + When using progress listeners, review the information at ProgressListener.progress(T, long, long) to avoid any unintended disruption to + replication stream syncup.

            +
            +
            Parameters:
            +
            progressListener - The ProgressListener to callback during + preload.
            +
            +
          • +
          + + + +
            +
          • +

            getProgressListener

            +
            public ProgressListener<PreloadConfig.Phases> getProgressListener()
            +
            Return the ProgressListener for this PreloadConfig.
            +
            +
            Returns:
            +
            the ProgressListener for this PreloadConfig.
            +
            +
          • +
          + + + +
            +
          • +

            setLSNBatchSize

            +
            public PreloadConfig setLSNBatchSize(long lsnBatchSize)
            +
            Set the maximum number of LSNs to gather and sort at any one time. The + default is an unlimited number of LSNs. Setting this lower causes the + preload to use less memory, but it sorts and processes LSNs more + frequently thereby causing slower performance. Setting this higher will + in general improve performance at the expense of memory. Each LSN uses + 16 bytes of memory.
            +
            +
            Parameters:
            +
            lsnBatchSize - the maximum number of LSNs to accumulate and sort + per batch.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getLSNBatchSize

            +
            public long getLSNBatchSize()
            +
            Preload is implemented to optimize I/O cost by fetching the records of + a Database by disk order, so that disk access is are sequential rather + than random. LSNs (log sequence numbers) are the disk addresses of + database records. Setting this value causes the preload to process + batches of LSNs rather than all in-memory LSNs at one time, + which bounds the memory usage of + the preload processing, at the expense of preload performance.
            +
            +
            Returns:
            +
            the maximum number of LSNs to be sorted that this + preload is configured for.
            +
            +
          • +
          + + + +
            +
          • +

            setInternalMemoryLimit

            +
            public PreloadConfig setInternalMemoryLimit(long internalMemoryLimit)
            +
            Set the maximum amount of non JE Cache Memory that preload can use at + one time. The default is an unlimited amount of memory. Setting this + lower causes the preload to use less memory, but generally results in + slower performance. Setting this higher will often improve performance + at the expense of higher memory utilization.
            +
            +
            Parameters:
            +
            internalMemoryLimit - the maximum number of non JE Cache bytes to + use.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getInternalMemoryLimit

            +
            public long getInternalMemoryLimit()
            +
            Returns the maximum amount of non JE Cache Memory that preload can use at + one time.
            +
            +
            Returns:
            +
            the maximum amount of non JE Cache Memory that preload can use at + one time.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public PreloadConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/PreloadStats.html b/docs/java/com/sleepycat/je/PreloadStats.html new file mode 100644 index 0000000..1923390 --- /dev/null +++ b/docs/java/com/sleepycat/je/PreloadStats.html @@ -0,0 +1,427 @@ + + + + + +PreloadStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class PreloadStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.PreloadStats
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          intgetNBINsLoaded() +
          Returns the number of BINs that were loaded into the cache during the + preload() operation.
          +
          intgetNCountMemoryExceeded() +
          Returns the count of the number of times that the internal memory budget + specified by PreloadConfig.setInternalMemoryLimit() was exceeded.
          +
          intgetNDBINsLoaded() +
          Deprecated.  +
          returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
          +
          +
          intgetNDINsLoaded() +
          Deprecated.  +
          returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
          +
          +
          intgetNDupCountLNsLoaded() +
          Deprecated.  +
          returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
          +
          +
          intgetNEmbeddedLNs() +
          Returns the number of embedded LNs encountered during the preload() + operation.
          +
          intgetNINsLoaded() +
          Returns the number of INs that were loaded into the cache during the + preload() operation.
          +
          intgetNLNsLoaded() +
          Returns the number of LNs that were loaded into the cache during the + preload() operation.
          +
          PreloadStatusgetStatus() +
          Returns the PreloadStatus value for the preload() operation.
          +
          java.lang.StringtoString() +
          Returns a String representation of the stats in the form of + <stat>=<value>
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNINsLoaded

            +
            public int getNINsLoaded()
            +
            Returns the number of INs that were loaded into the cache during the + preload() operation.
            +
          • +
          + + + +
            +
          • +

            getNBINsLoaded

            +
            public int getNBINsLoaded()
            +
            Returns the number of BINs that were loaded into the cache during the + preload() operation.
            +
          • +
          + + + +
            +
          • +

            getNLNsLoaded

            +
            public int getNLNsLoaded()
            +
            Returns the number of LNs that were loaded into the cache during the + preload() operation.
            +
          • +
          + + + +
            +
          • +

            getNEmbeddedLNs

            +
            public int getNEmbeddedLNs()
            +
            Returns the number of embedded LNs encountered during the preload() + operation.
            +
          • +
          + + + +
            +
          • +

            getNDINsLoaded

            +
            public int getNDINsLoaded()
            +
            Deprecated. returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
            +
          • +
          + + + +
            +
          • +

            getNDBINsLoaded

            +
            public int getNDBINsLoaded()
            +
            Deprecated. returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
            +
          • +
          + + + +
            +
          • +

            getNDupCountLNsLoaded

            +
            public int getNDupCountLNsLoaded()
            +
            Deprecated. returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
            +
          • +
          + + + +
            +
          • +

            getNCountMemoryExceeded

            +
            public int getNCountMemoryExceeded()
            +
            Returns the count of the number of times that the internal memory budget + specified by PreloadConfig.setInternalMemoryLimit() was exceeded.
            +
          • +
          + + + +
            +
          • +

            getStatus

            +
            public PreloadStatus getStatus()
            +
            Returns the PreloadStatus value for the preload() operation.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns a String representation of the stats in the form of + <stat>=<value>
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/PreloadStatus.html b/docs/java/com/sleepycat/je/PreloadStatus.html new file mode 100644 index 0000000..952039e --- /dev/null +++ b/docs/java/com/sleepycat/je/PreloadStatus.html @@ -0,0 +1,385 @@ + + + + + +PreloadStatus (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class PreloadStatus

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.PreloadStatus
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class PreloadStatus
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Describes the result of the Database.preload operation.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            PreloadStatus

            +
            public PreloadStatus(java.lang.String statusName)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ProgressListener.html b/docs/java/com/sleepycat/je/ProgressListener.html new file mode 100644 index 0000000..97162ec --- /dev/null +++ b/docs/java/com/sleepycat/je/ProgressListener.html @@ -0,0 +1,288 @@ + + + + + +ProgressListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface ProgressListener<T extends java.lang.Enum<T>>

      +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          booleanprogress(T phase, + long n, + long total) +
          Called by BDB JE to indicate to the user that progress has been + made on a potentially long running or asynchronous operation.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + + + +
            +
          • +

            progress

            +
            boolean progress(T phase,
            +                 long n,
            +                 long total)
            +
            Called by BDB JE to indicate to the user that progress has been + made on a potentially long running or asynchronous operation. +

            + This method should do the minimal amount of work, queuing any resource + intensive operations for processing by another thread before returning + to the caller, so that it does not unduly delay the target operation, + which invokes this method. +

            + The applicaton should also be aware that the method has potential to + disrupt the reported-upon operation. If the progress() throws a + RuntimeException, the operation for which the progress is being reported + will be aborted and the exception propagated back to the original + caller. Also, if progress() returns false, the operation will be + halted. For recovery and syncup listeners, a false return value can + invalidate and close the environment.

            +
            +
            Parameters:
            +
            phase - an enum indicating the phase of the operation for + which progress is being reported.
            +
            n - indicates the number of units that have been processed so far. + If this does not apply, -1 is returned.
            +
            total - indicates the total number of units that will be processed + if it is known by JE. If total is < 0, then the total number is + unknown. When total == n, this indicates that processing of this + operation is 100% complete, even if all previous calls to progress + passed a negative value for total.
            +
            Returns:
            +
            true to continue the operation, false to stop it.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Put.html b/docs/java/com/sleepycat/je/Put.html new file mode 100644 index 0000000..a55d75d --- /dev/null +++ b/docs/java/com/sleepycat/je/Put.html @@ -0,0 +1,441 @@ + + + + + +Put (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum Put

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<Put>
        • +
        • +
            +
          • com.sleepycat.je.Put
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<Put>
        +
        +
        +
        +
        public enum Put
        +extends java.lang.Enum<Put>
        +
        The operation type passed to "put" methods on databases and cursors.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          CURRENT +
          Updates the data of the record at the cursor position.
          +
          NO_DUP_DATA +
          Inserts a record in a database with duplicate keys if a record with a + matching key and data is not already present.
          +
          NO_OVERWRITE +
          Inserts a record if a record with a matching key is not already present.
          +
          OVERWRITE +
          Inserts or updates a record depending on whether a matching record is + already present.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static PutvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static Put[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            OVERWRITE

            +
            public static final Put OVERWRITE
            +
            Inserts or updates a record depending on whether a matching record is + already present. + +

            If the database does not have duplicate keys, a matching record is + defined as one with the same key. The existing record's data will be + replaced. In addition, if a custom key comparator is configured, and the + key bytes are different but considered equal by the comparator, the key + is replaced.

            + +

            If the database does have duplicate keys, a matching record is + defined as one with the same key and data. As above, if a custom key + comparator is configured, and the key bytes are different but considered + equal by the comparator, the key is replaced. In addition, if a custom + duplicate comparator is configured, and the data bytes are different but + considered equal by the comparator, the data is replaced.

            + +

            The operation always succeeds (null is never returned).

            +
          • +
          + + + +
            +
          • +

            NO_OVERWRITE

            +
            public static final Put NO_OVERWRITE
            +
            Inserts a record if a record with a matching key is not already present. + +

            If the database has duplicate keys, a record is inserted only if + there are no records with a matching key.

            + +

            The operation does not succeed (null is returned) when an existing + record matches.

            +
          • +
          + + + +
            +
          • +

            NO_DUP_DATA

            +
            public static final Put NO_DUP_DATA
            +
            Inserts a record in a database with duplicate keys if a record with a + matching key and data is not already present. + +

            This operation is not allowed for databases that do not have + duplicate keys.

            + +

            The operation does not succeed (null is returned) when an existing + record matches.

            +
          • +
          + + + +
            +
          • +

            CURRENT

            +
            public static final Put CURRENT
            +
            Updates the data of the record at the cursor position. + +

            If the database does not have duplicate keys, the existing record's + data will be replaced.

            + +

            If the database does have duplicate keys, the existing data is + replaced but it is must be considered equal by the duplicate comparator. + If the data is not considered equal, DuplicateDataException is + thrown. Using the default comparator, a key is considered equal only if + its bytes are equal. Therefore, changing the data is only possible if a + custom duplicate comparator is configured.

            + +

            A partial data item may be + specified to optimize for partial data update.

            + +

            This operation cannot be used to update the key of an existing record + and in fact the key parameter must be null when calling generic put + methods such as + Database.put(Transaction, DatabaseEntry, DatabaseEntry, Put, + WriteOptions) and + Cursor.put(DatabaseEntry, DatabaseEntry, Put, WriteOptions).

            + +

            The operation does not succeed (null is returned) if the record at + the current position has been deleted. This can occur in two cases: 1. + If the record was deleted using this cursor and then accessed. 2. If the + record was not locked by this cursor or transaction, and was deleted by + another thread or transaction after this cursor was positioned on + it.

            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static Put[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (Put c : Put.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static Put valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ReadOptions.html b/docs/java/com/sleepycat/je/ReadOptions.html new file mode 100644 index 0000000..124134f --- /dev/null +++ b/docs/java/com/sleepycat/je/ReadOptions.html @@ -0,0 +1,388 @@ + + + + + +ReadOptions (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class ReadOptions

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.ReadOptions
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class ReadOptions
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Options for calling methods that read records.
        +
        +
        Since:
        +
        7.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ReadOptions() +
          Constructs a ReadOptions object with default values for all properties.
          +
          +
        • +
        + + +
      • +
      +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/RecoveryProgress.html b/docs/java/com/sleepycat/je/RecoveryProgress.html new file mode 100644 index 0000000..bf905ed --- /dev/null +++ b/docs/java/com/sleepycat/je/RecoveryProgress.html @@ -0,0 +1,620 @@ + + + + + +RecoveryProgress (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum RecoveryProgress

      +
      +
      +
        +
      • java.lang.Object
      • +
      • + +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          BECOME_CONSISTENT +
          For replicated systems only: if a replica, process enough of the + replication stream so that the environment fulfills the required + consistency policy, as defined by parameters passed to the + ReplicatedEnvironment constructor.
          +
          CKPT +
          Perform a checkpoint to make all the work of this environment + startup persistent, so it is not repeated in future startups.
          +
          FIND_END_OF_LOG +
          Find the last valid entry in the database log.
          +
          FIND_LAST_CKPT +
          Find the last complete checkpoint in the database log.
          +
          FIND_MASTER +
          For replicated systems only: locate the master of the + replication group by querying others in the group, and holding an + election if necessary.
          +
          POPULATE_EXPIRATION_PROFILE +
          Populate internal metadata which stores information about the + expiration time/data windows (histogram) of each log file, for + efficient log cleaning.
          +
          POPULATE_UTILIZATION_PROFILE +
          Populate internal metadata which stores information about the + utilization level of each log file, for efficient log cleaning.
          +
          READ_DATA_INFO +
          Read log entries that pertain to the database indices.
          +
          READ_DBMAP_INFO +
          Read log entries that pertain to the database map, which is an + internal index of all databases.
          +
          RECOVERY_FINISHED +
          Basic recovery is completed, and the environment is able to + service operations.
          +
          REDO_DATA_INFO +
          Redo log entries that pertain to the database indices.
          +
          REDO_DATA_RECORDS +
          Repeat committed data operations, such as inserts, updates + and deletes.
          +
          REDO_DBMAP_INFO +
          Redo log entries that pertain to the database map, which is an + internal index of all databases.
          +
          REDO_DBMAP_RECORDS +
          Redo committed database creation, deletion and truncations.
          +
          REMOVE_TEMP_DBS +
          Remove temporary databases created by the application that + are no longer valid.
          +
          UNDO_DATA_RECORDS +
          Rollback uncommitted data operations, such as inserts, updates + and deletes.
          +
          UNDO_DBMAP_RECORDS +
          Rollback uncommitted database creation, deletion and truncations.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static RecoveryProgressvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static RecoveryProgress[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            FIND_END_OF_LOG

            +
            public static final RecoveryProgress FIND_END_OF_LOG
            +
            Find the last valid entry in the database log.
            +
          • +
          + + + +
            +
          • +

            FIND_LAST_CKPT

            +
            public static final RecoveryProgress FIND_LAST_CKPT
            +
            Find the last complete checkpoint in the database log.
            +
          • +
          + + + +
            +
          • +

            READ_DBMAP_INFO

            +
            public static final RecoveryProgress READ_DBMAP_INFO
            +
            Read log entries that pertain to the database map, which is an + internal index of all databases.
            +
          • +
          + + + +
            +
          • +

            REDO_DBMAP_INFO

            +
            public static final RecoveryProgress REDO_DBMAP_INFO
            +
            Redo log entries that pertain to the database map, which is an + internal index of all databases.
            +
          • +
          + + + +
            +
          • +

            UNDO_DBMAP_RECORDS

            +
            public static final RecoveryProgress UNDO_DBMAP_RECORDS
            +
            Rollback uncommitted database creation, deletion and truncations.
            +
          • +
          + + + +
            +
          • +

            REDO_DBMAP_RECORDS

            +
            public static final RecoveryProgress REDO_DBMAP_RECORDS
            +
            Redo committed database creation, deletion and truncations.
            +
          • +
          + + + +
            +
          • +

            READ_DATA_INFO

            +
            public static final RecoveryProgress READ_DATA_INFO
            +
            Read log entries that pertain to the database indices.
            +
          • +
          + + + +
            +
          • +

            REDO_DATA_INFO

            +
            public static final RecoveryProgress REDO_DATA_INFO
            +
            Redo log entries that pertain to the database indices.
            +
          • +
          + + + +
            +
          • +

            UNDO_DATA_RECORDS

            +
            public static final RecoveryProgress UNDO_DATA_RECORDS
            +
            Rollback uncommitted data operations, such as inserts, updates + and deletes.
            +
          • +
          + + + +
            +
          • +

            REDO_DATA_RECORDS

            +
            public static final RecoveryProgress REDO_DATA_RECORDS
            +
            Repeat committed data operations, such as inserts, updates + and deletes.
            +
          • +
          + + + +
            +
          • +

            POPULATE_UTILIZATION_PROFILE

            +
            public static final RecoveryProgress POPULATE_UTILIZATION_PROFILE
            +
            Populate internal metadata which stores information about the + utilization level of each log file, for efficient log cleaning.
            +
          • +
          + + + +
            +
          • +

            POPULATE_EXPIRATION_PROFILE

            +
            public static final RecoveryProgress POPULATE_EXPIRATION_PROFILE
            +
            Populate internal metadata which stores information about the + expiration time/data windows (histogram) of each log file, for + efficient log cleaning.
            +
            +
            Since:
            +
            6.5
            +
            +
          • +
          + + + +
            +
          • +

            REMOVE_TEMP_DBS

            +
            public static final RecoveryProgress REMOVE_TEMP_DBS
            +
            Remove temporary databases created by the application that + are no longer valid.
            +
          • +
          + + + +
            +
          • +

            CKPT

            +
            public static final RecoveryProgress CKPT
            +
            Perform a checkpoint to make all the work of this environment + startup persistent, so it is not repeated in future startups.
            +
          • +
          + + + +
            +
          • +

            RECOVERY_FINISHED

            +
            public static final RecoveryProgress RECOVERY_FINISHED
            +
            Basic recovery is completed, and the environment is able to + service operations.
            +
          • +
          + + + +
            +
          • +

            FIND_MASTER

            +
            public static final RecoveryProgress FIND_MASTER
            +
            For replicated systems only: locate the master of the + replication group by querying others in the group, and holding an + election if necessary.
            +
          • +
          + + + +
            +
          • +

            BECOME_CONSISTENT

            +
            public static final RecoveryProgress BECOME_CONSISTENT
            +
            For replicated systems only: if a replica, process enough of the + replication stream so that the environment fulfills the required + consistency policy, as defined by parameters passed to the + ReplicatedEnvironment constructor.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static RecoveryProgress[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (RecoveryProgress c : RecoveryProgress.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static RecoveryProgress valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ReplicaConsistencyPolicy.html b/docs/java/com/sleepycat/je/ReplicaConsistencyPolicy.html new file mode 100644 index 0000000..fb9bcdb --- /dev/null +++ b/docs/java/com/sleepycat/je/ReplicaConsistencyPolicy.html @@ -0,0 +1,270 @@ + + + + + +ReplicaConsistencyPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface ReplicaConsistencyPolicy

      +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetName() +
          Returns the name used to identify the policy.
          +
          longgetTimeout(java.util.concurrent.TimeUnit unit) +
          The timeout associated with the consistency policy.
          +
          +
        • +
        +
      • +
      +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/RunRecoveryException.html b/docs/java/com/sleepycat/je/RunRecoveryException.html new file mode 100644 index 0000000..2eaf7bb --- /dev/null +++ b/docs/java/com/sleepycat/je/RunRecoveryException.html @@ -0,0 +1,263 @@ + + + + + +RunRecoveryException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class RunRecoveryException

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • + +
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryConfig.html b/docs/java/com/sleepycat/je/SecondaryConfig.html new file mode 100644 index 0000000..e336ae5 --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryConfig.html @@ -0,0 +1,864 @@ + + + + + +SecondaryConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SecondaryConfig

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class SecondaryConfig
        +extends DatabaseConfig
        +
        The configuration properties of a SecondaryDatabase extend + those of a primary Database. The secondary database + configuration is specified when calling Environment.openSecondaryDatabase. + +

        To create a configuration object with default attributes:

        + +
        +     SecondaryConfig config = new SecondaryConfig();
        + 
        + +

        To set custom attributes:

        + +
        +     SecondaryConfig config = new SecondaryConfig();
        +     config.setAllowCreate(true);
        +     config.setSortedDuplicates(true);
        +     config.setKeyCreator(new MyKeyCreator());
        + 
        +
        +
        See Also:
        +
        Environment.openSecondaryDatabase @see SecondaryDatabase
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            SecondaryConfig

            +
            public SecondaryConfig()
            +
            Creates an instance with the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setKeyCreator

            +
            public SecondaryConfig setKeyCreator(SecondaryKeyCreator keyCreator)
            +
            Specifies the user-supplied object used for creating single-valued + secondary keys. + +

            Unless the primary database is read-only, a key creator is required + when opening a secondary database. Either a KeyCreator or + MultiKeyCreator must be specified, but both may not be specified.

            + +

            Unless the primary database is read-only, a key creator is required + when opening a secondary database.

            + +

            WARNING: Key creator instances are shared by multiple + threads and key creator methods are called without any special + synchronization. Therefore, key creators must be thread safe. In + general no shared state should be used and any caching of computed + values must be done with proper synchronization.

            +
            +
            Parameters:
            +
            keyCreator - the user-supplied object used for creating + single-valued secondary keys.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setMultiKeyCreator

            +
            public SecondaryConfig setMultiKeyCreator(SecondaryMultiKeyCreator multiKeyCreator)
            +
            Specifies the user-supplied object used for creating multi-valued + secondary keys. + +

            Unless the primary database is read-only, a key creator is required + when opening a secondary database. Either a KeyCreator or + MultiKeyCreator must be specified, but both may not be specified.

            + +

            WARNING: Key creator instances are shared by multiple + threads and key creator methods are called without any special + synchronization. Therefore, key creators must be thread safe. In + general no shared state should be used and any caching of computed + values must be done with proper synchronization.

            +
            +
            Parameters:
            +
            multiKeyCreator - the user-supplied object used for creating + multi-valued secondary keys.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setAllowPopulate

            +
            public SecondaryConfig setAllowPopulate(boolean allowPopulate)
            +
            Specifies whether automatic population of the secondary is allowed. + +

            If automatic population is allowed, when the secondary database is + opened it is checked to see if it is empty. If it is empty, the primary + database is read in its entirety and keys are added to the secondary + database using the information read from the primary.

            + +

            If this property is set to true and the database is transactional, + the population of the secondary will be done within the explicit or + auto-commit transaction that is used to open the database.

            +
            +
            Parameters:
            +
            allowPopulate - whether automatic population of the secondary is + allowed.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getAllowPopulate

            +
            public boolean getAllowPopulate()
            +
            Returns whether automatic population of the secondary is allowed. If + setAllowPopulate(boolean) has not been called, this method returns + false.
            +
            +
            Returns:
            +
            whether automatic population of the secondary is allowed.
            +
            See Also:
            +
            setAllowPopulate(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            setForeignKeyDatabase

            +
            public SecondaryConfig setForeignKeyDatabase(Database foreignKeyDatabase)
            +
            Defines a foreign key integrity constraint for a given foreign key + database. + +

            If this property is non-null, a record must be present in the + specified foreign database for every record in the secondary database, + where the secondary key value is equal to the foreign database key + value. Whenever a record is to be added to the secondary database, the + secondary key is used as a lookup key in the foreign database. If the + key is not found in the foreign database, a ForeignConstraintException is thrown.

            + +

            The foreign database must not have duplicates allowed. If duplicates + are allowed, an IllegalArgumentException will be thrown when the + secondary database is opened.

            +
            +
            Parameters:
            +
            foreignKeyDatabase - the database used to check the foreign key + integrity constraint, or null if no foreign key constraint should be + checked.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getForeignKeyDatabase

            +
            public Database getForeignKeyDatabase()
            +
            Returns the database used to check the foreign key integrity constraint, + or null if no foreign key constraint will be checked.
            +
            +
            Returns:
            +
            the foreign key database, or null.
            +
            See Also:
            +
            setForeignKeyDatabase(com.sleepycat.je.Database)
            +
            +
          • +
          + + + +
            +
          • +

            setForeignKeyDeleteAction

            +
            public SecondaryConfig setForeignKeyDeleteAction(ForeignKeyDeleteAction foreignKeyDeleteAction)
            +
            Specifies the action taken when a referenced record in the foreign key + database is deleted. + +

            This property is ignored if the foreign key database property is + null.

            +
            +
            Parameters:
            +
            foreignKeyDeleteAction - the action taken when a referenced record + in the foreign key database is deleted.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            @see #setForeignKeyDatabase
            +
            +
          • +
          + + + + + + + + + + + + + + + +
            +
          • +

            setForeignMultiKeyNullifier

            +
            public SecondaryConfig setForeignMultiKeyNullifier(ForeignMultiKeyNullifier foreignMultiKeyNullifier)
            +
            Specifies the user-supplied object used for setting multi-valued foreign + keys to null. + +

            If the foreign key database property is non-null and the foreign key + delete action is NULLIFY, this property is required to be + non-null; otherwise, this property is ignored.

            + +

            WARNING: Key nullifier instances are shared by multiple + threads and key nullifier methods are called without any special + synchronization. Therefore, key creators must be thread safe. In + general no shared state should be used and any caching of computed + values must be done with proper synchronization.

            +
            +
            Parameters:
            +
            foreignMultiKeyNullifier - the user-supplied object used for + setting multi-valued foreign keys to null.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            @see ForeignKeyDeleteAction#NULLIFY @see + #setForeignKeyDatabase
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setImmutableSecondaryKey

            +
            public SecondaryConfig setImmutableSecondaryKey(boolean immutableSecondaryKey)
            +
            Specifies whether the secondary key is immutable. + +

            Specifying that a secondary key is immutable can be used to optimize + updates when the secondary key in a primary record will never be changed + after that primary record is inserted. For immutable secondary keys, a + best effort is made to avoid calling + SecondaryKeyCreator.createSecondaryKey when a primary + record is updated. This optimization may reduce the overhead of an + update operation significantly if the createSecondaryKey + operation is expensive.

            + +

            Be sure to set this property to true only if the secondary key in the + primary record is never changed. If this rule is violated, the + secondary index will become corrupted, that is, it will become out of + sync with the primary.

            +
            +
            Parameters:
            +
            immutableSecondaryKey - whether the secondary key is immutable.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class DatabaseConfig
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryConstraintException.html b/docs/java/com/sleepycat/je/SecondaryConstraintException.html new file mode 100644 index 0000000..b46f1d1 --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryConstraintException.html @@ -0,0 +1,274 @@ + + + + + +SecondaryConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SecondaryConstraintException

      +
      +
      + +
      + +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryCursor.html b/docs/java/com/sleepycat/je/SecondaryCursor.html new file mode 100644 index 0000000..6432a2d --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryCursor.html @@ -0,0 +1,2142 @@ + + + + + +SecondaryCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SecondaryCursor

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ForwardCursor, java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class SecondaryCursor
        +extends Cursor
        +
        A database cursor for a secondary database. Cursors are not thread safe and + the application is responsible for coordinating any multithreaded access to + a single cursor object. + +

        Secondary cursors are returned by SecondaryDatabase.openCursor and SecondaryDatabase.openSecondaryCursor. The distinguishing characteristics + of a secondary cursor are:

        + +
        • Direct calls to put() methods on a secondary cursor + are prohibited. + +
        • The delete(com.sleepycat.je.WriteOptions) method of a secondary cursor will delete the primary + record and as well as all its associated secondary records. + +
        • Calls to all get methods will return the data from the associated + primary database. + +
        • Additional get method signatures are provided to return the primary key + in an additional pKey parameter. + +
        • Calls to dup(boolean) will return a SecondaryCursor. + +
        + +

        To obtain a secondary cursor with default attributes:

        + +
        +     SecondaryCursor cursor = myDb.openSecondaryCursor(txn, null);
        + 
        + +

        To customize the attributes of a cursor, use a CursorConfig object.

        + +
        +     CursorConfig config = new CursorConfig();
        +     config.setReadUncommitted(true);
        +     SecondaryCursor cursor = myDb.openSecondaryCursor(txn, config);
        + 
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            getPrimaryDatabase

            +
            public Database getPrimaryDatabase()
            +
            Returns the primary Database + associated with this cursor. + +

            Calling this method is the equivalent of the following + expression:

            + +
            +         getDatabase().getPrimaryDatabase()
            + 
            +
            +
            Returns:
            +
            The primary Database + associated with this cursor.
            +
            +
          • +
          + + + +
            +
          • +

            dup

            +
            public SecondaryCursor dup(boolean samePosition)
            +
            Returns a new SecondaryCursor for the same transaction as + the original cursor. + +
            +
            +
            Overrides:
            +
            dup in class Cursor
            +
            Parameters:
            +
            samePosition - If true, the newly created cursor is initialized + to refer to the same position in the database as the original cursor + (if any) and hold the same locks (if any). If false, or the original + cursor does not hold a database position and locks, the returned + cursor is uninitialized and will behave like a newly created cursor.
            +
            Returns:
            +
            A new cursor with the same transaction and locker ID as the + original cursor.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            delete

            +
            public OperationResult delete(WriteOptions options)
            +
            Delete the record to which the cursor refers from the primary database + and all secondary indices. + +

            This method behaves as if Database.delete(Transaction, + DatabaseEntry, WriteOptions) were called for the primary database, + using the primary key associated with this cursor position.

            + +

            The cursor position is unchanged after a delete, and subsequent calls + to cursor functions expecting the cursor to refer to an existing record + will fail.

            + +

            WARNING: Unlike read operations using a SecondaryCursor, write + operations like this one are deadlock-prone.

            + +
            +
            +
            Overrides:
            +
            delete in class Cursor
            +
            Parameters:
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is deleted, else null if the + record at the cursor position has already been deleted.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            put

            +
            public OperationResult put(DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Put putType,
            +                           WriteOptions options)
            +
            This operation is not allowed on a secondary cursor. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary cursor should be used instead.
            +
            +
            Overrides:
            +
            put in class Cursor
            +
            Parameters:
            +
            key - the key used as + input. Must be null when + putType is Put.CURRENT.
            +
            data - the data used as + input. May be partial only when + putType is Put.CURRENT.
            +
            putType - the Put operation type. May not be null.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is written, else null.
            +
            +
          • +
          + + + +
            +
          • +

            put

            +
            public OperationStatus put(DatabaseEntry key,
            +                           DatabaseEntry data)
            +
            This operation is not allowed on a secondary cursor. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary cursor should be used instead.
            +
            +
            Overrides:
            +
            put in class Cursor
            +
            Parameters:
            +
            key - the key used as + input..
            +
            data - the data used as + input.
            +
            Returns:
            +
            OperationStatus.SUCCESS.
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            putCurrent

            +
            public OperationStatus putCurrent(DatabaseEntry data)
            +
            This operation is not allowed on a secondary cursor. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary cursor should be used instead.
            +
            +
            Overrides:
            +
            putCurrent in class Cursor
            +
            Parameters:
            +
            data - the data used as + input. + A partial data item may be + specified to optimize for partial data update.
            +
            Returns:
            +
            OperationStatus.KEYEMPTY if the key/pair at the cursor position has + been deleted; otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationResult get(DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Moves the cursor to a record according to the specified Get + type. + +

            The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data. + In addition, two operations are not supported by this method: + Get.SEARCH_BOTH and Get.SEARCH_BOTH_GTE.

            +
            +
            Specified by:
            +
            get in interface ForwardCursor
            +
            Overrides:
            +
            get in class Cursor
            +
            Parameters:
            +
            key - the key input or output parameter, depending on getType.
            +
            data - the data input or output parameter, depending on getType.
            +
            getType - the Get operation type. May not be null.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationResult get(DatabaseEntry key,
            +                           DatabaseEntry pKey,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Moves the cursor to a record according to the specified Get + type. + +

            If the operation succeeds, the record at the resulting cursor + position will be locked according to the lock mode specified, the key, primary key, + and/or data will be returned via the (non-null) DatabaseEntry + parameters, and a non-null OperationResult will be returned. If the + operation fails because the record requested is not found, null is + returned.

            + +

            The following table lists each allowed operation and whether the key, + pKey and data parameters are input + or output parameters. Also specified is whether the cursor must be + initialized (positioned on a record) before calling this method. See the + individual Get operations for more information.

            + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Get operationDescription'key' parameter'pKey' parameter'data' parameterCursor position
            must be initialized?
            Get.SEARCHSearches using an exact match by key.inputoutputoutputno
            Get.SEARCH_BOTHSearches using an exact match by key and pKey.inputinputoutputno
            Get.SEARCH_GTESearches using a GTE match by key.input/outputoutputoutputno
            Get.SEARCH_BOTH_GTESearches using an exact match by key and a GTE match by pKey.inputinput/outputoutputno
            Get.CURRENTAccesses the current recordoutputoutputoutputyes
            Get.FIRSTFinds the first record in the database.outputoutputoutputno
            Get.LASTFinds the last record in the database.outputoutputoutputno
            Get.NEXTMoves to the next record.outputoutputoutputno**
            Get.NEXT_DUPMoves to the next record with the same key.outputoutputoutputyes
            Get.NEXT_NO_DUPMoves to the next record with a different key.outputoutputoutputno**
            Get.PREVMoves to the previous record.outputoutputoutputno**
            Get.PREV_DUPMoves to the previous record with the same key.outputoutputoutputyes
            Get.PREV_NO_DUPMoves to the previous record with a different key.outputoutputoutputno**
            + +

            ** - For these 'next' and 'previous' operations the cursor may be + uninitialized, in which case the cursor will be moved to the first or + last record, respectively.

            +
            +
            Parameters:
            +
            key - the secondary key input or output parameter, depending on + getType.
            +
            pKey - the primary key input or output parameter, depending on + getType.
            +
            data - the primary data output parameter.
            +
            getType - the Get operation type. May not be null.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + the cursor is uninitialized (not positioned on a record) and this is not + permitted (see above), or the non-transactional cursor was created in a + different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null getType, a null input key/pKey parameter, + an input key/pKey parameter with a null data array, a partial key/pKey + input parameter, and specifying a lock mode of READ_COMMITTED.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getCurrent

            +
            public OperationStatus getCurrent(DatabaseEntry key,
            +                                  DatabaseEntry pKey,
            +                                  DatabaseEntry data,
            +                                  LockMode lockMode)
            +
            Returns the key/data pair to which the cursor refers.
            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.KEYEMPTY if the key/pair at the cursor position has + been deleted; otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getFirst

            +
            public OperationStatus getFirst(DatabaseEntry key,
            +                                DatabaseEntry pKey,
            +                                DatabaseEntry data,
            +                                LockMode lockMode)
            +
            Move the cursor to the first key/data pair of the database, and return + that pair. If the first key has duplicate values, the first data item + in the set of duplicates is returned.
            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getLast

            +
            public OperationStatus getLast(DatabaseEntry key,
            +                               DatabaseEntry pKey,
            +                               DatabaseEntry data,
            +                               LockMode lockMode)
            +
            Move the cursor to the last key/data pair of the database, and return + that pair. If the last key has duplicate values, the last data item in + the set of duplicates is returned.
            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + +
            +
          • +

            getNext

            +
            public OperationStatus getNext(DatabaseEntry key,
            +                               DatabaseEntry data,
            +                               LockMode lockMode)
            +
            Moves the cursor to the next key/data pair and returns that pair. + +

            Calling this method is equivalent to calling Cursor.get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.NEXT.

            + +

            If the cursor is not yet initialized, move the cursor to the first + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the next key/data pair of the database, and that pair + is returned. In the presence of duplicate key values, the value of the + key may not change.

            + + The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data.
            +
            +
            Specified by:
            +
            getNext in interface ForwardCursor
            +
            Overrides:
            +
            getNext in class Cursor
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            getNext

            +
            public OperationStatus getNext(DatabaseEntry key,
            +                               DatabaseEntry pKey,
            +                               DatabaseEntry data,
            +                               LockMode lockMode)
            +
            Move the cursor to the next key/data pair and return that pair. If the + matching key has duplicate values, the first data item in the set of + duplicates is returned. + +

            If the cursor is not yet initialized, move the cursor to the first + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the next key/data pair of the database, and that pair + is returned. In the presence of duplicate key values, the value of the + key may not change.

            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getNextDup

            +
            public OperationStatus getNextDup(DatabaseEntry key,
            +                                  DatabaseEntry pKey,
            +                                  DatabaseEntry data,
            +                                  LockMode lockMode)
            +
            If the next key/data pair of the database is a duplicate data record for + the current key/data pair, move the cursor to the next key/data pair of + the database and return that pair.
            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + +
            +
          • +

            getNextNoDup

            +
            public OperationStatus getNextNoDup(DatabaseEntry key,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Moves the cursor to the next non-duplicate key/data pair and returns + that pair. If the matching key has duplicate values, the first data + item in the set of duplicates is returned. + +

            Calling this method is equivalent to calling Cursor.get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.NEXT_NO_DUP.

            + +

            If the cursor is not yet initialized, move the cursor to the first + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the next non-duplicate key of the database, and that + key/data pair is returned.

            + + The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data.
            +
            +
            Overrides:
            +
            getNextNoDup in class Cursor
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            getNextNoDup

            +
            public OperationStatus getNextNoDup(DatabaseEntry key,
            +                                    DatabaseEntry pKey,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Move the cursor to the next non-duplicate key/data pair and return that + pair. If the matching key has duplicate values, the first data item in + the set of duplicates is returned. + +

            If the cursor is not yet initialized, move the cursor to the first + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the next non-duplicate key of the database, and that + key/data pair is returned.

            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + +
            +
          • +

            getPrev

            +
            public OperationStatus getPrev(DatabaseEntry key,
            +                               DatabaseEntry data,
            +                               LockMode lockMode)
            +
            Moves the cursor to the previous key/data pair and returns that pair. + +

            Calling this method is equivalent to calling Cursor.get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.PREV.

            + +

            If the cursor is not yet initialized, move the cursor to the last + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the previous key/data pair of the database, and that + pair is returned. In the presence of duplicate key values, the value of + the key may not change.

            + + The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data.
            +
            +
            Overrides:
            +
            getPrev in class Cursor
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            getPrev

            +
            public OperationStatus getPrev(DatabaseEntry key,
            +                               DatabaseEntry pKey,
            +                               DatabaseEntry data,
            +                               LockMode lockMode)
            +
            Move the cursor to the previous key/data pair and return that pair. If + the matching key has duplicate values, the last data item in the set of + duplicates is returned. + +

            If the cursor is not yet initialized, move the cursor to the last + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the previous key/data pair of the database, and that + pair is returned. In the presence of duplicate key values, the value of + the key may not change.

            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getPrevDup

            +
            public OperationStatus getPrevDup(DatabaseEntry key,
            +                                  DatabaseEntry pKey,
            +                                  DatabaseEntry data,
            +                                  LockMode lockMode)
            +
            If the previous key/data pair of the database is a duplicate data record + for the current key/data pair, move the cursor to the previous key/data + pair of the database and return that pair.
            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the cursor is uninitialized (not positioned on a record), or the + non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + +
            +
          • +

            getPrevNoDup

            +
            public OperationStatus getPrevNoDup(DatabaseEntry key,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Moves the cursor to the previous non-duplicate key/data pair and returns + that pair. If the matching key has duplicate values, the last data item + in the set of duplicates is returned. + +

            Calling this method is equivalent to calling Cursor.get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.PREV_NO_DUP.

            + +

            If the cursor is not yet initialized, move the cursor to the last + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the previous non-duplicate key of the database, and + that key/data pair is returned.

            + + The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data.
            +
            +
            Overrides:
            +
            getPrevNoDup in class Cursor
            +
            Parameters:
            +
            key - the key returned as + output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            getPrevNoDup

            +
            public OperationStatus getPrevNoDup(DatabaseEntry key,
            +                                    DatabaseEntry pKey,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Move the cursor to the previous non-duplicate key/data pair and return + that pair. If the matching key has duplicate values, the last data item + in the set of duplicates is returned. + +

            If the cursor is not yet initialized, move the cursor to the last + key/data pair of the database, and return that pair. Otherwise, the + cursor is moved to the previous non-duplicate key of the database, and + that key/data pair is returned.

            +
            +
            Parameters:
            +
            key - the secondary key returned as output. Its byte array does + not need to be initialized by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getSearchKey

            +
            public OperationStatus getSearchKey(DatabaseEntry key,
            +                                    DatabaseEntry pKey,
            +                                    DatabaseEntry data,
            +                                    LockMode lockMode)
            +
            Move the cursor to the given key of the database, and return the datum + associated with the given key. If the matching key has duplicate + values, the first data item in the set of duplicates is returned.
            +
            +
            Parameters:
            +
            key - the secondary key used as input. It must be initialized with + a non-null byte array by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + +
            +
          • +

            getSearchKeyRange

            +
            public OperationStatus getSearchKeyRange(DatabaseEntry key,
            +                                         DatabaseEntry data,
            +                                         LockMode lockMode)
            +
            Moves the cursor to the closest matching key of the database, and + returns the data item associated with the matching key. If the matching + key has duplicate values, the first data item in the set of duplicates + is returned. + +

            Calling this method is equivalent to calling Cursor.get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.SEARCH_GTE.

            + +

            The returned key/data pair is for the smallest key greater than or + equal to the specified key (as determined by the key comparison + function), permitting partial key matches and range searches.

            + + The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data.
            +
            +
            Overrides:
            +
            getSearchKeyRange in class Cursor
            +
            Parameters:
            +
            key - the key used as + input and returned as output.
            +
            data - the data returned as + output.
            +
            lockMode - the locking attributes; if null, default attributes + are used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            getSearchKeyRange

            +
            public OperationStatus getSearchKeyRange(DatabaseEntry key,
            +                                         DatabaseEntry pKey,
            +                                         DatabaseEntry data,
            +                                         LockMode lockMode)
            +
            Move the cursor to the closest matching key of the database, and return + the data item associated with the matching key. If the matching key has + duplicate values, the first data item in the set of duplicates is + returned. + +

            The returned key/data pair is for the smallest key greater than or + equal to the specified key (as determined by the key comparison + function), permitting partial key matches and range searches.

            +
            +
            Parameters:
            +
            key - the secondary key used as input and returned as output. It + must be initialized with a non-null byte array by the caller.
            +
            pKey - the primary key returned as output. Its byte array does not + need to be initialized by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + A partial data item may be + specified to optimize for key only or partial data retrieval.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getSearchBoth

            +
            public OperationStatus getSearchBoth(DatabaseEntry key,
            +                                     DatabaseEntry pKey,
            +                                     DatabaseEntry data,
            +                                     LockMode lockMode)
            +
            Move the cursor to the specified secondary and primary key, where both + the primary and secondary key items must match.
            +
            +
            Parameters:
            +
            key - the secondary key used as input. It must be initialized with + a non-null byte array by the caller.
            +
            pKey - the primary key used as input. It must be initialized with + a non-null byte array by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getSearchBothRange

            +
            public OperationStatus getSearchBothRange(DatabaseEntry key,
            +                                          DatabaseEntry pKey,
            +                                          DatabaseEntry data,
            +                                          LockMode lockMode)
            +
            Move the cursor to the specified secondary key and closest matching + primary key of the database. + +

            In the case of any database supporting sorted duplicate sets, the + returned key/data pair is for the smallest primary key greater than or + equal to the specified primary key (as determined by the key comparison + function), permitting partial matches and range searches in duplicate + data sets.

            +
            +
            Parameters:
            +
            key - the secondary key used as input. It must be initialized with + a non-null byte array by the caller.
            +
            pKey - the primary key used as input and returned as output. It + must be initialized with a non-null byte array by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller.
            +
            lockMode - the locking attributes; if null, default attributes are + used. LockMode.READ_COMMITTED is not allowed.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the cursor or database has been closed, + or the non-transactional cursor was created in a different thread.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, if a DatabaseEntry parameter is null or does not contain a + required non-null byte array.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryDatabase.html b/docs/java/com/sleepycat/je/SecondaryDatabase.html new file mode 100644 index 0000000..21bd5a2 --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryDatabase.html @@ -0,0 +1,1171 @@ + + + + + +SecondaryDatabase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SecondaryDatabase

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class SecondaryDatabase
        +extends Database
        +
        A secondary database handle. + +

        Secondary databases are opened with Environment.openSecondaryDatabase and are + always associated with a single primary database. The distinguishing + characteristics of a secondary database are:

        + +
          +
        • Records are automatically added to a secondary database when records are + added, modified and deleted in the primary database. Direct calls to + put() methods on a secondary database are prohibited.
        • +
        • The delete method of a secondary database will delete + the primary record and as well as all its associated secondary records.
        • +
        • Calls to all get() methods will return the data from the + associated primary database.
        • +
        • Additional get() method signatures are provided to return + the primary key in an additional pKey parameter.
        • +
        • Calls to openCursor will return a SecondaryCursor, which itself has get() methods that return + the data of the primary database and additional get() method + signatures for returning the primary key.
        • +
        +

        Before opening or creating a secondary database you must implement + the SecondaryKeyCreator or SecondaryMultiKeyCreator + interface.

        + +

        For example, to create a secondary database that supports duplicates:

        + +
        +     Database primaryDb; // The primary database must already be open.
        +     SecondaryKeyCreator keyCreator; // Your key creator implementation.
        +     SecondaryConfig secConfig = new SecondaryConfig();
        +     secConfig.setAllowCreate(true);
        +     secConfig.setSortedDuplicates(true);
        +     secConfig.setKeyCreator(keyCreator);
        +     SecondaryDatabase newDb = env.openSecondaryDatabase(transaction,
        +                                                         "myDatabaseName",
        +                                                         primaryDb,
        +                                                         secConfig)
        + 
        + +

        If a primary database is to be associated with one or more secondary + databases, it may not be configured for duplicates.

        + +

        WARNING: The associations between primary and secondary databases + are not stored persistently. Whenever a primary database is opened for + write access by the application, the appropriate associated secondary + databases should also be opened by the application. This is necessary to + ensure data integrity when changes are made to the primary database. If the + secondary database is not opened, it will not be updated when the primary is + updated, and the references between the databases will become invalid. + (Note that this warning does not apply when using the DPL, which does store secondary relationships + persistently.)

        + +

        Special considerations for using Secondary + Databases with and without Transactions

        + +

        Normally, during a primary database write operation (insert, update or + delete), all associated secondary databases are also updated. However, when + an exception occurs during the write operation, the updates may be + incomplete. If the databases are transactional, this is handled by aborting + the transaction to undo the incomplete operation. If an auto-commit + transaction is used (null is passed for the transaction), the transaction + will be aborted automatically. If an explicit transaction is used, it + must be aborted by the application caller after the exception is caught.

        + +

        However, if the databases are non-transactional, integrity problems can + result when an exception occurs during the write operation. Because the + write operation is not made atomic by a transaction, references between the + databases will become invalid if the operation is incomplete. This results + in a SecondaryIntegrityException when attempting to access the + databases later.

        + +

        A secondary integrity problem is persistent; it cannot be resolved by + reopening the databases or the environment. The only way to resolve the + problem is to restore the environment from a valid backup, or, if the + integrity of the primary database is assumed, to remove and recreate all + secondary databases.

        + +

        Therefore, secondary databases and indexes should always be used in + conjunction with transactional databases and stores. Without transactions, + it is the responsibility of the application to handle the results of the + incomplete write operation or to take steps to prevent this situation from + happening in the first place.

        + +

        The following exceptions may be thrown during a write operation, and may + cause an integrity problem in the absence of transactions.

        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            close

            +
            public void close()
            +
            Closes a secondary database and dis-associates it from its primary + database. A secondary database should be closed before closing its + associated primary database. + + Discards the database handle. +

            + When closing the last open handle for a deferred-write database, any + cached database information is flushed to disk as if Database.sync() were + called. +

            + The database handle should not be closed while any other handle that + refers to it is not yet closed; for example, database handles should not + be closed while cursor handles into the database remain open, or + transactions that include operations on the database have not yet been + committed or aborted. Specifically, this includes Cursor and Transaction handles. +

            + When multiple threads are using the Database handle concurrently, only a single thread may call this + method. +

            + When called on a database that is the primary database for a secondary + index, the primary database should be closed only after all secondary + indices which reference it have been closed. +

            + The database handle may not be accessed again after this method is + called, regardless of the method's success or failure, with one + exception: the close method itself may be called any number of + times.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            + +
            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Overrides:
            +
            close in class Database
            +
            See Also:
            +
            DatabaseConfig.setDeferredWrite
            +
            +
          • +
          + + + +
            +
          • +

            getPrimaryDatabase

            +
            public Database getPrimaryDatabase()
            +
            Returns the primary database associated with this secondary database.
            +
            +
            Returns:
            +
            the primary database associated with this secondary database.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryDatabases

            +
            public java.util.List<SecondaryDatabase> getSecondaryDatabases()
            +
            Returns an empty list, since this database is itself a secondary + database.
            +
            +
            Overrides:
            +
            getSecondaryDatabases in class Database
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryConfig

            +
            public SecondaryConfig getSecondaryConfig()
            +
            Deprecated. As of JE 4.0.13, replaced by getConfig().
            +
            Returns a copy of the secondary configuration of this database.
            +
            +
            Returns:
            +
            a copy of the secondary configuration of this database.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public SecondaryConfig getConfig()
            +
            Returns a copy of the secondary configuration of this database.
            +
            +
            Overrides:
            +
            getConfig in class Database
            +
            Returns:
            +
            a copy of the secondary configuration of this database.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            openCursor

            +
            public SecondaryCursor openCursor(Transaction txn,
            +                                  CursorConfig cursorConfig)
            +
            Obtain a cursor on a database, returning a SecondaryCursor.
            +
            +
            Overrides:
            +
            openCursor in class Database
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the database is non-transactional, null must be + specified. For a transactional database, the transaction is optional + for read-only access and required for read-write access.
            +
            cursorConfig - The cursor attributes. If null, default attributes + are used.
            +
            Returns:
            +
            A database cursor.
            +
            +
          • +
          + + + +
            +
          • +

            delete

            +
            public OperationResult delete(Transaction txn,
            +                              DatabaseEntry key,
            +                              WriteOptions options)
            +
            Deletes the record associated with the given secondary key. In the + presence of duplicate keys, all primary records associated with the + given secondary key will be deleted. + +

            When multiple primary records are deleted, the expiration time in the + returned result is that of the last record deleted.

            + +

            When the primary records are deleted, their associated secondary + records are deleted as if Database.delete(com.sleepycat.je.Transaction, com.sleepycat.je.DatabaseEntry, com.sleepycat.je.WriteOptions) were called. This + includes, but is not limited to, the secondary record referenced by the + given key.

            +
            +
            Overrides:
            +
            delete in class Database
            +
            Parameters:
            +
            key - the key used as + input. + +
            +
            txn - For a transactional database, an explicit transaction may + be specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is deleted, else null if the + given key was not found in the database.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            get

            +
            public OperationResult get(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Moves the cursor to a record according to the specified Get + type. + +

            The difference between this method and the method it overrides in + Cursor is that the key here is defined as the secondary + records's key, and the data is defined as the primary record's data.

            +
            +
            Overrides:
            +
            get in class Database
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified to transaction-protect the operation, or null may be specified + to perform the operation without transaction protection. For a + non-transactional database, null must be specified.
            +
            key - the key input parameter.
            +
            data - the data input or output parameter, depending on getType.
            +
            getType - the Get operation type. May not be null.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationResult get(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry pKey,
            +                           DatabaseEntry data,
            +                           Get getType,
            +                           ReadOptions options)
            +
            Retrieves a record according to the specified Get type. + +

            If the operation succeeds, the record will be locked according to the + lock mode specified, the key, primary + key and/or data will be returned via the (non-null) DatabaseEntry + parameters, and a non-null OperationResult will be returned. If the + operation fails because the record requested is not found, null is + returned.

            + +

            The following table lists each allowed operation and whether the key, + pKey and data parameters are input + or output parameters. See the individual Get operations for + more information.

            + +
            + + + + + + + + + + + + + + + + + + + + + +
            Get operationDescription'key' parameter'pKey' parameter'data' parameter
            Get.SEARCHSearches using an exact match by key.inputoutputoutput
            Get.SEARCH_BOTHSearches using an exact match by key and data.inputinputoutput
            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified to transaction-protect the operation, or null may be specified + to perform the operation without transaction protection. For a + non-transactional database, null must be specified.
            +
            key - the secondary key input parameter.
            +
            pKey - the primary key input or output parameter, depending on + getType.
            +
            data - the primary data output parameter.
            +
            getType - the Get operation type. May not be null.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record requested is found, else null.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the database has been closed.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified. + This includes passing a null getType, a null input key/pKey parameter, + an input key/pKey parameter with a null data array, a partial key/pKey + input parameter, and specifying a lock mode of READ_COMMITTED.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public OperationStatus get(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           LockMode lockMode)
            +
            Description copied from class: Database
            +
            Retrieves the key/data pair with the given key. If the matching key has + duplicate values, the first data item in the set of duplicates is + returned. Retrieval of duplicates requires the use of Cursor + operations. + +

            Calling this method is equivalent to calling Database.get(Transaction, DatabaseEntry, DatabaseEntry, Get, ReadOptions) with + Get.SEARCH.

            +
            +
            Overrides:
            +
            get in class Database
            +
            Parameters:
            +
            key - the secondary key used as input. It must be initialized with + a non-null byte array by the caller.
            +
            data - the primary data returned as output. Its byte array does + not need to be initialized by the caller. + +
            +
            txn - For a transactional database, an explicit transaction may be + specified to transaction-protect the operation, or null may be specified + to perform the operation without transaction protection. For a + non-transactional database, null must be specified.
            +
            lockMode - the locking attributes; if null, default attributes are + used.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getSearchBoth

            +
            public OperationStatus getSearchBoth(Transaction txn,
            +                                     DatabaseEntry key,
            +                                     DatabaseEntry data,
            +                                     LockMode lockMode)
            +
            This operation is not allowed with this method signature. UnsupportedOperationException will always be thrown by this method. + The corresponding method with the pKey parameter should be + used instead.
            +
            +
            Overrides:
            +
            getSearchBoth in class Database
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified to transaction-protect the operation, or null may be specified + to perform the operation without transaction protection. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input.
            +
            data - the data used as + input.
            +
            lockMode - the locking attributes; if null, default attributes are + used.
            +
            Returns:
            +
            OperationStatus.NOTFOUND if no matching key/data pair is found; + otherwise, OperationStatus.SUCCESS.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            put

            +
            public OperationResult put(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           Put putType,
            +                           WriteOptions options)
            +
            This operation is not allowed on a secondary database. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary database should be used instead.
            +
            +
            Overrides:
            +
            put in class Database
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input.
            +
            data - the data used as + input.
            +
            putType - the Put operation type. May not be null.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is written, else null.
            +
            +
          • +
          + + + +
            +
          • +

            put

            +
            public OperationStatus put(Transaction txn,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data)
            +
            This operation is not allowed on a secondary database. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary database should be used instead.
            +
            +
            Overrides:
            +
            put in class Database
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input..
            +
            data - the data used as + input.
            +
            Returns:
            +
            OperationStatus.SUCCESS.
            +
            +
          • +
          + + + +
            +
          • +

            putNoOverwrite

            +
            public OperationStatus putNoOverwrite(Transaction txn,
            +                                      DatabaseEntry key,
            +                                      DatabaseEntry data)
            +
            This operation is not allowed on a secondary database. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary database should be used instead.
            +
            +
            Overrides:
            +
            putNoOverwrite in class Database
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input..
            +
            data - the data used as + input.
            +
            Returns:
            +
            OperationStatus.KEYEXIST if the key already appears in the database, + else OperationStatus.SUCCESS
            +
            +
          • +
          + + + +
            +
          • +

            putNoDupData

            +
            public OperationStatus putNoDupData(Transaction txn,
            +                                    DatabaseEntry key,
            +                                    DatabaseEntry data)
            +
            This operation is not allowed on a secondary database. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary database should be used instead.
            +
            +
            Overrides:
            +
            putNoDupData in class Database
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            key - the key used as + input..
            +
            data - the data used as + input.
            +
            Returns:
            +
            OperationStatus.KEYEXIST if the key/data pair already appears in the + database, else OperationStatus.SUCCESS
            +
            +
          • +
          + + + +
            +
          • +

            join

            +
            public JoinCursor join(Cursor[] cursors,
            +                       JoinConfig config)
            +
            This operation is not allowed on a secondary database. UnsupportedOperationException will always be thrown by this method. + The corresponding method on the primary database should be used instead.
            +
            +
            Overrides:
            +
            join in class Database
            +
            Parameters:
            +
            cursors - an array of cursors associated with this primary + database.
            +
            config - The join attributes. If null, default attributes are + used.
            +
            Returns:
            +
            a specialized cursor that returns the results of the equality + join operation.
            +
            See Also:
            +
            JoinCursor
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryIntegrityException.html b/docs/java/com/sleepycat/je/SecondaryIntegrityException.html new file mode 100644 index 0000000..c9c4da2 --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryIntegrityException.html @@ -0,0 +1,300 @@ + + + + + +SecondaryIntegrityException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SecondaryIntegrityException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SecondaryIntegrityException
        +extends SecondaryReferenceException
        +
        Thrown when an integrity problem is detected while accessing a secondary + database, including access to secondaries while writing to a primary + database. Secondary integrity problems are normally caused by the use of + secondaries without transactions. + +

        The Transaction handle is invalidated as a result of this + exception. In addition, the corrupt index (secondary database) is marked + as corrupt in memory. All subsequent access to the index will throw + SecondaryIntegrityException. To correct the problem, the + application may perform a full restore (an HA NetworkRestore or restore from backup) or rebuild + the corrupt index.

        + +

        Some possible causes of a secondary integrity exception are listed + below. Note that only the first item -- the use of a non-transactional + store -- is applicable when using the DPL. + All other items below do not apply to the use of the DPL, because the DPL + ensures that secondary databases are configured and managed correctly.

        +
          +
        1. The use of non-transactional databases or stores can cause secondary + corruption as described in Special considerations for using + Secondary Databases with and without Transactions. Secondary databases + and indexes should always be used in conjunction with transactional + databases and stores.
        2. + +
        3. Secondary corruption can be caused by an incorrectly implemented + secondary key creator method, for example, one which uses mutable state + information or is not properly synchronized. When the DPL is not used, the + application is responsible for correctly implementing the key creator.
        4. + +
        5. Secondary corruption can be caused by failing to open a secondary + database before writing to the primary database, by writing to a secondary + database directly using a Database handle, or by truncating or + removing primary database without also truncating or removing all secondary + databases. When the DPL is not used, the application is responsible for + managing associated databases correctly.

          +
        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryKeyCreator.html b/docs/java/com/sleepycat/je/SecondaryKeyCreator.html new file mode 100644 index 0000000..4ab7e9f --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryKeyCreator.html @@ -0,0 +1,342 @@ + + + + + +SecondaryKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface SecondaryKeyCreator

      +
      +
      +
      +
        +
      • +
        +
        All Known Implementing Classes:
        +
        SerialSerialKeyCreator, TupleSerialKeyCreator, TupleSerialMarshalledKeyCreator, TupleTupleKeyCreator, TupleTupleMarshalledKeyCreator
        +
        +
        +
        +
        public interface SecondaryKeyCreator
        +
        The interface implemented for extracting single-valued secondary keys from + primary records. + +

        The key creator object is specified by calling SecondaryConfig.setKeyCreator. The secondary + database configuration is specified when calling Environment.openSecondaryDatabase.

        + +

        For example:

        + +
        +     class MyKeyCreator implements SecondaryKeyCreator {
        +         public boolean createSecondaryKey(SecondaryDatabase secondary,
        +                                             DatabaseEntry key,
        +                                             DatabaseEntry data,
        +                                             DatabaseEntry result) {
        +             //
        +             // DO HERE: Extract the secondary key from the primary key and
        +             // data, and set the secondary key into the result parameter.
        +             //
        +             return true;
        +         }
        +     }
        +     ...
        +     SecondaryConfig secConfig = new SecondaryConfig();
        +     secConfig.setKeyCreator(new MyKeyCreator());
        +     // Now pass secConfig to Environment.openSecondaryDatabase
        + 
        + +

        Use this interface when zero or one secondary key is present in a single + primary record, in other words, for many-to-one and one-to-one + relationships. When more than one secondary key may be present (for + many-to-many and one-to-many relationships), use the SecondaryMultiKeyCreator interface instead. The table below summarizes how + to create all four variations of relationships.

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        RelationshipInterfaceDuplicatesExample
        One-to-oneSecondaryKeyCreatorNoA person record with a unique social security number key.
        Many-to-oneSecondaryKeyCreatorYesA person record with a non-unique employer key.
        One-to-manySecondaryMultiKeyCreatorNoA person record with multiple unique email address keys.
        Many-to-manySecondaryMultiKeyCreatorYesA person record with multiple non-unique organization keys.
        + +
        + +

        To configure a database for duplicates. pass true to DatabaseConfig.setSortedDuplicates(boolean).

        + +

        WARNING: Key creator instances are shared by multiple threads + and key creator methods are called without any special synchronization. + Therefore, key creators must be thread safe. In general no shared state + should be used and any caching of computed values must be done with proper + synchronization.

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            createSecondaryKey

            +
            boolean createSecondaryKey(SecondaryDatabase secondary,
            +                           DatabaseEntry key,
            +                           DatabaseEntry data,
            +                           DatabaseEntry result)
            +
            Creates a secondary key entry, given a primary key and data entry. + +

            A secondary key may be derived from the primary key, primary data, or + a combination of the primary key and data. For secondary keys that are + optional, the key creator method may return false and the key/data pair + will not be indexed. To ensure the integrity of a secondary database + the key creator method must always return the same result for a given + set of input parameters.

            + +

            A RuntimeException may be thrown by this method if an error + occurs attempting to create the secondary key. This exception will be + thrown by the API method currently in progress, for example, a put method. However, this will cause the write operation + to be incomplete. When databases are not configured to be + transactional, caution should be used to avoid integrity problems. See + Special considerations for + using Secondary Databases with and without Transactions.

            +
            +
            Parameters:
            +
            secondary - the database to which the secondary key will be + added. This parameter is passed for informational purposes but is not + commonly used. This parameter is always non-null.
            +
            key - the primary key entry. This parameter must not be modified + by this method. This parameter is always non-null.
            +
            data - the primary data entry. This parameter must not be modified + by this method. If SecondaryConfig#setExtractFromPrimaryKeyOnly + is configured as true, the data param may be either null + or non-null, and the implementation is expected to ignore it; otherwise, + this parameter is always non-null.
            +
            result - the secondary key created by this method. This parameter + is always non-null.
            +
            Returns:
            +
            true if a key was created, or false to indicate that the key is + not present.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryMultiKeyCreator.html b/docs/java/com/sleepycat/je/SecondaryMultiKeyCreator.html new file mode 100644 index 0000000..28a15e6 --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryMultiKeyCreator.html @@ -0,0 +1,342 @@ + + + + + +SecondaryMultiKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Interface SecondaryMultiKeyCreator

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface SecondaryMultiKeyCreator
        +
        The interface implemented for extracting multi-valued secondary keys from + primary records. + +

        The key creator object is specified by calling SecondaryConfig.setMultiKeyCreator. The + secondary database configuration is specified when calling Environment.openSecondaryDatabase.

        + +

        For example:

        + +
        +     class MyMultiKeyCreator implements SecondaryMultiKeyCreator {
        +         public void createSecondaryKeys(SecondaryDatabase secondary,
        +                                         DatabaseEntry key,
        +                                         DatabaseEntry data,
        +                                         Set<DatabaseEntry> results) {
        +             //
        +             // DO HERE: Extract the secondary keys from the primary key and
        +             // data.  For each key extracted, create a DatabaseEntry and add
        +             // it to the results set.
        +             //
        +         }
        +     }
        +     ...
        +     SecondaryConfig secConfig = new SecondaryConfig();
        +     secConfig.setMultiKeyCreator(new MyMultiKeyCreator());
        +     // Now pass secConfig to Environment.openSecondaryDatabase
        + 
        + +

        Use this interface when any number of secondary keys may be present in a + single primary record, in other words, for many-to-many and one-to-many + relationships. When only zero or one secondary key is present (for + many-to-one and one-to-one relationships) you may use the SecondaryKeyCreator interface instead. The table below summarizes how to + create all four variations of relationships.

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        RelationshipInterfaceDuplicatesExample
        One-to-oneSecondaryKeyCreatorNoA person record with a unique social security number key.
        Many-to-oneSecondaryKeyCreatorYesA person record with a non-unique employer key.
        One-to-manySecondaryMultiKeyCreatorNoA person record with multiple unique email address keys.
        Many-to-manySecondaryMultiKeyCreatorYesA person record with multiple non-unique organization keys.
        + +
        + +

        To configure a database for duplicates. pass true to DatabaseConfig.setSortedDuplicates(boolean).

        + +

        Note that SecondaryMultiKeyCreator may also be used for + single key secondaries (many-to-one and one-to-one); in this case, at most a + single key is added to the results set. + SecondaryMultiKeyCreator is only slightly less efficient than + SecondaryKeyCreator in that two or three temporary sets must be + created to hold the results. @see SecondaryConfig

        + +

        WARNING: Key creator instances are shared by multiple threads + and key creator methods are called without any special synchronization. + Therefore, key creators must be thread safe. In general no shared state + should be used and any caching of computed values must be done with proper + synchronization.

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            createSecondaryKeys

            +
            void createSecondaryKeys(SecondaryDatabase secondary,
            +                         DatabaseEntry key,
            +                         DatabaseEntry data,
            +                         java.util.Set<DatabaseEntry> results)
            +
            Creates a secondary key entry, given a primary key and data entry. + +

            A secondary key may be derived from the primary key, primary data, or + a combination of the primary key and data. Zero or more secondary keys + may be derived from the primary record and returned in the results + parameter. To ensure the integrity of a secondary database the key + creator method must always return the same results for a given set of + input parameters.

            + +

            A RuntimeException may be thrown by this method if an error + occurs attempting to create the secondary key. This exception will be + thrown by the API method currently in progress, for example, a put method. However, this will cause the write operation + to be incomplete. When databases are not configured to be + transactional, caution should be used to avoid integrity problems. See + Special considerations for + using Secondary Databases with and without Transactions.

            +
            +
            Parameters:
            +
            secondary - the database to which the secondary key will be + added. This parameter is passed for informational purposes but is not + commonly used. This parameter is always non-null.
            +
            key - the primary key entry. This parameter must not be modified + by this method. This parameter is always non-null.
            +
            data - the primary data entry. This parameter must not be modified + by this method. If SecondaryConfig#setExtractFromPrimaryKeyOnly + is configured as true, the data param may be either null + or non-null, and the implementation is expected to ignore it; otherwise, + this parameter is always non-null.
            +
            results - the set to contain the the secondary key DatabaseEntry + objects created by this method.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SecondaryReferenceException.html b/docs/java/com/sleepycat/je/SecondaryReferenceException.html new file mode 100644 index 0000000..4f17298 --- /dev/null +++ b/docs/java/com/sleepycat/je/SecondaryReferenceException.html @@ -0,0 +1,365 @@ + + + + + +SecondaryReferenceException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SecondaryReferenceException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          longgetExpirationTime() +
          Returns the expiration time of the record being accessed during the + failure.
          +
          DatabaseEntrygetPrimaryKey() +
          Returns the primary key being accessed during the failure.
          +
          java.lang.StringgetSecondaryDatabaseName() +
          Returns the name of the secondary database being accessed during the + failure.
          +
          DatabaseEntrygetSecondaryKey() +
          Returns the secondary key being accessed during the failure.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getSecondaryDatabaseName

            +
            public java.lang.String getSecondaryDatabaseName()
            +
            Returns the name of the secondary database being accessed during the + failure.
            +
          • +
          + + + +
            +
          • +

            getSecondaryKey

            +
            public DatabaseEntry getSecondaryKey()
            +
            Returns the secondary key being accessed during the failure. Note that + in some cases, the returned primary key can be null.
            +
          • +
          + + + +
            +
          • +

            getPrimaryKey

            +
            public DatabaseEntry getPrimaryKey()
            +
            Returns the primary key being accessed during the failure. Note that + in some cases, the returned primary key can be null.
            +
          • +
          + + + +
            +
          • +

            getExpirationTime

            +
            public long getExpirationTime()
            +
            Returns the expiration time of the record being accessed during the + failure.
            +
            +
            Since:
            +
            7.0
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Sequence.html b/docs/java/com/sleepycat/je/Sequence.html new file mode 100644 index 0000000..bef3665 --- /dev/null +++ b/docs/java/com/sleepycat/je/Sequence.html @@ -0,0 +1,409 @@ + + + + + +Sequence (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class Sequence

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.Sequence
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class Sequence
        +extends java.lang.Object
        +implements java.io.Closeable
        +
        A Sequence handle is used to manipulate a sequence record in a + database. Sequence handles are opened using the Database.openSequence method.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidclose() +
          Closes a sequence.
          +
          longget(Transaction txn, + int delta) +
          Returns the next available element in the sequence and changes the + sequence value by delta.
          +
          DatabasegetDatabase() +
          Returns the Database handle associated with this sequence.
          +
          DatabaseEntrygetKey() +
          Returns the DatabaseEntry used to open this sequence.
          +
          SequenceStatsgetStats(StatsConfig config) +
          Returns statistical information about the sequence.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws DatabaseException
            +
            Closes a sequence. Any unused cached values are lost. + +

            The sequence handle may not be used again after this method has + been called, regardless of the method's success or failure.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            public long get(Transaction txn,
            +                int delta)
            +         throws DatabaseException
            +
            Returns the next available element in the sequence and changes the + sequence value by delta. The value of delta + must be greater than zero. If there are enough cached values in the + sequence handle then they will be returned. Otherwise the next value + will be fetched from the database and incremented (decremented) by + enough to cover the delta and the next batch of cached + values. + + This method is synchronized to protect updating of the cached value, + since multiple threads may share a single handle. Multiple handles for + the same database/key may be used to increase concurrency.

            + +

            The txn handle must be null if the sequence handle was + opened with a non-zero cache size.

            + +

            For maximum concurrency, a non-zero cache size should be specified + prior to opening the sequence handle, the txn handle should + be null, and SequenceConfig.setAutoCommitNoSync should be called to disable log + flushes.

            +
            +
            Parameters:
            +
            txn - For a transactional database, an explicit transaction may be + specified, or null may be specified to use auto-commit. For a + non-transactional database, null must be specified.
            +
            delta - the amount by which to increment or decrement the sequence
            +
            Returns:
            +
            the next available element in the sequence
            +
            Throws:
            +
            SequenceOverflowException - if the end of the sequence is reached + and wrapping is not configured.
            +
            SequenceIntegrityException - if the sequence record has been + deleted.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalArgumentException - if the delta is less than or equal to + zero, or larger than the size of the sequence's range.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getDatabase

            +
            public Database getDatabase()
            +
            Returns the Database handle associated with this sequence.
            +
            +
            Returns:
            +
            The Database handle associated with this sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getKey

            +
            public DatabaseEntry getKey()
            +
            Returns the DatabaseEntry used to open this sequence.
            +
            +
            Returns:
            +
            The DatabaseEntry used to open this sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getStats

            +
            public SequenceStats getStats(StatsConfig config)
            +                       throws DatabaseException
            +
            Returns statistical information about the sequence. + +

            In the presence of multiple threads or processes accessing an active + sequence, the information returned by this method may be + out-of-date.

            + +

            The getStats method cannot be transaction-protected. For this reason, + it should be called in a thread of control that has no open cursors or + active transactions.

            +
            +
            Parameters:
            +
            config - The statistics returned; if null, default statistics are + returned.
            +
            Returns:
            +
            Sequence statistics.
            +
            Throws:
            +
            SequenceIntegrityException - if the sequence record has been + deleted.
            +
            DatabaseException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SequenceConfig.html b/docs/java/com/sleepycat/je/SequenceConfig.html new file mode 100644 index 0000000..3ddac96 --- /dev/null +++ b/docs/java/com/sleepycat/je/SequenceConfig.html @@ -0,0 +1,811 @@ + + + + + +SequenceConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SequenceConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.SequenceConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class SequenceConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of a sequence.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static SequenceConfigDEFAULT +
          Default configuration used if null is passed to methods that create a + cursor.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          SequenceConfig() +
          An instance created using the default constructor is initialized with + the system's default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          SequenceConfigclone() +
          Returns a copy of this configuration object.
          +
          booleangetAllowCreate() +
          Returns true if the Database.openSequence method is configured to create the sequence if it + does not already exist.
          +
          booleangetAutoCommitNoSync() +
          Returns true if the auto-commit operations on the sequence are configure + to not flush the transaction log..
          +
          intgetCacheSize() +
          Returns the number of elements cached by a sequence handle..
          +
          booleangetDecrement() +
          Returns true if the sequence is configured to decrement.
          +
          booleangetExclusiveCreate() +
          Returns true if the Database.openSequence method is configured to fail if the database + already exists.
          +
          longgetInitialValue() +
          Returns the initial value for a sequence..
          +
          longgetRangeMax() +
          Returns the maximum value for the sequence.
          +
          longgetRangeMin() +
          Returns the minimum value for the sequence.
          +
          booleangetWrap() +
          Returns true if the sequence will wrap around when it is incremented + (decremented) past the specified maximum (minimum) value.
          +
          SequenceConfigsetAllowCreate(boolean allowCreate) +
          Configures the Database.openSequence method to create the sequence if it does not + already exist.
          +
          SequenceConfigsetAutoCommitNoSync(boolean autoCommitNoSync) +
          Configures auto-commit operations on the sequence to not flush the + transaction log.
          +
          SequenceConfigsetCacheSize(int cacheSize) +
          Set the Configure the number of elements cached by a sequence handle.
          +
          SequenceConfigsetDecrement(boolean decrement) +
          Specifies that the sequence should be decremented.
          +
          SequenceConfigsetExclusiveCreate(boolean exclusiveCreate) +
          Configures the Database.openSequence method to fail if the database already exists.
          +
          SequenceConfigsetInitialValue(long initialValue) +
          Sets the initial value for a sequence.
          +
          SequenceConfigsetRange(long min, + long max) +
          Configures a sequence range.
          +
          SequenceConfigsetWrap(boolean wrap) +
          Specifies that the sequence should wrap around when it is incremented + (decremented) past the specified maximum (minimum) value.
          +
          java.lang.StringtoString() +
          Returns the values for each configuration attribute.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final SequenceConfig DEFAULT
            +
            Default configuration used if null is passed to methods that create a + cursor.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            SequenceConfig

            +
            public SequenceConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setAllowCreate

            +
            public SequenceConfig setAllowCreate(boolean allowCreate)
            +
            Configures the Database.openSequence method to create the sequence if it does not + already exist. + +

            The default value is false.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            allowCreate - If true, configure the Database.openSequence method to + create the sequence if it does not already exist.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getAllowCreate

            +
            public boolean getAllowCreate()
            +
            Returns true if the Database.openSequence method is configured to create the sequence if it + does not already exist. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Database.openSequence method is configured to create the sequence if it + does not already exist.
            +
            +
          • +
          + + + +
            +
          • +

            setCacheSize

            +
            public SequenceConfig setCacheSize(int cacheSize)
            +
            Set the Configure the number of elements cached by a sequence handle. + +

            The default value is zero.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            cacheSize - The number of elements cached by a sequence handle. + May not be larger than the size of the range defined by setRange(long, long).
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getCacheSize

            +
            public int getCacheSize()
            +
            Returns the number of elements cached by a sequence handle.. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The number of elements cached by a sequence handle..
            +
            +
          • +
          + + + +
            +
          • +

            setDecrement

            +
            public SequenceConfig setDecrement(boolean decrement)
            +
            Specifies that the sequence should be decremented. + +

            The default value is false.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            decrement - If true, specify that the sequence should be + decremented.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getDecrement

            +
            public boolean getDecrement()
            +
            Returns true if the sequence is configured to decrement. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the sequence is configured to decrement.
            +
            +
          • +
          + + + +
            +
          • +

            setExclusiveCreate

            +
            public SequenceConfig setExclusiveCreate(boolean exclusiveCreate)
            +
            Configures the Database.openSequence method to fail if the database already exists. + +

            The default value is false.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            exclusiveCreate - If true, configure the Database.openSequence method to + fail if the database already exists.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getExclusiveCreate

            +
            public boolean getExclusiveCreate()
            +
            Returns true if the Database.openSequence method is configured to fail if the database + already exists. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Database.openSequence method is configured to fail if the database + already exists.
            +
            +
          • +
          + + + +
            +
          • +

            setInitialValue

            +
            public SequenceConfig setInitialValue(long initialValue)
            +
            Sets the initial value for a sequence. + +

            The default initial value is zero.

            + +

            This call is only effective when the sequence is being created.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            initialValue - The initial value for a sequence. Must be within + the range minimum and maximum values, inclusive.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getInitialValue

            +
            public long getInitialValue()
            +
            Returns the initial value for a sequence.. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The initial value for a sequence..
            +
            +
          • +
          + + + +
            +
          • +

            setAutoCommitNoSync

            +
            public SequenceConfig setAutoCommitNoSync(boolean autoCommitNoSync)
            +
            Configures auto-commit operations on the sequence to not flush the + transaction log. + +

            The default value is false.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            autoCommitNoSync - If true, configure auto-commit operations on + the sequence to not flush the transaction log.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getAutoCommitNoSync

            +
            public boolean getAutoCommitNoSync()
            +
            Returns true if the auto-commit operations on the sequence are configure + to not flush the transaction log.. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the auto-commit operations on the sequence are configure + to not flush the transaction log..
            +
            +
          • +
          + + + +
            +
          • +

            setRange

            +
            public SequenceConfig setRange(long min,
            +                               long max)
            +
            Configures a sequence range. This call is only effective when the + sequence is being created. + +

            The default minimum is Long.MIN_VALUE and the default maximum + is Long.MAX_VALUE.

            +
            +
            Parameters:
            +
            min - The minimum value for the sequence. Must be less than max.
            +
            max - The maximum value for the sequence. Must be greater than + min.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getRangeMin

            +
            public long getRangeMin()
            +
            Returns the minimum value for the sequence. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The minimum value for the sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getRangeMax

            +
            public long getRangeMax()
            +
            Returns the maximum value for the sequence. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            The maximum value for the sequence.
            +
            +
          • +
          + + + +
            +
          • +

            setWrap

            +
            public SequenceConfig setWrap(boolean wrap)
            +
            Specifies that the sequence should wrap around when it is incremented + (decremented) past the specified maximum (minimum) value. + +

            The default value is false.

            + +

            This method may be called at any time during the life of the + application.

            +
            +
            Parameters:
            +
            wrap - If true, specify that the sequence should wrap around when + it is incremented (decremented) past the specified maximum (minimum) + value.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getWrap

            +
            public boolean getWrap()
            +
            Returns true if the sequence will wrap around when it is incremented + (decremented) past the specified maximum (minimum) value. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the sequence will wrap around when it is incremented + (decremented) past the specified maximum (minimum) value.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public SequenceConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SequenceExistsException.html b/docs/java/com/sleepycat/je/SequenceExistsException.html new file mode 100644 index 0000000..8c2b289 --- /dev/null +++ b/docs/java/com/sleepycat/je/SequenceExistsException.html @@ -0,0 +1,257 @@ + + + + + +SequenceExistsException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SequenceExistsException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SequenceExistsException
        +extends OperationFailureException
        +
        Thrown by Database.openSequence if the + sequence record already exists and the SequenceConfig + ExclusiveCreate parameter is true. + +

        The Transaction handle is not invalidated as a result of + this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SequenceIntegrityException.html b/docs/java/com/sleepycat/je/SequenceIntegrityException.html new file mode 100644 index 0000000..387137b --- /dev/null +++ b/docs/java/com/sleepycat/je/SequenceIntegrityException.html @@ -0,0 +1,256 @@ + + + + + +SequenceIntegrityException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SequenceIntegrityException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SequenceIntegrityException
        +extends OperationFailureException
        +
        Thrown by Sequence.get if the sequence record has been + deleted. + +

        The Transaction handle is not invalidated as a result of + this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SequenceNotFoundException.html b/docs/java/com/sleepycat/je/SequenceNotFoundException.html new file mode 100644 index 0000000..ec890d7 --- /dev/null +++ b/docs/java/com/sleepycat/je/SequenceNotFoundException.html @@ -0,0 +1,257 @@ + + + + + +SequenceNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SequenceNotFoundException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SequenceNotFoundException
        +extends OperationFailureException
        +
        Thrown by Database.openSequence if the + sequence record does not exist and the SequenceConfig AllowCreate + parameter is false. + +

        The Transaction handle is not invalidated as a result of + this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SequenceOverflowException.html b/docs/java/com/sleepycat/je/SequenceOverflowException.html new file mode 100644 index 0000000..72ecc41 --- /dev/null +++ b/docs/java/com/sleepycat/je/SequenceOverflowException.html @@ -0,0 +1,256 @@ + + + + + +SequenceOverflowException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SequenceOverflowException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SequenceOverflowException
        +extends OperationFailureException
        +
        Thrown by Sequence.get if the end of the sequence is + reached and wrapping is not configured. + +

        The Transaction handle is not invalidated as a result of + this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/SequenceStats.html b/docs/java/com/sleepycat/je/SequenceStats.html new file mode 100644 index 0000000..1397875 --- /dev/null +++ b/docs/java/com/sleepycat/je/SequenceStats.html @@ -0,0 +1,432 @@ + + + + + +SequenceStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class SequenceStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.SequenceStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SequenceStats
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        A SequenceStats object is used to return sequence statistics.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intgetCacheSize() +
          Returns the number of values that will be cached in this handle.
          +
          longgetCurrent() +
          Returns the current value of the sequence in the database.
          +
          longgetLastValue() +
          Returns the last cached value of the sequence.
          +
          longgetMax() +
          Returns the maximum permitted value of the sequence.
          +
          longgetMin() +
          Returns the minimum permitted value of the sequence.
          +
          intgetNCachedGets() +
          Returns the number of times that Sequence.get was called and a cached + value was returned.
          +
          intgetNGets() +
          Returns the number of times that Sequence.get was called successfully.
          +
          longgetValue() +
          Returns the current cached value of the sequence.
          +
          java.lang.StringtoString() 
          java.lang.StringtoStringVerbose() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNGets

            +
            public int getNGets()
            +
            Returns the number of times that Sequence.get was called successfully.
            +
            +
            Returns:
            +
            number of times that Sequence.get was called successfully.
            +
            +
          • +
          + + + +
            +
          • +

            getNCachedGets

            +
            public int getNCachedGets()
            +
            Returns the number of times that Sequence.get was called and a cached + value was returned.
            +
            +
            Returns:
            +
            number of times that Sequence.get was called and a cached + value was returned.
            +
            +
          • +
          + + + +
            +
          • +

            getCurrent

            +
            public long getCurrent()
            +
            Returns the current value of the sequence in the database.
            +
            +
            Returns:
            +
            current value of the sequence in the database.
            +
            +
          • +
          + + + +
            +
          • +

            getValue

            +
            public long getValue()
            +
            Returns the current cached value of the sequence.
            +
            +
            Returns:
            +
            current cached value of the sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getLastValue

            +
            public long getLastValue()
            +
            Returns the last cached value of the sequence.
            +
            +
            Returns:
            +
            last cached value of the sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getMin

            +
            public long getMin()
            +
            Returns the minimum permitted value of the sequence.
            +
            +
            Returns:
            +
            minimum permitted value of the sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getMax

            +
            public long getMax()
            +
            Returns the maximum permitted value of the sequence.
            +
            +
            Returns:
            +
            maximum permitted value of the sequence.
            +
            +
          • +
          + + + +
            +
          • +

            getCacheSize

            +
            public int getCacheSize()
            +
            Returns the number of values that will be cached in this handle.
            +
            +
            Returns:
            +
            number of values that will be cached in this handle.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toStringVerbose

            +
            public java.lang.String toStringVerbose()
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/StatsConfig.html b/docs/java/com/sleepycat/je/StatsConfig.html new file mode 100644 index 0000000..ea2b002 --- /dev/null +++ b/docs/java/com/sleepycat/je/StatsConfig.html @@ -0,0 +1,554 @@ + + + + + +StatsConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class StatsConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.StatsConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class StatsConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of a statistics retrieval operation.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static StatsConfigCLEAR +
          A convenience instance for which setClear(true) has been called, and + all other properties have default values.
          +
          static StatsConfigDEFAULT +
          A convenience instance embodying the default configuration.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          StatsConfig() +
          An instance created using the default constructor is initialized with + the system's default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          StatsConfigclone() +
          Returns a copy of this configuration object.
          +
          booleangetClear() +
          Returns true if the statistics operation is configured to reset + statistics after they are returned.
          +
          booleangetFast() +
          Returns true if the statistics operation is configured to return only + the values which do not require expensive actions.
          +
          intgetShowProgressInterval() +
          Returns the showProgressInterval value, if set.
          +
          java.io.PrintStreamgetShowProgressStream() +
          Returns the PrintStream on which the progress messages will be displayed + during long running statistics gathering operations.
          +
          StatsConfigsetClear(boolean clear) +
          Configures the statistics operation to reset statistics after they are + returned.
          +
          StatsConfigsetFast(boolean fast) +
          Configures the statistics operation to return only the values which do + not incur some performance penalty.
          +
          StatsConfigsetShowProgressInterval(int showProgressInterval) +
          When the statistics operation is configured to display progress the + showProgressInterval is the number of LNs between each progress report.
          +
          StatsConfigsetShowProgressStream(java.io.PrintStream showProgressStream) +
          Configures the statistics operation to display progress to the + PrintStream argument.
          +
          java.lang.StringtoString() +
          Returns the values for each configuration attribute.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final StatsConfig DEFAULT
            +
            A convenience instance embodying the default configuration.
            +
          • +
          + + + +
            +
          • +

            CLEAR

            +
            public static final StatsConfig CLEAR
            +
            A convenience instance for which setClear(true) has been called, and + all other properties have default values.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            StatsConfig

            +
            public StatsConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setFast

            +
            public StatsConfig setFast(boolean fast)
            +
            Configures the statistics operation to return only the values which do + not incur some performance penalty. + +

            The default value is false.

            + +

            For example, skip stats that require a traversal of the database or + in-memory tree, or which lock down the lock table for a period of + time.

            +
            +
            Parameters:
            +
            fast - If set to true, configure the statistics operation to return + only the values which do not incur some performance penalty.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getFast

            +
            public boolean getFast()
            +
            Returns true if the statistics operation is configured to return only + the values which do not require expensive actions.
            +
            +
            Returns:
            +
            true if the statistics operation is configured to return only + the values which do not require expensive actions.
            +
            +
          • +
          + + + +
            +
          • +

            setClear

            +
            public StatsConfig setClear(boolean clear)
            +
            Configures the statistics operation to reset statistics after they are + returned. The default value is false.
            +
            +
            Parameters:
            +
            clear - If set to true, configure the statistics operation to + reset statistics after they are returned.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getClear

            +
            public boolean getClear()
            +
            Returns true if the statistics operation is configured to reset + statistics after they are returned.
            +
            +
            Returns:
            +
            true if the statistics operation is configured to reset + statistics after they are returned.
            +
            +
          • +
          + + + +
            +
          • +

            setShowProgressStream

            +
            public StatsConfig setShowProgressStream(java.io.PrintStream showProgressStream)
            +
            Configures the statistics operation to display progress to the + PrintStream argument. The accumulated statistics will be displayed + every N records, where N is the value of showProgressInterval.
            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getShowProgressStream

            +
            public java.io.PrintStream getShowProgressStream()
            +
            Returns the PrintStream on which the progress messages will be displayed + during long running statistics gathering operations.
            +
          • +
          + + + +
            +
          • +

            setShowProgressInterval

            +
            public StatsConfig setShowProgressInterval(int showProgressInterval)
            +
            When the statistics operation is configured to display progress the + showProgressInterval is the number of LNs between each progress report.
            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getShowProgressInterval

            +
            public int getShowProgressInterval()
            +
            Returns the showProgressInterval value, if set.
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public StatsConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/ThreadInterruptedException.html b/docs/java/com/sleepycat/je/ThreadInterruptedException.html new file mode 100644 index 0000000..74f305a --- /dev/null +++ b/docs/java/com/sleepycat/je/ThreadInterruptedException.html @@ -0,0 +1,292 @@ + + + + + +ThreadInterruptedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class ThreadInterruptedException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class ThreadInterruptedException
        +extends EnvironmentFailureException
        +
        Thrown when java.lang.InterruptedException (a thread interrupt) or + java.nio.channels.ClosedChannelException (which also results from a + thread interrupt) occurs in any JE method. This occurs when the application, + or perhaps a library or container that the application is using, calls + Thread.interrupt(). + +

        Calling Thread.interrupt is not recommended for an active JE + thread if the goal is to stop the thread or do thread coordination. If you + interrupt a thread that is executing a JE operation, the state of the + environment will be undefined. That's because JE might have been in the + middle of I/O activity when the operation was aborted midstream, and it + becomes very difficult to detect and handle all possible outcomes.

        + +

        When JE detects the interrupt, it will mark the environment invalid and + will throw a ThreadInterruptedException. This tells you that you + must close the environment and re-open it before using it again. This is + necessary, because if JE didn't throw ThreadInterruptedException, it + is very likely that you would get some other exception that is less + meaningful, or simply see corrupted data.

        + +

        Instead, applications should use other mechanisms like Object.notify and wait to coordinate threads. For example, use a + keepRunning variable of some kind in each thread. Check this + variable in your threads, and return from the thread when it is false. Set + it to false when you want to stop the thread. If this thread is waiting to + be woken up to do another unit of work, use Object.notify to wake it + up. This is the recommended technique.

        + +

        However, if the use of Thread.interrupt is unavoidable, be sure + to use it only when shutting down the environment. In this situation, + the ThreadInterruptedException should be expected. Note that + by shutting down the environment abnormally, recovery time will be longer + when the environment is subsequently opened, because a final checkpoint was + not performed.

        + +

        Existing Environment handles are invalidated as a result of this + exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Transaction.State.html b/docs/java/com/sleepycat/je/Transaction.State.html new file mode 100644 index 0000000..30b7fc6 --- /dev/null +++ b/docs/java/com/sleepycat/je/Transaction.State.html @@ -0,0 +1,444 @@ + + + + + +Transaction.State (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Enum Transaction.State

      +
      +
      +
        +
      • java.lang.Object
      • +
      • + +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<Transaction.State>
        +
        +
        +
        Enclosing class:
        +
        Transaction
        +
        +
        +
        +
        public static enum Transaction.State
        +extends java.lang.Enum<Transaction.State>
        +
        The current state of the transaction.
        +
        +
        Since:
        +
        5.0.48
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ABORTED +
          The transaction has been aborted.
          +
          COMMITTED +
          The transaction has been committed and is locally durable according + to the local SyncPolicy requested.
          +
          MUST_ABORT +
          The transaction has been invalidated by an exception and cannot be + committed.
          +
          OPEN +
          The transaction has not been committed or aborted, and can be used + for performing operations.
          +
          POSSIBLY_COMMITTED +
          An exception was thrown by the commit method due to an error + that occurred while attempting to make the transaction durable.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static Transaction.StatevalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static Transaction.State[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + + + + + +
            +
          • +

            POSSIBLY_COMMITTED

            +
            public static final Transaction.State POSSIBLY_COMMITTED
            +
            An exception was thrown by the commit method due to an error + that occurred while attempting to make the transaction durable. The + transaction may or may not be locally durable, according to the + local SyncPolicy requested. +

            + This is an unusual situation and is normally due to a system + failure, storage device failure, disk full condition, thread + interrupt, or a bug of some kind. When a transaction is in this + state, the Environment will have been invalidated by the error. +

            + In a replicated environment, a transaction in this state is not + transferred to replicas. If it turns out that the transaction is + indeed durable, it will be transferred to replicas via normal + replication mechanisms when the Environment is re-opened. +

            + When the commit method throws an exception and the + transaction is in the POSSIBLY_COMMITTED state, some + applications may wish to perform a data query to determine whether + the transaction is durable or not. Note that in the event of a + system level failure, the reads themselves may be unreliable, e.g. + the data may be in the file system cache but not on disk. Other + applications may wish to repeat the transaction unconditionally, + after resolving the error condition, particularly when the set of + operations in the transaction is designed to be idempotent.

            +
          • +
          + + + +
            +
          • +

            COMMITTED

            +
            public static final Transaction.State COMMITTED
            +
            The transaction has been committed and is locally durable according + to the local SyncPolicy requested. +

            + Note that a transaction may be in this state even when an exception + is thrown by the commit method. For example, in a + replicated environment, an InsufficientAcksException may be thrown after + the transaction is committed locally.

            +
          • +
          + + + +
            +
          • +

            MUST_ABORT

            +
            public static final Transaction.State MUST_ABORT
            +
            The transaction has been invalidated by an exception and cannot be + committed. See OperationFailureException for a description + of how a transaction can become invalid. The application is + responsible for aborting the transaction.
            +
          • +
          + + + +
            +
          • +

            ABORTED

            +
            public static final Transaction.State ABORTED
            +
            The transaction has been aborted.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static Transaction.State[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (Transaction.State c : Transaction.State.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static Transaction.State valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/Transaction.html b/docs/java/com/sleepycat/je/Transaction.html new file mode 100644 index 0000000..bb0dd7c --- /dev/null +++ b/docs/java/com/sleepycat/je/Transaction.html @@ -0,0 +1,1020 @@ + + + + + +Transaction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class Transaction

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.Transaction
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class Transaction
        +extends java.lang.Object
        +
        The Transaction object is the handle for a transaction. Methods off the + transaction handle are used to configure, abort and commit the transaction. + Transaction handles are provided to other Berkeley DB methods in order to + transactionally protect those operations. + +

        A single Transaction may be used to protect operations for any number of + Databases in a given environment. However, a single Transaction may not be + used for operations in more than one distinct environment.

        + +

        Transaction handles are free-threaded; transactions handles may be used + concurrently by multiple threads. Once the Transaction.abort or Transaction.commit method + is called, the handle may not be accessed again, regardless of the success + or failure of the method, with one exception: the abort method may + be called any number of times to simplify error handling.

        + +

        To obtain a transaction with default attributes:

        + +
        +     Transaction txn = myEnvironment.beginTransaction(null, null);
        + 
        + +

        To customize the attributes of a transaction:

        + +
        +     TransactionConfig config = new TransactionConfig();
        +     config.setReadUncommitted(true);
        +     Transaction txn = myEnvironment.beginTransaction(null, config);
        + 
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Nested Class Summary

          + + + + + + + + + + +
          Nested Classes 
          Modifier and TypeClass and Description
          static class Transaction.State +
          The current state of the transaction.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          voidabort() +
          Cause an abnormal termination of the transaction.
          +
          voidcommit() +
          End the transaction.
          +
          voidcommit(Durability durability) +
          End the transaction using the specified durability requirements.
          +
          voidcommitNoSync() +
          End the transaction, not writing to stable storage and not committing + synchronously.
          +
          voidcommitSync() +
          End the transaction, writing to stable storage and committing + synchronously.
          +
          voidcommitWriteNoSync() +
          End the transaction, writing to stable storage but not committing + synchronously.
          +
          CommitTokengetCommitToken() +
          This method is intended for use with a replicated environment.
          +
          longgetId() +
          Return the transaction's unique ID.
          +
          longgetLockTimeout(java.util.concurrent.TimeUnit unit) +
          Returns the lock request timeout value for the transaction.
          +
          java.lang.StringgetName() +
          Get the user visible name for the transaction.
          +
          Transaction.StategetState() +
          Returns the current state of the transaction.
          +
          longgetTxnTimeout(java.util.concurrent.TimeUnit unit) +
          Returns the timeout value for the transaction lifetime.
          +
          booleanisValid() +
          Returns whether this Transaction is open, which is equivalent + to when getState() returns Transaction.State.OPEN.
          +
          voidsetLockTimeout(long timeOut) +
          Deprecated.  +
          as of 4.0, replaced by setLockTimeout(long, + TimeUnit).
          +
          +
          voidsetLockTimeout(long timeOut, + java.util.concurrent.TimeUnit unit) +
          Configures the lock request timeout value for the transaction.
          +
          voidsetName(java.lang.String name) +
          Set the user visible name for the transaction.
          +
          voidsetTxnTimeout(long timeOut) +
          Deprecated.  +
          as of 4.0, replaced by setTxnTimeout(long, + TimeUnit).
          +
          +
          voidsetTxnTimeout(long timeOut, + java.util.concurrent.TimeUnit unit) +
          Configures the timeout value for the transaction lifetime.
          +
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            abort

            +
            public void abort()
            +           throws DatabaseException
            +
            Cause an abnormal termination of the transaction. + +

            The log is played backward, and any necessary undo operations are + done. Before Transaction.abort returns, any locks held by the + transaction will have been released.

            + +

            In the case of nested transactions, aborting a parent transaction + causes all children (unresolved or not) of the parent transaction to be + aborted.

            + +

            All cursors opened within the transaction must be closed before the + transaction is aborted.

            + +

            After this method has been called, regardless of its return, the + Transaction handle may not be accessed again, with one + exception: the abort method itself may be called any number of + times to simplify error handling.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the environment has been closed, or + cursors associated with the transaction are still open.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getId

            +
            public long getId()
            +
            Return the transaction's unique ID.
            +
            +
            Returns:
            +
            The transaction's unique ID.
            +
            +
          • +
          + + + +
            +
          • +

            getCommitToken

            +
            public CommitToken getCommitToken()
            +                           throws java.lang.IllegalStateException
            +
            This method is intended for use with a replicated environment. +

            + It returns the commitToken associated with a successful replicated + commit. A null value is returned if the txn was not associated with a + replicated environment, or the txn did not result in any changes to the + environment. This method should only be called after the transaction + has finished. +

            + This method is typically used in conjunction with the + CommitPointConsistencyPolicy.

            +
            +
            Returns:
            +
            the token used to identify the replicated commit. Return null if + the transaction has aborted, or has committed without making any + updates.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the method is called before the + transaction has committed or aborted.
            +
            See Also:
            +
            CommitPointConsistencyPolicy
            +
            +
          • +
          + + + +
            +
          • +

            commit

            +
            public void commit()
            +            throws DatabaseException
            +
            End the transaction. If the environment is configured for synchronous + commit, the transaction will be committed synchronously to stable + storage before the call returns. This means the transaction will + exhibit all of the ACID (atomicity, consistency, isolation, and + durability) properties. + +

            If the environment is not configured for synchronous commit, the + commit will not necessarily have been committed to stable storage before + the call returns. This means the transaction will exhibit the ACI + (atomicity, consistency, and isolation) properties, but not D + (durability); that is, database integrity will be maintained, but it is + possible this transaction may be undone during recovery.

            + +

            All cursors opened within the transaction must be closed before the + transaction is committed.

            + +

            If the method encounters an error, the transaction will have been aborted when the call + returns.

            + +

            After this method has been called, regardless of its return, the + Transaction handle may not be accessed again, with one + exception: the abort method may be called any number of times + to simplify error handling.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Throws:
            +
            InsufficientReplicasException - if the master + in a replicated environment could not contact a quorum of replicas as + determined by the Durability.ReplicaAckPolicy.
            +
            InsufficientAcksException - if the master in + a replicated environment did not receive enough replica acknowledgments, + although the commit succeeded locally.
            +
            ReplicaWriteException - if a write operation + was performed with this transaction, but this node is now a Replica.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed, or cursors associated with the transaction are still open.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            commit

            +
            public void commit(Durability durability)
            +            throws DatabaseException
            +
            End the transaction using the specified durability requirements. This + requirement overrides any default durability requirements associated + with the environment. If the durability requirements cannot be satisfied, + an exception is thrown to describe the problem. Please see + Durability for specific exceptions that could result when the + durability requirements cannot be satisfied. + +

            All cursors opened within the transaction must be closed before the + transaction is committed.

            + +

            If the method encounters an error, the transaction will have been aborted when the call + returns.

            + +

            After this method has been called, regardless of its return, the + Transaction handle may not be accessed again, with one + exception: the abort method may be called any number of times + to simplify error handling.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Parameters:
            +
            durability - the durability requirements for this transaction
            +
            Throws:
            +
            InsufficientReplicasException - if the master + in a replicated environment could not contact enough replicas to + initiate the commit.
            +
            InsufficientAcksException - if the master in + a replicated environment did not receive enough replica acknowledgments, + althought the commit succeeded locally.
            +
            ReplicaWriteException - if a write operation + was performed with this transaction, but this node is now a Replica.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed, or cursors associated with the transaction are still open.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            commitSync

            +
            public void commitSync()
            +                throws DatabaseException
            +
            End the transaction, writing to stable storage and committing + synchronously. This means the transaction will exhibit all of the ACID + (atomicity, consistency, isolation, and durability) properties. + +

            This behavior is the default for database environments unless + otherwise configured using the EnvironmentConfig.setTxnNoSync method. This behavior may also be set + for a single transaction using the Environment.beginTransaction method. Any value specified to this + method overrides both of those settings.

            + +

            All cursors opened within the transaction must be closed before the + transaction is committed.

            + +

            If the method encounters an error, the transaction will have been aborted when the call + returns.

            + +

            After this method has been called, regardless of its return, the + Transaction handle may not be accessed again, with one + exception: the abort method may be called any number of times + to simplify error handling.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Throws:
            +
            InsufficientReplicasException - if the master + in a replicated environment could not contact enough replicas to + initiate the commit.
            +
            InsufficientAcksException - if the master in + a replicated environment did not receive enough replica acknowledgments, + althought the commit succeeded locally.
            +
            ReplicaWriteException - if a write operation + was performed with this transaction, but this node is now a Replica.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed, or cursors associated with the transaction are still open.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            commitNoSync

            +
            public void commitNoSync()
            +                  throws DatabaseException
            +
            End the transaction, not writing to stable storage and not committing + synchronously. This means the transaction will exhibit the ACI + (atomicity, consistency, and isolation) properties, but not D + (durability); that is, database integrity will be maintained, but it is + possible this transaction may be undone during recovery. + +

            This behavior may be set for a database environment using the EnvironmentConfig.setTxnNoSync method or for a single transaction using + the Environment.beginTransaction method. Any value specified to this + method overrides both of those settings.

            + +

            All cursors opened within the transaction must be closed before the + transaction is committed.

            + +

            If the method encounters an error, the transaction will have been aborted when the call + returns.

            + +

            After this method has been called, regardless of its return, the + Transaction handle may not be accessed again, with one + exception: the abort method may be called any number of times + to simplify error handling.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Throws:
            +
            InsufficientReplicasException - if the master + in a replicated environment could not contact enough replicas to + initiate the commit.
            +
            InsufficientAcksException - if the master in + a replicated environment did not receive enough replica acknowledgments, + althought the commit succeeded locally.
            +
            ReplicaWriteException - if a write operation + was performed with this transaction, but this node is now a Replica.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed, or cursors associated with the transaction are still open.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            commitWriteNoSync

            +
            public void commitWriteNoSync()
            +                       throws DatabaseException
            +
            End the transaction, writing to stable storage but not committing + synchronously. This means the transaction will exhibit the ACI + (atomicity, consistency, and isolation) properties, but not D + (durability); that is, database integrity will be maintained, but it is + possible this transaction may be undone during recovery. + +

            This behavior is the default for database environments unless + otherwise configured using the EnvironmentConfig.setTxnNoSync method. This behavior may also be set + for a single transaction using the Environment.beginTransaction method. Any value specified to this + method overrides both of those settings.

            + +

            All cursors opened within the transaction must be closed before the + transaction is committed.

            + +

            If the method encounters an error, the transaction will have been aborted when the call + returns.

            + +

            After this method has been called, regardless of its return, the + Transaction handle may not be accessed again, with one + exception: the abort method may be called any number of times + to simplify error handling.

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Throws:
            +
            InsufficientReplicasException - if the master + in a replicated environment could not contact enough replicas to + initiate the commit.
            +
            InsufficientAcksException - if the master in + a replicated environment did not receive enough replica acknowledgments, + althought the commit succeeded locally.
            +
            ReplicaWriteException - if a write operation + was performed with this transaction, but this node is now a Replica.
            +
            OperationFailureException - if this exception occurred earlier and + caused the transaction to be invalidated.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed, or cursors associated with the transaction are still open.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getTxnTimeout

            +
            public long getTxnTimeout(java.util.concurrent.TimeUnit unit)
            +                   throws EnvironmentFailureException,
            +                          java.lang.IllegalStateException,
            +                          java.lang.IllegalArgumentException
            +
            Returns the timeout value for the transaction lifetime. + +

            If setTxnTimeout(long,TimeUnit) has not been called to + configure the timeout, the environment configuration value (EnvironmentConfig.TXN_TIMEOUT )is returned.

            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value. May not be null.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed.
            +
            java.lang.IllegalArgumentException - if the unit is null.
            +
            Since:
            +
            4.0
            +
            +
          • +
          + + + +
            +
          • +

            setTxnTimeout

            +
            public void setTxnTimeout(long timeOut,
            +                          java.util.concurrent.TimeUnit unit)
            +                   throws java.lang.IllegalArgumentException,
            +                          DatabaseException
            +
            Configures the timeout value for the transaction lifetime. + +

            If the transaction runs longer than this time, an operation using the + transaction may throw TransactionTimeoutException. The + transaction timeout is checked when locking a record, as part of a read + or write operation.

            + +

            A value of zero (which is the default) disables timeouts for the + transaction, meaning that no limit on the duration of the transaction is + enforced. Note that the setLockTimeout(long, TimeUnit) lock + timeout} is independent of the transaction timeout, and the lock timeout + should not normally be set to zero.

            +
            +
            Parameters:
            +
            timeOut - The timeout value for the transaction lifetime, or zero + to disable transaction timeouts.
            +
            unit - the TimeUnit of the timeOut value. May be null only + if timeOut is zero.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed.
            +
            java.lang.IllegalArgumentException - if timeOut or unit is invalid.
            +
            DatabaseException
            +
            Since:
            +
            4.0
            +
            +
          • +
          + + + +
            +
          • +

            setTxnTimeout

            +
            public void setTxnTimeout(long timeOut)
            +                   throws java.lang.IllegalArgumentException,
            +                          DatabaseException
            +
            Deprecated. as of 4.0, replaced by setTxnTimeout(long, + TimeUnit).
            +
            Configures the timeout value for the transaction lifetime, with the + timeout value specified in microseconds. This method is equivalent to: + +
            setTxnTimeout(long, TimeUnit.MICROSECONDS);
            +
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getLockTimeout

            +
            public long getLockTimeout(java.util.concurrent.TimeUnit unit)
            +                    throws EnvironmentFailureException,
            +                           java.lang.IllegalStateException,
            +                           java.lang.IllegalArgumentException
            +
            Returns the lock request timeout value for the transaction. + +

            If setLockTimeout(long,TimeUnit) has not been called to + configure the timeout, the environment configuration value (EnvironmentConfig.LOCK_TIMEOUT) is returned.

            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value. May not be null.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed.
            +
            java.lang.IllegalArgumentException - if the unit is null.
            +
            Since:
            +
            4.0
            +
            +
          • +
          + + + +
            +
          • +

            setLockTimeout

            +
            public void setLockTimeout(long timeOut,
            +                           java.util.concurrent.TimeUnit unit)
            +                    throws java.lang.IllegalArgumentException,
            +                           DatabaseException
            +
            Configures the lock request timeout value for the transaction. This + overrides the default lock timeout. + +

            A value of zero disables lock timeouts. This is not recommended, even + when the application expects that deadlocks will not occur or will be + easily resolved. A lock timeout is a fall-back that guards against + unexpected "live lock", unresponsive threads, or application failure to + close a cursor or to commit or abort a transaction.

            +
            +
            Parameters:
            +
            timeOut - The lock timeout for all transactional and + non-transactional operations, or zero to disable lock timeouts.
            +
            unit - the TimeUnit of the timeOut value. May be null only + if timeOut is zero.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the transaction or environment has been + closed.
            +
            java.lang.IllegalArgumentException - if timeOut or unit is invalid.
            +
            DatabaseException
            +
            Since:
            +
            4.0
            +
            +
          • +
          + + + +
            +
          • +

            setLockTimeout

            +
            public void setLockTimeout(long timeOut)
            +                    throws java.lang.IllegalArgumentException,
            +                           DatabaseException
            +
            Deprecated. as of 4.0, replaced by setLockTimeout(long, + TimeUnit).
            +
            Configures the lock request timeout value for the transaction, with the + timeout value specified in microseconds. This method is equivalent to: + +
            setLockTimeout(long, TimeUnit.MICROSECONDS);
            +
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            setName

            +
            public void setName(java.lang.String name)
            +
            Set the user visible name for the transaction.
            +
            +
            Parameters:
            +
            name - The user visible name for the transaction.
            +
            +
          • +
          + + + +
            +
          • +

            getName

            +
            public java.lang.String getName()
            +
            Get the user visible name for the transaction.
            +
            +
            Returns:
            +
            The user visible name for the transaction.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            isValid

            +
            public boolean isValid()
            +
            Returns whether this Transaction is open, which is equivalent + to when getState() returns Transaction.State.OPEN. See Transaction.State.OPEN for more + information. + +

            When an OperationFailureException, or one of its subclasses, + is caught, the isValid method may be called to determine whether + the Transaction can continue to be used, or should be + aborted.

            +
          • +
          + + + +
            +
          • +

            getState

            +
            public Transaction.State getState()
            +
            Returns the current state of the transaction.
            +
            +
            Since:
            +
            5.0.48
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/TransactionConfig.html b/docs/java/com/sleepycat/je/TransactionConfig.html new file mode 100644 index 0000000..cb2cc58 --- /dev/null +++ b/docs/java/com/sleepycat/je/TransactionConfig.html @@ -0,0 +1,976 @@ + + + + + +TransactionConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class TransactionConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.TransactionConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class TransactionConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of a database environment transaction.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final TransactionConfig DEFAULT
            +
            Default configuration used if null is passed to methods that create a + transaction.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            TransactionConfig

            +
            public TransactionConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setSync

            +
            public TransactionConfig setSync(boolean sync)
            +
            Configures the transaction to write and synchronously flush the log it + when commits. + +

            This behavior may be set for a database environment using the + Environment.setMutableConfig method. Any value specified to this method + overrides that setting.

            + +

            The default is false for this class and true for the database + environment.

            + +

            If true is passed to both setSync and setNoSync, setSync will take + precedence.

            +
            +
            Parameters:
            +
            sync - If true, transactions exhibit all the ACID (atomicity, + consistency, isolation, and durability) properties.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getSync

            +
            public boolean getSync()
            +
            Returns true if the transaction is configured to write and synchronously + flush the log it when commits.
            +
            +
            Returns:
            +
            true if the transaction is configured to write and synchronously + flush the log it when commits.
            +
            +
          • +
          + + + +
            +
          • +

            setNoSync

            +
            public TransactionConfig setNoSync(boolean noSync)
            + +
            Configures the transaction to not write or synchronously flush the log + it when commits. + +

            This behavior may be set for a database environment using the + Environment.setMutableConfig method. Any value specified to this method + overrides that setting.

            + +

            The default is false for this class and the database environment.

            +
            +
            Parameters:
            +
            noSync - If true, transactions exhibit the ACI (atomicity, + consistency, and isolation) properties, but not D (durability); that is, + database integrity will be maintained, but if the application or system + fails, it is possible some number of the most recently committed + transactions may be undone during recovery. The number of transactions + at risk is governed by how many log updates can fit into the log buffer, + how often the operating system flushes dirty buffers to disk, and how + often the log is checkpointed.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getNoSync

            +
            public boolean getNoSync()
            +
            Deprecated. replaced by getDurability()
            +
            Returns true if the transaction is configured to not write or + synchronously flush the log it when commits.
            +
            +
            Returns:
            +
            true if the transaction is configured to not write or + synchronously flush the log it when commits.
            +
            +
          • +
          + + + +
            +
          • +

            setWriteNoSync

            +
            public TransactionConfig setWriteNoSync(boolean writeNoSync)
            + +
            Configures the transaction to write but not synchronously flush the log + it when commits. + +

            This behavior may be set for a database environment using the + Environment.setMutableConfig method. Any value specified to this method + overrides that setting.

            + +

            The default is false for this class and the database environment.

            +
            +
            Parameters:
            +
            writeNoSync - If true, transactions exhibit the ACI (atomicity, + consistency, and isolation) properties, but not D (durability); that is, + database integrity will be maintained, but if the operating system + fails, it is possible some number of the most recently committed + transactions may be undone during recovery. The number of transactions + at risk is governed by how often the operating system flushes dirty + buffers to disk, and how often the log is checkpointed.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getWriteNoSync

            +
            public boolean getWriteNoSync()
            +
            Deprecated. replaced by getDurability()
            +
            Returns true if the transaction is configured to write but not + synchronously flush the log it when commits.
            +
            +
            Returns:
            +
            true if the transaction is configured to not write or + synchronously flush the log it when commits.
            +
            +
          • +
          + + + +
            +
          • +

            setDurability

            +
            public TransactionConfig setDurability(Durability durability)
            +
            Configures the durability associated with a transaction when it commits. + Changes to durability are not reflected back to the "sync" booleans -- + there isn't a one to one mapping. + + Note that you should not use both the durability and the XXXSync() apis + on the same config object.
            +
            +
            Parameters:
            +
            durability - the durability definition
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setConsistencyPolicy

            +
            public TransactionConfig setConsistencyPolicy(ReplicaConsistencyPolicy consistencyPolicy)
            +
            Associates a consistency policy with this configuration.
            +
            +
            Parameters:
            +
            consistencyPolicy - the consistency definition
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getConsistencyPolicy

            +
            public ReplicaConsistencyPolicy getConsistencyPolicy()
            +
            Returns the consistency policy associated with the configuration.
            +
            +
            Returns:
            +
            the consistency policy currently associated with this config.
            +
            +
          • +
          + + + +
            +
          • +

            setNoWait

            +
            public TransactionConfig setNoWait(boolean noWait)
            +
            Configures the transaction to not wait if a lock request cannot be + immediately granted. + +

            The default is false for this class and the database environment.

            +
            +
            Parameters:
            +
            noWait - If true, transactions will not wait if a lock request + cannot be immediately granted, instead LockNotAvailableException + will be thrown.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getNoWait

            +
            public boolean getNoWait()
            +
            Returns true if the transaction is configured to not wait if a lock + request cannot be immediately granted.
            +
            +
            Returns:
            +
            true if the transaction is configured to not wait if a lock + request cannot be immediately granted.
            +
            +
          • +
          + + + +
            +
          • +

            setReadUncommitted

            +
            public TransactionConfig setReadUncommitted(boolean readUncommitted)
            +
            Configures read operations performed by the transaction to return + modified but not yet committed data.
            +
            +
            Parameters:
            +
            readUncommitted - If true, configure read operations performed by + the transaction to return modified but not yet committed data.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            LockMode.READ_UNCOMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            getReadUncommitted

            +
            public boolean getReadUncommitted()
            +
            Returns true if read operations performed by the transaction are + configured to return modified but not yet committed data.
            +
            +
            Returns:
            +
            true if read operations performed by the transaction are + configured to return modified but not yet committed data.
            +
            See Also:
            +
            LockMode.READ_UNCOMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            setReadCommitted

            +
            public TransactionConfig setReadCommitted(boolean readCommitted)
            +
            Configures the transaction for read committed isolation. + +

            This ensures the stability of the current data item read by the + cursor but permits data read by this transaction to be modified or + deleted prior to the commit of the transaction.

            +
            +
            Parameters:
            +
            readCommitted - If true, configure the transaction for read + committed isolation.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            LockMode.READ_COMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            getReadCommitted

            +
            public boolean getReadCommitted()
            +
            Returns true if the transaction is configured for read committed + isolation.
            +
            +
            Returns:
            +
            true if the transaction is configured for read committed + isolation.
            +
            See Also:
            +
            LockMode.READ_COMMITTED
            +
            +
          • +
          + + + +
            +
          • +

            setSerializableIsolation

            +
            public TransactionConfig setSerializableIsolation(boolean serializableIsolation)
            +
            Configures this transaction to have serializable (degree 3) isolation. + By setting serializable isolation, phantoms will be prevented. + +

            By default a transaction provides Repeatable Read isolation; EnvironmentConfig.setTxnSerializableIsolation(boolean) may be called to override + the default. If the environment is configured for serializable + isolation, all transactions will be serializable regardless of whether + this method is called; calling setSerializableIsolation(boolean) with a + false parameter will not disable serializable isolation.

            + + The default is false for this class and the database environment.
            +
            +
            Returns:
            +
            this
            +
            See Also:
            +
            LockMode
            +
            +
          • +
          + + + +
            +
          • +

            getSerializableIsolation

            +
            public boolean getSerializableIsolation()
            +
            Returns true if the transaction has been explicitly configured to have + serializable (degree 3) isolation.
            +
            +
            Returns:
            +
            true if the transaction has been configured to have serializable + isolation.
            +
            See Also:
            +
            LockMode
            +
            +
          • +
          + + + +
            +
          • +

            setReadOnly

            +
            public TransactionConfig setReadOnly(boolean readOnly)
            +
            Configures this transaction to disallow write operations, regardless of + whether writes are allowed for the Environment or the + Databases that are accessed. + +

            If a write operation is attempted using a read-only transaction, + an UnsupportedOperationException will be thrown.

            + +

            For a read-only transaction, the transaction's Durability is + ignored, even when it is explicitly specified using setDurability(Durability).

            + +

            In a ReplicatedEnvironment, a read-only + transaction implicitly uses + Durability.ReplicaAckPolicy.NONE. + A read-only transaction on a Master will thus not be held up, or + throw InsufficientReplicasException, if the + Master is not in contact with a sufficient number of Replicas at the + time the transaction is initiated.

            + +

            The default setting is false (writes are allowed).

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getReadOnly

            +
            public boolean getReadOnly()
            +
            Returns whether read-only is configured for this transaction.
            +
          • +
          + + + +
            +
          • +

            setLocalWrite

            +
            public TransactionConfig setLocalWrite(boolean localWrite)
            +
            Configures this transaction to allow writing to non-replicated + Databases in a + ReplicatedEnvironment. + +

            In a replicated environment, a given transaction may be used to + write to either replicated databases or non-replicated databases, but + not both. If a write operation to a replicated database is attempted + when local-write is true, or to a non-replicated database when + local-write is false, an UnsupportedOperationException will be + thrown.

            + +

            Note that for auto-commit transactions (when the Transaction + parameter is null), the local-write setting is automatically set to + correspond to whether the database is replicated. With auto-commit, + local-write is always true for a non-replicated database, and + always false for a replicated database.

            + +

            In a replicated environment, a local-write transaction implicitly + uses Durability.ReplicaAckPolicy.NONE. + A local-write transaction on a Master will thus not be held up, or + throw InsufficientReplicasException, if the + Master is not in contact with a sufficient number of Replicas at the + time the transaction is initiated.

            + +

            By default the local-write setting is false, meaning that the + transaction may only write to replicated Databases in a replicated + environment.

            + +

            This configuration setting is ignored in a non-replicated Environment + since no databases are replicated.

            +
            +
            Returns:
            +
            this
            +
            See Also:
            +
            + + +
              +
            • +

              getLocalWrite

              +
              public boolean getLocalWrite()
              +
              Returns whether local-write is configured for this transaction.
              +
            • +
            + + + +
              +
            • +

              clone

              +
              public TransactionConfig clone()
              +
              Returns a copy of this configuration object.
              +
              +
              Overrides:
              +
              clone in class java.lang.Object
              +
              +
            • +
            + + + +
              +
            • +

              toString

              +
              public java.lang.String toString()
              +
              Returns the values for each configuration attribute.
              +
              +
              Overrides:
              +
              toString in class java.lang.Object
              +
              Returns:
              +
              the values for each configuration attribute.
              +
              +
            • +
            +
          • +
          +
        • +
        +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/TransactionStats.Active.html b/docs/java/com/sleepycat/je/TransactionStats.Active.html new file mode 100644 index 0000000..2b8da01 --- /dev/null +++ b/docs/java/com/sleepycat/je/TransactionStats.Active.html @@ -0,0 +1,308 @@ + + + + + +TransactionStats.Active (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class TransactionStats.Active

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.TransactionStats.Active
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Enclosing class:
        +
        TransactionStats
        +
        +
        +
        +
        public static class TransactionStats.Active
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        The Active class represents an active transaction.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          longgetId() +
          The transaction ID of the transaction.
          +
          java.lang.StringgetName() +
          The transaction name, including the thread name if available.
          +
          longgetParentId() +
          The transaction ID of the parent transaction (or 0, if no parent).
          +
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getId

            +
            public long getId()
            +
            The transaction ID of the transaction.
            +
          • +
          + + + +
            +
          • +

            getParentId

            +
            public long getParentId()
            +
            The transaction ID of the parent transaction (or 0, if no parent).
            +
          • +
          + + + +
            +
          • +

            getName

            +
            public java.lang.String getName()
            +
            The transaction name, including the thread name if available.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/TransactionStats.html b/docs/java/com/sleepycat/je/TransactionStats.html new file mode 100644 index 0000000..1c162ec --- /dev/null +++ b/docs/java/com/sleepycat/je/TransactionStats.html @@ -0,0 +1,422 @@ + + + + + +TransactionStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class TransactionStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.TransactionStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class TransactionStats
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Transaction statistics for a database environment.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Nested Class Summary

          + + + + + + + + + + +
          Nested Classes 
          Modifier and TypeClass and Description
          static class TransactionStats.Active +
          The Active class represents an active transaction.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          TransactionStats.Active[]getActiveTxns() +
          Return the array of active transactions.
          +
          longgetNAborts() +
          The number of transactions that have aborted.
          +
          intgetNActive() +
          The number of transactions that are currently active.
          +
          longgetNBegins() +
          The number of transactions that have begun.
          +
          longgetNCommits() +
          The number of transactions that have committed.
          +
          longgetNXAAborts() +
          The number of XA transactions that have aborted.
          +
          longgetNXACommits() +
          The number of XA transactions that have committed.
          +
          longgetNXAPrepares() +
          The number of XA transactions that have been prepared.
          +
          java.lang.StringtoString()
          java.lang.StringtoStringVerbose() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getActiveTxns

            +
            public TransactionStats.Active[] getActiveTxns()
            +
            Return the array of active transactions.
            +
            +
            Returns:
            +
            The array of active transactions.
            +
            +
          • +
          + + + +
            +
          • +

            getNAborts

            +
            public long getNAborts()
            +
            The number of transactions that have aborted.
            +
          • +
          + + + +
            +
          • +

            getNXAAborts

            +
            public long getNXAAborts()
            +
            The number of XA transactions that have aborted.
            +
          • +
          + + + +
            +
          • +

            getNXAPrepares

            +
            public long getNXAPrepares()
            +
            The number of XA transactions that have been prepared.
            +
          • +
          + + + +
            +
          • +

            getNActive

            +
            public int getNActive()
            +
            The number of transactions that are currently active.
            +
          • +
          + + + +
            +
          • +

            getNBegins

            +
            public long getNBegins()
            +
            The number of transactions that have begun.
            +
          • +
          + + + +
            +
          • +

            getNCommits

            +
            public long getNCommits()
            +
            The number of transactions that have committed.
            +
          • +
          + + + +
            +
          • +

            getNXACommits

            +
            public long getNXACommits()
            +
            The number of XA transactions that have committed.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toStringVerbose

            +
            public java.lang.String toStringVerbose()
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/TransactionTimeoutException.html b/docs/java/com/sleepycat/je/TransactionTimeoutException.html new file mode 100644 index 0000000..2f140e1 --- /dev/null +++ b/docs/java/com/sleepycat/je/TransactionTimeoutException.html @@ -0,0 +1,284 @@ + + + + + +TransactionTimeoutException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class TransactionTimeoutException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class TransactionTimeoutException
        +extends LockConflictException
        +
        Thrown when the transaction timeout interval is exceeded. This is normally + because the cumulative operation time for the transaction exceeds the + timeout, or another transaction or cursor holds a lock for longer than the + timeout interval. It may also occur if the application fails to close a + cursor, or fails to commit or abort a transaction, since any locks held by + the cursor or transaction will be held indefinitely. + +

        This exception is not thrown if a deadlock is detected, even if the + timeout elapses before the deadlock is broken. If a deadlock is detected, + DeadlockException is always thrown instead.

        + +

        The transaction timeout interval may be set using + Transaction.setTxnTimeout(long, java.util.concurrent.TimeUnit).

        + +

        The Transaction handle is invalidated as a result of this + exception.

        + +

        Normally, applications should catch the base class LockConflictException rather than catching one of its subclasses. All lock + conflicts are typically handled in the same way, which is normally to abort + and retry the transaction. See LockConflictException for more + information.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/UniqueConstraintException.html b/docs/java/com/sleepycat/je/UniqueConstraintException.html new file mode 100644 index 0000000..d18fcb0 --- /dev/null +++ b/docs/java/com/sleepycat/je/UniqueConstraintException.html @@ -0,0 +1,284 @@ + + + + + +UniqueConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class UniqueConstraintException

      +
      +
      + +
      + +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/VerifyConfig.html b/docs/java/com/sleepycat/je/VerifyConfig.html new file mode 100644 index 0000000..2fde442 --- /dev/null +++ b/docs/java/com/sleepycat/je/VerifyConfig.html @@ -0,0 +1,776 @@ + + + + + +VerifyConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class VerifyConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.VerifyConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class VerifyConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes of a verification operation.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            VerifyConfig

            +
            public VerifyConfig()
            +
            An instance created using the default constructor is initialized with + the system's default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setPropagateExceptions

            +
            public VerifyConfig setPropagateExceptions(boolean propagate)
            +
            Configures Environment.verify and Database.verify to propagate exceptions found during verification. + +

            By default this is false and exception information is printed to + System.out for notification but does not stop the verification activity, + which continues on for as long as possible.

            + +

            Note: Currently this method has no effect.

            +
            +
            Parameters:
            +
            propagate - If set to true, configure Environment.verify and Database.verify to propagate + exceptions found during verification.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getPropagateExceptions

            +
            public boolean getPropagateExceptions()
            +
            Returns true if the Environment.verify and Database.verify are configured to propagate exceptions found during + verification. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Environment.verify and Database.verify are configured to propagate exceptions found during + verification.
            +
            +
          • +
          + + + +
            +
          • +

            setAggressive

            +
            public VerifyConfig setAggressive(boolean aggressive)
            +
            Configures Environment.verify and Database.verify to perform fine granularity consistency checking that + includes verifying in memory constructs. + +

            This level of checking should only be performed while the database + environment is quiescent.

            + +

            By default this is false.

            + +

            Note: Currently, enabling aggressive verification has no additional + effect.

            +
            +
            Parameters:
            +
            aggressive - If set to true, configure Environment.verify and Database.verify to perform fine + granularity consistency checking that includes verifying in memory + constructs.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getAggressive

            +
            public boolean getAggressive()
            +
            Returns true if the Environment.verify and Database.verify are configured to perform fine granularity consistency + checking that includes verifying in memory constructs. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Environment.verify and Database.verify are configured to perform fine granularity consistency + checking that includes verifying in memory constructs.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getPrintInfo

            +
            public boolean getPrintInfo()
            +
            Returns true if the Environment.verify and Database.verify are configured to print basic verification information. + +

            This method may be called at any time during the life of the + application.

            +
            +
            Returns:
            +
            true if the Environment.verify and Database.verify are configured to print basic verification information.
            +
            +
          • +
          + + + +
            +
          • +

            setShowProgressStream

            +
            public VerifyConfig setShowProgressStream(java.io.PrintStream showProgressStream)
            +
            Configures the verify operation to display progress to the PrintStream + argument. The accumulated statistics will be displayed every N records, + where N is the value of showProgressInterval.
            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getShowProgressStream

            +
            public java.io.PrintStream getShowProgressStream()
            +
            Returns the PrintStream on which the progress messages will be displayed + during long running verify operations.
            +
          • +
          + + + +
            +
          • +

            setShowProgressInterval

            +
            public VerifyConfig setShowProgressInterval(int showProgressInterval)
            +
            When the verify operation is configured to display progress the + showProgressInterval is the number of LNs between each progress report.
            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getShowProgressInterval

            +
            public int getShowProgressInterval()
            +
            Returns the showProgressInterval value, if set.
            +
          • +
          + + + +
            +
          • +

            setVerifySecondaries

            +
            public VerifyConfig setVerifySecondaries(boolean verifySecondaries)
            +
            Configures verification to verify secondary database integrity. This is + equivalent to verifying secondaries in the background Btree verifier, + when EnvironmentConfig.VERIFY_SECONDARIES is set to true. + +

            By default this is true.

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getVerifySecondaries

            +
            public boolean getVerifySecondaries()
            +
            Returns the verifySecondaries value.
            +
          • +
          + + + +
            +
          • +

            setVerifyDataRecords

            +
            public VerifyConfig setVerifyDataRecords(boolean verifyDataRecords)
            +
            Configures verification to read and verify the leaf node (LN) of a + primary data record. This is equivalent to verifying data records in the + background Btree verifier, when + EnvironmentConfig.VERIFY_DATA_RECORDS is set to true. + +

            By default this is false.

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getVerifyDataRecords

            +
            public boolean getVerifyDataRecords()
            +
            Returns the verifyDataRecords value.
            +
          • +
          + + + +
            +
          • +

            setBatchSize

            +
            public VerifyConfig setBatchSize(int batchSize)
            +
            Configures the number of records verified per batch. In order to give + database remove/truncate the opportunity to execute, records are + verified in batches and there is a delay + between batches. + +

            By default the batch size is 1000.

            + +

            Note that when using the background data verifier, the batch size is + EnvironmentConfig.VERIFY_BTREE_BATCH_SIZE.

            +
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getBatchSize

            +
            public int getBatchSize()
            +
            Returns the batchSize value.
            +
          • +
          + + + +
            +
          • +

            setBatchDelay

            +
            public VerifyConfig setBatchDelay(long delay,
            +                                  java.util.concurrent.TimeUnit unit)
            +
            Configures the delay between batches. In order to give database + remove/truncate the opportunity to execute, records are verified in + batches and there is a delay between batches. + +

            By default the batch delay is 10 ms.

            + +

            Note that when using the background data verifier, the batch delay is + EnvironmentConfig.VERIFY_BTREE_BATCH_DELAY.

            +
            +
            Parameters:
            +
            delay - the delay between batches.
            +
            unit - the TimeUnit of the delay value. May be + null only if delay is zero.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getBatchDelay

            +
            public long getBatchDelay(java.util.concurrent.TimeUnit unit)
            +
            Returns the batch delay.
            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value. May not be null.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public VerifyConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns the values for each configuration attribute.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            Returns:
            +
            the values for each configuration attribute.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/VersionMismatchException.html b/docs/java/com/sleepycat/je/VersionMismatchException.html new file mode 100644 index 0000000..37717ad --- /dev/null +++ b/docs/java/com/sleepycat/je/VersionMismatchException.html @@ -0,0 +1,263 @@ + + + + + +VersionMismatchException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class VersionMismatchException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class VersionMismatchException
        +extends EnvironmentFailureException
        +
        Thrown by the Environment constructor when an environment cannot be + opened because the version of the existing log is not compatible with the + version of JE that is running. This occurs when a later version of JE was + used to create the log. + +

        Warning: This exception should be handled when more than + one version of JE may be used to access an environment.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/WriteOptions.html b/docs/java/com/sleepycat/je/WriteOptions.html new file mode 100644 index 0000000..b0d6a52 --- /dev/null +++ b/docs/java/com/sleepycat/je/WriteOptions.html @@ -0,0 +1,804 @@ + + + + + +WriteOptions (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class WriteOptions

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.WriteOptions
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class WriteOptions
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Options for calling methods that write (insert, update or delete) records. + +

        Time-To-Live

        + +

        When performing a 'put' operation, a TTL may be specified using + setTTL(int, TimeUnit) or setTTL(int).

        + +

        By default, the TTL property is zero, meaning there is no automatic + expiration. A non-zero TTL may be specified to cause an inserted record + to expire. The expiration time may also be changed for an existing + record by updating the record and specifying a different TTL, including + specifying zero to prevent the record from expiring. However, the TTL of + an existing record is updated only if setUpdateTTL(boolean) is + explicitly set to true. When deleting a record, the TTL parameter is + ignored.

        + +

        Records expire on day or hour boundaries, depending on the timeUnit parameter. At the time of the write operation, the TTL + parameter is used to compute the record's expiration time by first + converting it from days (or hours) to milliseconds, and then adding it + to the current system time. If the resulting expiration time is not + evenly divisible by the number of milliseconds in one day (or hour), it + is rounded up to the nearest day (or hour).

        + +

        Passing TimeUnit.DAYS, rather than TimeUnit.HOURS, for the timeUnit + parameter is recommended to minimize storage requirements (memory + and disk). Because the expiration time is stored in the JE Btree + internally, when using the TTL feature, the additional memory and disk + space required for storing Btree internal nodes (INs) is twice as much + when using TimeUnit.HOURS as when using TimeUnit.DAYS. Using + TimeUnit.DAYS adds about 5% to the space needed for INs, while + TimeUnit.HOURS adds about 10%.

        + +

        Note that JE stores the expiration time of the record and not the + original TTL value that was specified. The expiration time of a record + is available when reading (or writing) records via OperationResult.getExpirationTime().

        + +

        A summary of the behavior of expired records is as follows.

        +
          +
        • Space for expired records will be purged in the background by + the JE cleaner, and expired records will be filtered out of queries + even if they have not been purged.

        • + +
        • Expired records are removed individually: there is no guarantee + that records with the same expiration time will be removed + simultaneously.

        • + +
        • Records with expiration times support repeatable-read semantics + in most cases, but with some exceptions (described below).

        • +
        + +

        A more detailed description is below, including some information on + how expired records are handled internally.

        +
          +
        • Expired records will be purged in order to reclaim disk space. + This happens in background over time, and there is no guarantee that + the space for a record will be reclaimed at any particular time. + Purging of expired records occurs during the normal JE cleaning + process. The goals of the purging process are: +
            +
          1. to minimize the cost of purging;
          2. +
          3. to keep disk utilization below the EnvironmentConfig.CLEANER_MIN_UTILIZATION threshold, as usual, + but taking into account expired data; and
          4. +
          5. to reclaim expired data gradually and avoid spikes in + cleaning on day and hour boundaries.
          6. +
          + +
        • Expired records that have not been purged will be filtered out + of queries and will not be returned to the application. In a + replicated environment, purging and filtering occur independently on + each node. For queries to return consistent results on all nodes, + the system clocks on all nodes must be synchronized.

        • + +
        • Repeatable-read semantics are supported for records that expire + after being read. If a lock of any kind is held on a record and the + record expires, when accessing it again using the same transaction + or cursor, it will be accessed as if it is not expired. In other + words, locking a record prevents it from expiring, from the + viewpoint of that transaction or cursor. However, there are some + caveats and exceptions to this rule: +
            +
          • A lock by one transaction or cursor will not prevent a + record from being seen as expired when accessing it using a + different transaction or cursor.

          • + +
          • In the unlikely event that the system clock is changed, + locking a record may not guarantee that the record's data has + not been purged, if the data is not read at the time the + record is locked. This is because the record's key and its + data are purged independently. It is possible to lock a record + without reading its data by passing null for the 'data' + parameter. If a record is locked in this manner, and the data + was previously purged because the system clock was changed, + then one of the following may occur, even when using the same + transaction or cursor that was used to lock the record: +

          • +
              +
            • If the record is read again with a non-null data + parameter, the operation may fail (return null) because the + data cannot be read.

            • + +
            • If a partial update is attempted (passing a partial 'data' + parameter), the operation may fail (return null) + because the pre-existing data cannot be read.

            • +
            +
          + +
        • Even when multiple records have the same expiration time, JE + does not provide a way for them to expire atomically, as could be + done by explicitly deleting multiple records in a single + transaction. This restriction is for performance reasons; if records + could expire atomically, they could not be purged efficiently using + the JE cleaning process. Instead, each record expires individually, + as if each were deleted in a separate transaction. This means that + even when a set of records is inserted or updated atomically, a + query may return some but not not all of the records, when any of + the records expire at a time very close to the time of the query. + This is because the system clock is checked for each record + individually at the time it is read by the query, and because + expired records may be purged by other threads.

        • + +
        • There are several special cases of the above rule that involve + access to primary and secondary databases. Because a given primary + record and its associated secondary records are normal records in + most respects, this set of records does not expire atomically. For + most read and write operations, JE treats the expiration of any + record in this set as if all records have expired, and in these + cases there is no special behavior to consider. For example:

          +

            +
          • As long as the primary and secondary databases are + transactional, JE ensures that the expiration times of a + given primary record and all its associated secondary records + are the same.

          • + +
          • When reading a primary record via a secondary key, JE + first reads the secondary record and then the primary. If + either record expires during this process, both records are + treated as expired.

          • + +
          • When updating or deleting a primary record, JE first + reads the primary record to obtain the secondary keys and + then deletes/updates/inserts the secondary records as + needed. If a secondary record expires during this process, + this will not cause a SecondaryIntegrityException, as + would normally happen when an expected associated record is + missing.

          • + +
          • When a primary and/or secondary record expires after + being read, with few exceptions, repeatable-read semantics + are supported as described above, i.e., locks prevent + expiration from the viewpoint of the locking transaction or + cursor. Exceptions to this rule are described below.

          • +
          + + However, there are several cases where such treatment by JE is not + practical, and the user should be aware of special behavior when + primary or secondary records expire. These are not common use cases, + but it is important to be aware of them. In the cases described + below, let us assume a primary database has two associated secondary + databases, and a particular primary record with primary key X has + two secondary records with keys A and B, one in each secondary + database.

          +

            +
          • After a transaction or cursor reads and locks the primary + record via primary key X, reading via primary key X again + with the same transaction or cursor will also be successful + even if the record has expired, i.e., repeatable-read is + supported. However, if the record expires and the same + transaction or cursor attempts to read via key A or B, the + record will not be found. This is because the secondary + records for key A and B were not locked and they expire + independently of the primary record.

          • + +
          • Similarly, after a transaction or cursor reads and locks + the primary record via secondary key A successfully, reading + via key A again with the same transaction or cursor will also + be successful even if the record has expired. Reading via + primary key X will also be successful, even if the record has + expired, because the primary record was locked. However, if + the record expires and the same transaction or cursor + attempts to read via key B, the record will not be found. + This is because the secondary record for key B was not locked + and it expires independently of the primary record and the + secondary record for key A.

          • + +
          • When reading via a secondary database, it is possible to + read the only the secondary key and primary key (which are + both contained in the secondary record), but not the primary + record, by passing null for the 'data' parameter. In this + case the primary record is not locked. Therefore, if the + record expires and the same transaction or cursor attempts to + read the primary record (via any secondary key or the primary + key), the record will not be found.
          • + +
          • When a record expires, if its database serves as + a foreign key + database, the foreign key delete + action will not be enforced. Therefore, setting a TTL for a + record in a foreign key database is not recommended. The same + is true when using the DPL and a foreign key database is + specified using SecondaryKey.relatedEntity(). +

          • +
          +

        • + +
        • When JE detects what may be an internal integrity error, it + tries to determine whether an expired record, rather than a true + integrity error, is the underlying cause. To prevent internal errors + when small changes in the system clock time are made, if a record + has expired within EnvironmentConfig.ENV_TTL_CLOCK_TOLERANCE + (two hours, by default), JE treats the record as deleted and no + exception is thrown. + +

          When an integrity error does cause an exception to be thrown, the + record's expiration time will be included in the exception message + and this can help to diagnose the problem. This includes the + following exceptions: +

          +

          + +

          In cases where the clock has been changed by more than one hour + and integrity exceptions occur because of this, it may be possible + to avoid the exceptions by setting the EnvironmentConfig.ENV_TTL_CLOCK_TOLERANCE configuration parameter + to a larger value.

        • +
        + +

        In order to use the TTL feature in a ReplicatedEnvironment, all nodes + must be upgraded to JE 7.0 or later. If one or more nodes in a group + uses an earlier version, an IllegalStateException will be thrown when + attempting a put operation with a non-zero TTL. Also, once records with + a non-zero TTL have been written, a node using an earlier version of JE + may not join the group; if this is attempted, the node will fail during + open with an EnvironmentFailureException.

        +
        +
        Since:
        +
        7.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          WriteOptions() +
          Constructs a WriteOptions object with default values for all properties.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          WriteOptionsclone() 
          CacheModegetCacheMode() +
          Returns the CacheMode to be used for the operation, or null + if the Cursor, Database or Environment default will be used.
          +
          intgetTTL() +
          Returns the Time-To-Live property for a 'put' operation.
          +
          java.util.concurrent.TimeUnitgetTTLUnit() +
          Returns the Time-To-Live time unit for a 'put' operation.
          +
          booleangetUpdateTTL() +
          Returns the update-TTL property for a 'put' operation.
          +
          WriteOptionssetCacheMode(CacheMode cacheMode) +
          Sets the CacheMode to be used for the operation.
          +
          WriteOptionssetExpirationTime(long expirationTime, + java.util.concurrent.TimeUnit timeUnit) +
          A convenience method to set the TTL based on a given expiration time + and the current system time.
          +
          WriteOptionssetTTL(int ttl) +
          Sets the Time-To-Live property for a 'put' operation, using + TimeUnit.Days as the TTL unit.
          +
          WriteOptionssetTTL(int ttl, + java.util.concurrent.TimeUnit timeUnit) +
          Sets the Time-To-Live property for a 'put' operation, using the given + TimeUnit.
          +
          WriteOptionssetUpdateTTL(boolean updateTtl) +
          Sets the update-TTL property for a 'put' operation.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            WriteOptions

            +
            public WriteOptions()
            +
            Constructs a WriteOptions object with default values for all properties.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            clone

            +
            public WriteOptions clone()
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getCacheMode

            +
            public CacheMode getCacheMode()
            +
            Returns the CacheMode to be used for the operation, or null + if the Cursor, Database or Environment default will be used.
            +
            +
            See Also:
            +
            setCacheMode(CacheMode)
            +
            +
          • +
          + + + +
            +
          • +

            setTTL

            +
            public WriteOptions setTTL(int ttl)
            +
            Sets the Time-To-Live property for a 'put' operation, using + TimeUnit.Days as the TTL unit.
            +
            +
            Parameters:
            +
            ttl - the number of days after the current time on which + the record will automatically expire, or zero for no automatic + expiration. May not be negative.
            +
            Returns:
            +
            'this'.
            +
            See Also:
            +
            Time-To-Live
            +
            +
          • +
          + + + +
            +
          • +

            setTTL

            +
            public WriteOptions setTTL(int ttl,
            +                           java.util.concurrent.TimeUnit timeUnit)
            +
            Sets the Time-To-Live property for a 'put' operation, using the given + TimeUnit.
            +
            +
            Parameters:
            +
            ttl - the number of days or hours after the current time on which + the record will automatically expire, or zero for no automatic + expiration. May not be negative.
            +
            timeUnit - is TimeUnit.DAYS or TimeUnit.HOURS. TimeUnit.DAYS is + recommended to minimize storage requirements (memory and disk).
            +
            Returns:
            +
            'this'.
            +
            See Also:
            +
            Time-To-Live
            +
            +
          • +
          + + + +
            +
          • +

            getTTL

            +
            public int getTTL()
            +
            Returns the Time-To-Live property for a 'put' operation.
            +
            +
            See Also:
            +
            setTTL(int)
            +
            +
          • +
          + + + +
            +
          • +

            getTTLUnit

            +
            public java.util.concurrent.TimeUnit getTTLUnit()
            +
            Returns the Time-To-Live time unit for a 'put' operation.
            +
            +
            See Also:
            +
            setTTL(int, TimeUnit)
            +
            +
          • +
          + + + +
            +
          • +

            setUpdateTTL

            +
            public WriteOptions setUpdateTTL(boolean updateTtl)
            +
            Sets the update-TTL property for a 'put' operation. +

            + If this property is true and the operation updates a record, the + specified TTL will be used to assign a new expiration time for the + record, or to clear the record's expiration time if the specified + TTL is zero. +

            + If this parameter is false and the operation updates a record, the + record's expiration time will not be changed. +

            + If the operation inserts a record, this parameter is ignored and the + specified TTL is always applied. +

            + By default, this property is false.

            +
            +
            Parameters:
            +
            updateTtl - is whether to assign (or clear) the expiration time + when updating an existing record.
            +
            Returns:
            +
            'this'.
            +
            See Also:
            +
            Time-To-Live
            +
            +
          • +
          + + + +
            +
          • +

            getUpdateTTL

            +
            public boolean getUpdateTTL()
            +
            Returns the update-TTL property for a 'put' operation.
            +
            +
            See Also:
            +
            setUpdateTTL(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            setExpirationTime

            +
            public WriteOptions setExpirationTime(long expirationTime,
            +                                      java.util.concurrent.TimeUnit timeUnit)
            +
            A convenience method to set the TTL based on a given expiration time + and the current system time. +

            + Given a desired expiration time and TimeUnit (DAYS or HOURS), + sets the TTL to a value that will cause a record to expire at or after + the given time, if the record is stored at the current time. The + intended use case is to determine the TTL when writing a record and the + desired expiration time, rather than the TTL, is known. +

            + This method determines the TTL by taking the difference between the + current time and the given time, converting it from milliseconds to + days (or hours), and rounding up if it is not evenly divisible by + the number of milliseconds in one day (or hour). +

            + A special use case is when the expiration time was previously obtained + from OperationResult.getExpirationTime(), for example, when + performing an export followed by an import. To support this, null can be + passed for the timeUnit parameter and the time unit will be determined + as follows. +

              +
            • This method first converts the expiration time to a TTL in + hours, as described above. If the expiration time was obtained by + calling OperationResult.getExpirationTime(), then it will be + evenly divisible by the number of milliseconds in one hour and no + rounding will occur.
            • + +
            • If the resulting TTL in hours is an even multiple of 24, + DAYS is used; otherwise, HOURS is used. For example, + when performing an import, if the original expiration time was + specified in DAYS, and obtained by calling + OperationResult.getExpirationTime(), the unit derived by this + method will also be DAYS.
            • +
            +

            + Note that when a particular time unit is desired, null should not be + passed for the timeUnit parameter. Normally TimeUnit.DAYS is + recommended instead of TimeUnit.HOURS, to minimize storage + requirements (memory and disk). When the desired unit is known, the unit + should be passed explicitly.

            +
            +
            Parameters:
            +
            expirationTime - is the desired expiration time in milliseconds + (UTC), or zero for no automatic expiration.
            +
            timeUnit - is TimeUnit.DAYS or TimeUnit.HOURS, or + null to derive the time unit as described above.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if ttlUnits is not DAYS, HOURS or null.
            +
            See Also:
            +
            Time-To-Live
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/XAEnvironment.html b/docs/java/com/sleepycat/je/XAEnvironment.html new file mode 100644 index 0000000..f4bf4fa --- /dev/null +++ b/docs/java/com/sleepycat/je/XAEnvironment.html @@ -0,0 +1,517 @@ + + + + + +XAEnvironment (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class XAEnvironment

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable, javax.transaction.xa.XAResource
        +
        +
        +
        +
        public class XAEnvironment
        +extends Environment
        +implements javax.transaction.xa.XAResource
        +
        An Environment that implements XAResource. If JE is used in an XA + environment, this class should be used instead of Environment so that + appropriate XA functions are available.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            commit

            +
            public void commit(javax.transaction.xa.Xid xid,
            +                   boolean ignore)
            +            throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            commit in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            end

            +
            public void end(javax.transaction.xa.Xid xid,
            +                int flags)
            +         throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            end in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            forget

            +
            public void forget(javax.transaction.xa.Xid xid)
            +            throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            forget in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            isSameRM

            +
            public boolean isSameRM(javax.transaction.xa.XAResource rm)
            +                 throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            isSameRM in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            prepare

            +
            public int prepare(javax.transaction.xa.Xid xid)
            +            throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            prepare in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            recover

            +
            public javax.transaction.xa.Xid[] recover(int flags)
            +                                   throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            recover in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            rollback

            +
            public void rollback(javax.transaction.xa.Xid xid)
            +              throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            rollback in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            getTransactionTimeout

            +
            public int getTransactionTimeout()
            +                          throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            getTransactionTimeout in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          + + + +
            +
          • +

            setTransactionTimeout

            +
            public boolean setTransactionTimeout(int timeout)
            +
            +
            Specified by:
            +
            setTransactionTimeout in interface javax.transaction.xa.XAResource
            +
            +
          • +
          + + + +
            +
          • +

            start

            +
            public void start(javax.transaction.xa.Xid xid,
            +                  int flags)
            +           throws javax.transaction.xa.XAException
            +
            +
            Specified by:
            +
            start in interface javax.transaction.xa.XAResource
            +
            Throws:
            +
            javax.transaction.xa.XAException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/XAFailureException.html b/docs/java/com/sleepycat/je/XAFailureException.html new file mode 100644 index 0000000..93a13ed --- /dev/null +++ b/docs/java/com/sleepycat/je/XAFailureException.html @@ -0,0 +1,257 @@ + + + + + +XAFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je
      +

      Class XAFailureException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class XAFailureException
        +extends OperationFailureException
        +
        Thrown if an attempt is made to use a Transaction after it has been + invalidated as the result of an XA failure. The invalidation occurs when + XAResource.end is called by the resource manager with a XAResource.TMFAIL flag. + +

        The Transaction handle is invalidated as a result of this + exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/BinaryEqualityComparator.html b/docs/java/com/sleepycat/je/class-use/BinaryEqualityComparator.html new file mode 100644 index 0000000..9db518c --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/BinaryEqualityComparator.html @@ -0,0 +1,129 @@ + + + + + +Uses of Interface com.sleepycat.je.BinaryEqualityComparator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.BinaryEqualityComparator

      +
      +
      No usage of com.sleepycat.je.BinaryEqualityComparator
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/BtreeStats.html b/docs/java/com/sleepycat/je/class-use/BtreeStats.html new file mode 100644 index 0000000..c481be2 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/BtreeStats.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.BtreeStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.BtreeStats

      +
      +
      No usage of com.sleepycat.je.BtreeStats
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/CacheMode.html b/docs/java/com/sleepycat/je/class-use/CacheMode.html new file mode 100644 index 0000000..b421a9e --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/CacheMode.html @@ -0,0 +1,302 @@ + + + + + +Uses of Class com.sleepycat.je.CacheMode (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.CacheMode

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + +
        Packages that use CacheMode 
        PackageDescription
        com.sleepycat.je +
        Foundation for creating environments, databases and transactions; provides +cursor based data access.
        +
        com.sleepycat.persist +
        The Direct Persistence Layer (DPL) adds a persistent object model to the +Berkeley DB transactional engine.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of CacheMode in com.sleepycat.je

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Methods in com.sleepycat.je that return CacheMode 
          Modifier and TypeMethod and Description
          CacheModeReadOptions.getCacheMode() +
          Returns the CacheMode to be used for the operation, or null + if the Cursor, Database or Environment default will be used.
          +
          CacheModeEnvironmentMutableConfig.getCacheMode() +
          Returns the default CacheMode used for operations performed in + this environment, or null if DEFAULT is used.
          +
          CacheModeDatabaseConfig.getCacheMode() +
          Returns the default CacheMode used for operations performed on + this database, or null if the environment default is used.
          +
          CacheModeCursor.getCacheMode() +
          Returns the default CacheMode used for subsequent operations + performed using this cursor.
          +
          CacheModeWriteOptions.getCacheMode() +
          Returns the CacheMode to be used for the operation, or null + if the Cursor, Database or Environment default will be used.
          +
          static CacheModeCacheMode.valueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static CacheMode[]CacheMode.values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Methods in com.sleepycat.je with parameters of type CacheMode 
          Modifier and TypeMethod and Description
          ReadOptionsReadOptions.setCacheMode(CacheMode cacheMode) +
          Sets the CacheMode to be used for the operation.
          +
          EnvironmentMutableConfigEnvironmentMutableConfig.setCacheMode(CacheMode cacheMode) +
          Sets the default CacheMode used for operations performed in this + environment.
          +
          DatabaseConfigDatabaseConfig.setCacheMode(CacheMode cacheMode) +
          Sets the default CacheMode used for operations performed on this + database.
          +
          voidCursor.setCacheMode(CacheMode cacheMode) +
          Sets the CacheMode default used for subsequent operations + performed using this cursor.
          +
          WriteOptionsWriteOptions.setCacheMode(CacheMode cacheMode) +
          Sets the CacheMode to be used for the operation.
          +
          +
        • +
        • + + +

          Uses of CacheMode in com.sleepycat.persist

          + + + + + + + + + + + + +
          Methods in com.sleepycat.persist that return CacheMode 
          Modifier and TypeMethod and Description
          CacheModeEntityCursor.getCacheMode() +
          Returns the default CacheMode used for subsequent operations + performed using this cursor.
          +
          + + + + + + + + + + + + +
          Methods in com.sleepycat.persist with parameters of type CacheMode 
          Modifier and TypeMethod and Description
          voidEntityCursor.setCacheMode(CacheMode cacheMode) +
          Changes the CacheMode default used for subsequent operations + performed using this cursor.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/CheckpointConfig.html b/docs/java/com/sleepycat/je/class-use/CheckpointConfig.html new file mode 100644 index 0000000..cef7d56 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/CheckpointConfig.html @@ -0,0 +1,228 @@ + + + + + +Uses of Class com.sleepycat.je.CheckpointConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.CheckpointConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/CommitToken.html b/docs/java/com/sleepycat/je/class-use/CommitToken.html new file mode 100644 index 0000000..ad2c2ac --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/CommitToken.html @@ -0,0 +1,234 @@ + + + + + +Uses of Class com.sleepycat.je.CommitToken (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.CommitToken

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Cursor.html b/docs/java/com/sleepycat/je/class-use/Cursor.html new file mode 100644 index 0000000..e24a30b --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Cursor.html @@ -0,0 +1,221 @@ + + + + + +Uses of Class com.sleepycat.je.Cursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Cursor

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use Cursor 
        PackageDescription
        com.sleepycat.je +
        Foundation for creating environments, databases and transactions; provides +cursor based data access.
        +
        +
      • +
      • + +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/CursorConfig.html b/docs/java/com/sleepycat/je/class-use/CursorConfig.html new file mode 100644 index 0000000..3509ece --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/CursorConfig.html @@ -0,0 +1,413 @@ + + + + + +Uses of Class com.sleepycat.je.CursorConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.CursorConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/CustomStats.html b/docs/java/com/sleepycat/je/class-use/CustomStats.html new file mode 100644 index 0000000..566e8c5 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/CustomStats.html @@ -0,0 +1,189 @@ + + + + + +Uses of Interface com.sleepycat.je.CustomStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.CustomStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Database.html b/docs/java/com/sleepycat/je/class-use/Database.html new file mode 100644 index 0000000..4ee40ff --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Database.html @@ -0,0 +1,582 @@ + + + + + +Uses of Class com.sleepycat.je.Database (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Database

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseComparator.html b/docs/java/com/sleepycat/je/class-use/DatabaseComparator.html new file mode 100644 index 0000000..58cd522 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseComparator.html @@ -0,0 +1,129 @@ + + + + + +Uses of Interface com.sleepycat.je.DatabaseComparator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.DatabaseComparator

      +
      +
      No usage of com.sleepycat.je.DatabaseComparator
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseConfig.html b/docs/java/com/sleepycat/je/class-use/DatabaseConfig.html new file mode 100644 index 0000000..5bf9a5a --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseConfig.html @@ -0,0 +1,438 @@ + + + + + +Uses of Class com.sleepycat.je.DatabaseConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DatabaseConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseEntry.html b/docs/java/com/sleepycat/je/class-use/DatabaseEntry.html new file mode 100644 index 0000000..463df1f --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseEntry.html @@ -0,0 +1,1532 @@ + + + + + +Uses of Class com.sleepycat.je.DatabaseEntry (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DatabaseEntry

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseException.html b/docs/java/com/sleepycat/je/class-use/DatabaseException.html new file mode 100644 index 0000000..c17acbb --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseException.html @@ -0,0 +1,1964 @@ + + + + + +Uses of Class com.sleepycat.je.DatabaseException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DatabaseException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseExistsException.html b/docs/java/com/sleepycat/je/class-use/DatabaseExistsException.html new file mode 100644 index 0000000..93334dd --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseExistsException.html @@ -0,0 +1,185 @@ + + + + + +Uses of Class com.sleepycat.je.DatabaseExistsException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DatabaseExistsException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseNotFoundException.html b/docs/java/com/sleepycat/je/class-use/DatabaseNotFoundException.html new file mode 100644 index 0000000..895be42 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseNotFoundException.html @@ -0,0 +1,240 @@ + + + + + +Uses of Class com.sleepycat.je.DatabaseNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DatabaseNotFoundException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DatabaseStats.html b/docs/java/com/sleepycat/je/class-use/DatabaseStats.html new file mode 100644 index 0000000..f1be047 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DatabaseStats.html @@ -0,0 +1,195 @@ + + + + + +Uses of Class com.sleepycat.je.DatabaseStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DatabaseStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DeadlockException.html b/docs/java/com/sleepycat/je/class-use/DeadlockException.html new file mode 100644 index 0000000..cc2bb57 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DeadlockException.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.DeadlockException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DeadlockException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DeleteConstraintException.html b/docs/java/com/sleepycat/je/class-use/DeleteConstraintException.html new file mode 100644 index 0000000..11da38f --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DeleteConstraintException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.DeleteConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DeleteConstraintException

      +
      +
      No usage of com.sleepycat.je.DeleteConstraintException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DiskLimitException.html b/docs/java/com/sleepycat/je/class-use/DiskLimitException.html new file mode 100644 index 0000000..1b3c601 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DiskLimitException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.DiskLimitException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DiskLimitException

      +
      +
      No usage of com.sleepycat.je.DiskLimitException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DiskOrderedCursor.html b/docs/java/com/sleepycat/je/class-use/DiskOrderedCursor.html new file mode 100644 index 0000000..4f3bbf6 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DiskOrderedCursor.html @@ -0,0 +1,183 @@ + + + + + +Uses of Class com.sleepycat.je.DiskOrderedCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DiskOrderedCursor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DiskOrderedCursorConfig.html b/docs/java/com/sleepycat/je/class-use/DiskOrderedCursorConfig.html new file mode 100644 index 0000000..016b737 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DiskOrderedCursorConfig.html @@ -0,0 +1,272 @@ + + + + + +Uses of Class com.sleepycat.je.DiskOrderedCursorConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DiskOrderedCursorConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DiskOrderedCursorProducerException.html b/docs/java/com/sleepycat/je/class-use/DiskOrderedCursorProducerException.html new file mode 100644 index 0000000..0e64558 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DiskOrderedCursorProducerException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.DiskOrderedCursorProducerException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DiskOrderedCursorProducerException

      +
      +
      No usage of com.sleepycat.je.DiskOrderedCursorProducerException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/DuplicateDataException.html b/docs/java/com/sleepycat/je/class-use/DuplicateDataException.html new file mode 100644 index 0000000..e9c273f --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/DuplicateDataException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.DuplicateDataException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.DuplicateDataException

      +
      +
      No usage of com.sleepycat.je.DuplicateDataException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Durability.ReplicaAckPolicy.html b/docs/java/com/sleepycat/je/class-use/Durability.ReplicaAckPolicy.html new file mode 100644 index 0000000..11ba312 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Durability.ReplicaAckPolicy.html @@ -0,0 +1,247 @@ + + + + + +Uses of Class com.sleepycat.je.Durability.ReplicaAckPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Durability.ReplicaAckPolicy

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Durability.SyncPolicy.html b/docs/java/com/sleepycat/je/class-use/Durability.SyncPolicy.html new file mode 100644 index 0000000..32ce279 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Durability.SyncPolicy.html @@ -0,0 +1,210 @@ + + + + + +Uses of Class com.sleepycat.je.Durability.SyncPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Durability.SyncPolicy

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Durability.html b/docs/java/com/sleepycat/je/class-use/Durability.html new file mode 100644 index 0000000..ec1aeab --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Durability.html @@ -0,0 +1,251 @@ + + + + + +Uses of Class com.sleepycat.je.Durability (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Durability

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Environment.html b/docs/java/com/sleepycat/je/class-use/Environment.html new file mode 100644 index 0000000..4ee390c --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Environment.html @@ -0,0 +1,661 @@ + + + + + +Uses of Class com.sleepycat.je.Environment (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Environment

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentConfig.html b/docs/java/com/sleepycat/je/class-use/EnvironmentConfig.html new file mode 100644 index 0000000..b29dca2 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentConfig.html @@ -0,0 +1,411 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentFailureException.html b/docs/java/com/sleepycat/je/class-use/EnvironmentFailureException.html new file mode 100644 index 0000000..c4d54e9 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentFailureException.html @@ -0,0 +1,416 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentFailureException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentLockedException.html b/docs/java/com/sleepycat/je/class-use/EnvironmentLockedException.html new file mode 100644 index 0000000..ae09cb5 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentLockedException.html @@ -0,0 +1,296 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentLockedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentLockedException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentMutableConfig.html b/docs/java/com/sleepycat/je/class-use/EnvironmentMutableConfig.html new file mode 100644 index 0000000..e6fb6c8 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentMutableConfig.html @@ -0,0 +1,271 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentMutableConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentMutableConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentNotFoundException.html b/docs/java/com/sleepycat/je/class-use/EnvironmentNotFoundException.html new file mode 100644 index 0000000..65694da --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentNotFoundException.html @@ -0,0 +1,296 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentNotFoundException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentStats.html b/docs/java/com/sleepycat/je/class-use/EnvironmentStats.html new file mode 100644 index 0000000..db10df3 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentStats.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/EnvironmentWedgedException.html b/docs/java/com/sleepycat/je/class-use/EnvironmentWedgedException.html new file mode 100644 index 0000000..883d632 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/EnvironmentWedgedException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.EnvironmentWedgedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.EnvironmentWedgedException

      +
      +
      No usage of com.sleepycat.je.EnvironmentWedgedException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ExceptionEvent.html b/docs/java/com/sleepycat/je/class-use/ExceptionEvent.html new file mode 100644 index 0000000..0ca2210 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ExceptionEvent.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.je.ExceptionEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.ExceptionEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ExceptionListener.html b/docs/java/com/sleepycat/je/class-use/ExceptionListener.html new file mode 100644 index 0000000..4d3edbb --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ExceptionListener.html @@ -0,0 +1,189 @@ + + + + + +Uses of Interface com.sleepycat.je.ExceptionListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.ExceptionListener

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ForeignConstraintException.html b/docs/java/com/sleepycat/je/class-use/ForeignConstraintException.html new file mode 100644 index 0000000..c7ff8f0 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ForeignConstraintException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.ForeignConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.ForeignConstraintException

      +
      +
      No usage of com.sleepycat.je.ForeignConstraintException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ForeignKeyDeleteAction.html b/docs/java/com/sleepycat/je/class-use/ForeignKeyDeleteAction.html new file mode 100644 index 0000000..aa19251 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ForeignKeyDeleteAction.html @@ -0,0 +1,204 @@ + + + + + +Uses of Class com.sleepycat.je.ForeignKeyDeleteAction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.ForeignKeyDeleteAction

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ForeignKeyNullifier.html b/docs/java/com/sleepycat/je/class-use/ForeignKeyNullifier.html new file mode 100644 index 0000000..8e26973 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ForeignKeyNullifier.html @@ -0,0 +1,261 @@ + + + + + +Uses of Interface com.sleepycat.je.ForeignKeyNullifier (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.ForeignKeyNullifier

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ForeignMultiKeyNullifier.html b/docs/java/com/sleepycat/je/class-use/ForeignMultiKeyNullifier.html new file mode 100644 index 0000000..c8b0be9 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ForeignMultiKeyNullifier.html @@ -0,0 +1,191 @@ + + + + + +Uses of Interface com.sleepycat.je.ForeignMultiKeyNullifier (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.ForeignMultiKeyNullifier

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ForwardCursor.html b/docs/java/com/sleepycat/je/class-use/ForwardCursor.html new file mode 100644 index 0000000..8bb3a72 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ForwardCursor.html @@ -0,0 +1,194 @@ + + + + + +Uses of Interface com.sleepycat.je.ForwardCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.ForwardCursor

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use ForwardCursor 
        PackageDescription
        com.sleepycat.je +
        Foundation for creating environments, databases and transactions; provides +cursor based data access.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of ForwardCursor in com.sleepycat.je

          + + + + + + + + + + + + + + + + + + + + + + + + +
          Classes in com.sleepycat.je that implement ForwardCursor 
          Modifier and TypeClass and Description
          class Cursor +
          A database cursor.
          +
          class DiskOrderedCursor +
          DiskOrderedCursor returns records in unsorted order in exchange for + generally faster retrieval times.
          +
          class JoinCursor +
          A specialized join cursor for use in performing equality or natural joins on + secondary indices.
          +
          class SecondaryCursor +
          A database cursor for a secondary database.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Get.html b/docs/java/com/sleepycat/je/class-use/Get.html new file mode 100644 index 0000000..978a713 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Get.html @@ -0,0 +1,332 @@ + + + + + +Uses of Class com.sleepycat.je.Get (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Get

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/JEVersion.html b/docs/java/com/sleepycat/je/class-use/JEVersion.html new file mode 100644 index 0000000..ad64c91 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/JEVersion.html @@ -0,0 +1,215 @@ + + + + + +Uses of Class com.sleepycat.je.JEVersion (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.JEVersion

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/JoinConfig.html b/docs/java/com/sleepycat/je/class-use/JoinConfig.html new file mode 100644 index 0000000..0a6b1b6 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/JoinConfig.html @@ -0,0 +1,254 @@ + + + + + +Uses of Class com.sleepycat.je.JoinConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.JoinConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/JoinCursor.html b/docs/java/com/sleepycat/je/class-use/JoinCursor.html new file mode 100644 index 0000000..500033c --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/JoinCursor.html @@ -0,0 +1,183 @@ + + + + + +Uses of Class com.sleepycat.je.JoinCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.JoinCursor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LockConflictException.html b/docs/java/com/sleepycat/je/class-use/LockConflictException.html new file mode 100644 index 0000000..3cdb4a4 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LockConflictException.html @@ -0,0 +1,230 @@ + + + + + +Uses of Class com.sleepycat.je.LockConflictException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LockConflictException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LockMode.html b/docs/java/com/sleepycat/je/class-use/LockMode.html new file mode 100644 index 0000000..497ff2d --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LockMode.html @@ -0,0 +1,826 @@ + + + + + +Uses of Class com.sleepycat.je.LockMode (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LockMode

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LockNotAvailableException.html b/docs/java/com/sleepycat/je/class-use/LockNotAvailableException.html new file mode 100644 index 0000000..a722988 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LockNotAvailableException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.LockNotAvailableException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LockNotAvailableException

      +
      +
      No usage of com.sleepycat.je.LockNotAvailableException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LockNotGrantedException.html b/docs/java/com/sleepycat/je/class-use/LockNotGrantedException.html new file mode 100644 index 0000000..32d4489 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LockNotGrantedException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.LockNotGrantedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LockNotGrantedException

      +
      +
      No usage of com.sleepycat.je.LockNotGrantedException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LockStats.html b/docs/java/com/sleepycat/je/class-use/LockStats.html new file mode 100644 index 0000000..03896e4 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LockStats.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.LockStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LockStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LockTimeoutException.html b/docs/java/com/sleepycat/je/class-use/LockTimeoutException.html new file mode 100644 index 0000000..40d80e9 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LockTimeoutException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.LockTimeoutException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LockTimeoutException

      +
      +
      No usage of com.sleepycat.je.LockTimeoutException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/LogWriteException.html b/docs/java/com/sleepycat/je/class-use/LogWriteException.html new file mode 100644 index 0000000..1a9e284 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/LogWriteException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.LogWriteException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.LogWriteException

      +
      +
      No usage of com.sleepycat.je.LogWriteException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/OperationFailureException.html b/docs/java/com/sleepycat/je/class-use/OperationFailureException.html new file mode 100644 index 0000000..23c46ba --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/OperationFailureException.html @@ -0,0 +1,526 @@ + + + + + +Uses of Class com.sleepycat.je.OperationFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.OperationFailureException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/OperationResult.html b/docs/java/com/sleepycat/je/class-use/OperationResult.html new file mode 100644 index 0000000..9145ff9 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/OperationResult.html @@ -0,0 +1,387 @@ + + + + + +Uses of Class com.sleepycat.je.OperationResult (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.OperationResult

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/OperationStatus.html b/docs/java/com/sleepycat/je/class-use/OperationStatus.html new file mode 100644 index 0000000..a883bdc --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/OperationStatus.html @@ -0,0 +1,778 @@ + + + + + +Uses of Class com.sleepycat.je.OperationStatus (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.OperationStatus

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/PartialComparator.html b/docs/java/com/sleepycat/je/class-use/PartialComparator.html new file mode 100644 index 0000000..e0d54f7 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/PartialComparator.html @@ -0,0 +1,129 @@ + + + + + +Uses of Interface com.sleepycat.je.PartialComparator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.PartialComparator

      +
      +
      No usage of com.sleepycat.je.PartialComparator
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/PreloadConfig.Phases.html b/docs/java/com/sleepycat/je/class-use/PreloadConfig.Phases.html new file mode 100644 index 0000000..8d3cfd9 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/PreloadConfig.Phases.html @@ -0,0 +1,211 @@ + + + + + +Uses of Class com.sleepycat.je.PreloadConfig.Phases (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.PreloadConfig.Phases

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/PreloadConfig.html b/docs/java/com/sleepycat/je/class-use/PreloadConfig.html new file mode 100644 index 0000000..fb735c0 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/PreloadConfig.html @@ -0,0 +1,233 @@ + + + + + +Uses of Class com.sleepycat.je.PreloadConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.PreloadConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/PreloadStats.html b/docs/java/com/sleepycat/je/class-use/PreloadStats.html new file mode 100644 index 0000000..4191d0e --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/PreloadStats.html @@ -0,0 +1,181 @@ + + + + + +Uses of Class com.sleepycat.je.PreloadStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.PreloadStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/PreloadStatus.html b/docs/java/com/sleepycat/je/class-use/PreloadStatus.html new file mode 100644 index 0000000..11b9a98 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/PreloadStatus.html @@ -0,0 +1,211 @@ + + + + + +Uses of Class com.sleepycat.je.PreloadStatus (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.PreloadStatus

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ProgressListener.html b/docs/java/com/sleepycat/je/class-use/ProgressListener.html new file mode 100644 index 0000000..f6ec186 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ProgressListener.html @@ -0,0 +1,245 @@ + + + + + +Uses of Interface com.sleepycat.je.ProgressListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.ProgressListener

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Put.html b/docs/java/com/sleepycat/je/class-use/Put.html new file mode 100644 index 0000000..6c6f8fc --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Put.html @@ -0,0 +1,261 @@ + + + + + +Uses of Class com.sleepycat.je.Put (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Put

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ReadOptions.html b/docs/java/com/sleepycat/je/class-use/ReadOptions.html new file mode 100644 index 0000000..27df027 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ReadOptions.html @@ -0,0 +1,342 @@ + + + + + +Uses of Class com.sleepycat.je.ReadOptions (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.ReadOptions

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/RecoveryProgress.html b/docs/java/com/sleepycat/je/class-use/RecoveryProgress.html new file mode 100644 index 0000000..de652bf --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/RecoveryProgress.html @@ -0,0 +1,212 @@ + + + + + +Uses of Class com.sleepycat.je.RecoveryProgress (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.RecoveryProgress

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ReplicaConsistencyPolicy.html b/docs/java/com/sleepycat/je/class-use/ReplicaConsistencyPolicy.html new file mode 100644 index 0000000..ab883d7 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ReplicaConsistencyPolicy.html @@ -0,0 +1,291 @@ + + + + + +Uses of Interface com.sleepycat.je.ReplicaConsistencyPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.ReplicaConsistencyPolicy

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/RunRecoveryException.html b/docs/java/com/sleepycat/je/class-use/RunRecoveryException.html new file mode 100644 index 0000000..03d3e73 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/RunRecoveryException.html @@ -0,0 +1,292 @@ + + + + + +Uses of Class com.sleepycat.je.RunRecoveryException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.RunRecoveryException

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + +
        Packages that use RunRecoveryException 
        PackageDescription
        com.sleepycat.je +
        Foundation for creating environments, databases and transactions; provides +cursor based data access.
        +
        com.sleepycat.je.rep +
        +Berkeley DB Java Edition High Availability (JE HA) enables replication of JE +environments.
        +
        +
      • +
      • + +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryConfig.html b/docs/java/com/sleepycat/je/class-use/SecondaryConfig.html new file mode 100644 index 0000000..cf83b09 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryConfig.html @@ -0,0 +1,349 @@ + + + + + +Uses of Class com.sleepycat.je.SecondaryConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SecondaryConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryConstraintException.html b/docs/java/com/sleepycat/je/class-use/SecondaryConstraintException.html new file mode 100644 index 0000000..0569189 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryConstraintException.html @@ -0,0 +1,192 @@ + + + + + +Uses of Class com.sleepycat.je.SecondaryConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SecondaryConstraintException

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use SecondaryConstraintException 
        PackageDescription
        com.sleepycat.je +
        Foundation for creating environments, databases and transactions; provides +cursor based data access.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of SecondaryConstraintException in com.sleepycat.je

          + + + + + + + + + + + + + + + + + + + + +
          Subclasses of SecondaryConstraintException in com.sleepycat.je 
          Modifier and TypeClass and Description
          class DeleteConstraintException +
          Thrown when an attempt is made to delete a key from a foreign key database, + when that key is referenced by a secondary database, and the secondary is + configured to cause an abort in this situation.
          +
          class ForeignConstraintException +
          Thrown when an attempt to write a primary database record would insert a + secondary record with a key that does not exist in a foreign key database, + when the secondary key is configured as a foreign key.
          +
          class UniqueConstraintException +
          Thrown when an attempt to write a primary database record would insert a + secondary record with a duplicate key, for secondaries that represent + one-to-one and one-to-many relationships.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryCursor.html b/docs/java/com/sleepycat/je/class-use/SecondaryCursor.html new file mode 100644 index 0000000..d6032ad --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryCursor.html @@ -0,0 +1,199 @@ + + + + + +Uses of Class com.sleepycat.je.SecondaryCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SecondaryCursor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryDatabase.html b/docs/java/com/sleepycat/je/class-use/SecondaryDatabase.html new file mode 100644 index 0000000..4600ead --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryDatabase.html @@ -0,0 +1,399 @@ + + + + + +Uses of Class com.sleepycat.je.SecondaryDatabase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SecondaryDatabase

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryIntegrityException.html b/docs/java/com/sleepycat/je/class-use/SecondaryIntegrityException.html new file mode 100644 index 0000000..3e72dae --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryIntegrityException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.SecondaryIntegrityException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SecondaryIntegrityException

      +
      +
      No usage of com.sleepycat.je.SecondaryIntegrityException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryKeyCreator.html b/docs/java/com/sleepycat/je/class-use/SecondaryKeyCreator.html new file mode 100644 index 0000000..c7e4c34 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryKeyCreator.html @@ -0,0 +1,261 @@ + + + + + +Uses of Interface com.sleepycat.je.SecondaryKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.SecondaryKeyCreator

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryMultiKeyCreator.html b/docs/java/com/sleepycat/je/class-use/SecondaryMultiKeyCreator.html new file mode 100644 index 0000000..ce342c0 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryMultiKeyCreator.html @@ -0,0 +1,191 @@ + + + + + +Uses of Interface com.sleepycat.je.SecondaryMultiKeyCreator (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.SecondaryMultiKeyCreator

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SecondaryReferenceException.html b/docs/java/com/sleepycat/je/class-use/SecondaryReferenceException.html new file mode 100644 index 0000000..e0746b2 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SecondaryReferenceException.html @@ -0,0 +1,207 @@ + + + + + +Uses of Class com.sleepycat.je.SecondaryReferenceException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SecondaryReferenceException

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use SecondaryReferenceException 
        PackageDescription
        com.sleepycat.je +
        Foundation for creating environments, databases and transactions; provides +cursor based data access.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of SecondaryReferenceException in com.sleepycat.je

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Subclasses of SecondaryReferenceException in com.sleepycat.je 
          Modifier and TypeClass and Description
          class DeleteConstraintException +
          Thrown when an attempt is made to delete a key from a foreign key database, + when that key is referenced by a secondary database, and the secondary is + configured to cause an abort in this situation.
          +
          class ForeignConstraintException +
          Thrown when an attempt to write a primary database record would insert a + secondary record with a key that does not exist in a foreign key database, + when the secondary key is configured as a foreign key.
          +
          class SecondaryConstraintException +
          Base class for exceptions thrown when a write operation fails because of a + secondary constraint.
          +
          class SecondaryIntegrityException +
          Thrown when an integrity problem is detected while accessing a secondary + database, including access to secondaries while writing to a primary + database.
          +
          class UniqueConstraintException +
          Thrown when an attempt to write a primary database record would insert a + secondary record with a duplicate key, for secondaries that represent + one-to-one and one-to-many relationships.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Sequence.html b/docs/java/com/sleepycat/je/class-use/Sequence.html new file mode 100644 index 0000000..35f8283 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Sequence.html @@ -0,0 +1,204 @@ + + + + + +Uses of Class com.sleepycat.je.Sequence (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Sequence

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SequenceConfig.html b/docs/java/com/sleepycat/je/class-use/SequenceConfig.html new file mode 100644 index 0000000..e51e3aa --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SequenceConfig.html @@ -0,0 +1,303 @@ + + + + + +Uses of Class com.sleepycat.je.SequenceConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SequenceConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SequenceExistsException.html b/docs/java/com/sleepycat/je/class-use/SequenceExistsException.html new file mode 100644 index 0000000..666ca62 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SequenceExistsException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.SequenceExistsException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SequenceExistsException

      +
      +
      No usage of com.sleepycat.je.SequenceExistsException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SequenceIntegrityException.html b/docs/java/com/sleepycat/je/class-use/SequenceIntegrityException.html new file mode 100644 index 0000000..16cdc54 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SequenceIntegrityException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.SequenceIntegrityException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SequenceIntegrityException

      +
      +
      No usage of com.sleepycat.je.SequenceIntegrityException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SequenceNotFoundException.html b/docs/java/com/sleepycat/je/class-use/SequenceNotFoundException.html new file mode 100644 index 0000000..2527dec --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SequenceNotFoundException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.SequenceNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SequenceNotFoundException

      +
      +
      No usage of com.sleepycat.je.SequenceNotFoundException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SequenceOverflowException.html b/docs/java/com/sleepycat/je/class-use/SequenceOverflowException.html new file mode 100644 index 0000000..5c35a4c --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SequenceOverflowException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.SequenceOverflowException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SequenceOverflowException

      +
      +
      No usage of com.sleepycat.je.SequenceOverflowException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/SequenceStats.html b/docs/java/com/sleepycat/je/class-use/SequenceStats.html new file mode 100644 index 0000000..e8985b6 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/SequenceStats.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.je.SequenceStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.SequenceStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/StatsConfig.html b/docs/java/com/sleepycat/je/class-use/StatsConfig.html new file mode 100644 index 0000000..85d9c7e --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/StatsConfig.html @@ -0,0 +1,347 @@ + + + + + +Uses of Class com.sleepycat.je.StatsConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.StatsConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/ThreadInterruptedException.html b/docs/java/com/sleepycat/je/class-use/ThreadInterruptedException.html new file mode 100644 index 0000000..2a3ac83 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/ThreadInterruptedException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.ThreadInterruptedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.ThreadInterruptedException

      +
      +
      No usage of com.sleepycat.je.ThreadInterruptedException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Transaction.State.html b/docs/java/com/sleepycat/je/class-use/Transaction.State.html new file mode 100644 index 0000000..61df8fb --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Transaction.State.html @@ -0,0 +1,187 @@ + + + + + +Uses of Class com.sleepycat.je.Transaction.State (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Transaction.State

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/Transaction.html b/docs/java/com/sleepycat/je/class-use/Transaction.html new file mode 100644 index 0000000..da4711a --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/Transaction.html @@ -0,0 +1,741 @@ + + + + + +Uses of Class com.sleepycat.je.Transaction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.Transaction

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/TransactionConfig.html b/docs/java/com/sleepycat/je/class-use/TransactionConfig.html new file mode 100644 index 0000000..028568d --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/TransactionConfig.html @@ -0,0 +1,378 @@ + + + + + +Uses of Class com.sleepycat.je.TransactionConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.TransactionConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/TransactionStats.Active.html b/docs/java/com/sleepycat/je/class-use/TransactionStats.Active.html new file mode 100644 index 0000000..523352d --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/TransactionStats.Active.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.je.TransactionStats.Active (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.TransactionStats.Active

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/TransactionStats.html b/docs/java/com/sleepycat/je/class-use/TransactionStats.html new file mode 100644 index 0000000..43cc247 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/TransactionStats.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.je.TransactionStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.TransactionStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/TransactionTimeoutException.html b/docs/java/com/sleepycat/je/class-use/TransactionTimeoutException.html new file mode 100644 index 0000000..967471c --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/TransactionTimeoutException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.TransactionTimeoutException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.TransactionTimeoutException

      +
      +
      No usage of com.sleepycat.je.TransactionTimeoutException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/UniqueConstraintException.html b/docs/java/com/sleepycat/je/class-use/UniqueConstraintException.html new file mode 100644 index 0000000..0f40410 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/UniqueConstraintException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.UniqueConstraintException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.UniqueConstraintException

      +
      +
      No usage of com.sleepycat.je.UniqueConstraintException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/VerifyConfig.html b/docs/java/com/sleepycat/je/class-use/VerifyConfig.html new file mode 100644 index 0000000..791ca9d --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/VerifyConfig.html @@ -0,0 +1,268 @@ + + + + + +Uses of Class com.sleepycat.je.VerifyConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.VerifyConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/VersionMismatchException.html b/docs/java/com/sleepycat/je/class-use/VersionMismatchException.html new file mode 100644 index 0000000..5e3d80c --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/VersionMismatchException.html @@ -0,0 +1,173 @@ + + + + + +Uses of Class com.sleepycat.je.VersionMismatchException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.VersionMismatchException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/WriteOptions.html b/docs/java/com/sleepycat/je/class-use/WriteOptions.html new file mode 100644 index 0000000..e34d072 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/WriteOptions.html @@ -0,0 +1,340 @@ + + + + + +Uses of Class com.sleepycat.je.WriteOptions (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.WriteOptions

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/XAEnvironment.html b/docs/java/com/sleepycat/je/class-use/XAEnvironment.html new file mode 100644 index 0000000..b94e3e3 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/XAEnvironment.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.XAEnvironment (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.XAEnvironment

      +
      +
      No usage of com.sleepycat.je.XAEnvironment
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/class-use/XAFailureException.html b/docs/java/com/sleepycat/je/class-use/XAFailureException.html new file mode 100644 index 0000000..bcf7ee0 --- /dev/null +++ b/docs/java/com/sleepycat/je/class-use/XAFailureException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.XAFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.XAFailureException

      +
      +
      No usage of com.sleepycat.je.XAFailureException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/JEConnection.html b/docs/java/com/sleepycat/je/jca/ra/JEConnection.html new file mode 100644 index 0000000..d03e9a0 --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/JEConnection.html @@ -0,0 +1,417 @@ + + + + + +JEConnection (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jca.ra
      +

      Class JEConnection

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.jca.ra.JEConnection
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class JEConnection
        +extends java.lang.Object
        +implements java.io.Closeable
        +
        A JEConnection provides access to JE services. See + <JEHOME>/examples/jca/HOWTO-**.txt and + <JEHOME>/examples/jca/simple/SimpleBean.java for more information on + how to build the resource adaptor and use a JEConnection.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JEConnection

            +
            public JEConnection(com.sleepycat.je.jca.ra.JEManagedConnection mc)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setManagedConnection

            +
            protected void setManagedConnection(com.sleepycat.je.jca.ra.JEManagedConnection mc,
            +                                    com.sleepycat.je.jca.ra.JELocalTransaction lt)
            +
          • +
          + + + +
            +
          • +

            getEnvironment

            +
            public Environment getEnvironment()
            +
          • +
          + + + + + + + + + + + + + + + +
            +
          • +

            truncateDatabase

            +
            public long truncateDatabase(java.lang.String databaseName,
            +                             boolean returnCount)
            +                      throws DatabaseException
            +
            +
            Throws:
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getTransaction

            +
            public Transaction getTransaction()
            +                           throws javax.resource.ResourceException
            +
            +
            Throws:
            +
            javax.resource.ResourceException
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            public void close()
            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/JEConnectionFactory.html b/docs/java/com/sleepycat/je/jca/ra/JEConnectionFactory.html new file mode 100644 index 0000000..ee6c43e --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/JEConnectionFactory.html @@ -0,0 +1,286 @@ + + + + + +JEConnectionFactory (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jca.ra
      +

      Interface JEConnectionFactory

      +
      +
      +
      +
        +
      • +
        +
        All Superinterfaces:
        +
        javax.naming.Referenceable, java.io.Serializable
        +
        +
        +
        +
        public interface JEConnectionFactory
        +extends javax.resource.Referenceable, java.io.Serializable
        +
        An application may obtain a JEConnection in this manner: +
        +    InitialContext iniCtx = new InitialContext();
        +    Context enc = (Context) iniCtx.lookup("java:comp/env");
        +    Object ref = enc.lookup("ra/JEConnectionFactory");
        +    JEConnectionFactory dcf = (JEConnectionFactory) ref;
        +    JEConnection dc = dcf.getConnection(envDir, envConfig);
        + 
        + + See <JEHOME>/examples/jca/HOWTO-**.txt and + <JEHOME>/examples/jca/simple/SimpleBean.java for more information + on how to build the resource adapter and use a JEConnection.
        +
      • +
      +
      +
      + +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/JEException.html b/docs/java/com/sleepycat/je/jca/ra/JEException.html new file mode 100644 index 0000000..2cda769 --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/JEException.html @@ -0,0 +1,267 @@ + + + + + +JEException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jca.ra
      +

      Class JEException

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • +
            +
          • java.lang.Exception
          • +
          • +
              +
            • com.sleepycat.je.jca.ra.JEException
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class JEException
        +extends java.lang.Exception
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          JEException(java.lang.String message) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JEException

            +
            public JEException(java.lang.String message)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/class-use/JEConnection.html b/docs/java/com/sleepycat/je/jca/ra/class-use/JEConnection.html new file mode 100644 index 0000000..eca0838 --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/class-use/JEConnection.html @@ -0,0 +1,181 @@ + + + + + +Uses of Class com.sleepycat.je.jca.ra.JEConnection (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.jca.ra.JEConnection

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/class-use/JEConnectionFactory.html b/docs/java/com/sleepycat/je/jca/ra/class-use/JEConnectionFactory.html new file mode 100644 index 0000000..ba8093d --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/class-use/JEConnectionFactory.html @@ -0,0 +1,129 @@ + + + + + +Uses of Interface com.sleepycat.je.jca.ra.JEConnectionFactory (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.jca.ra.JEConnectionFactory

      +
      +
      No usage of com.sleepycat.je.jca.ra.JEConnectionFactory
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/class-use/JEException.html b/docs/java/com/sleepycat/je/jca/ra/class-use/JEException.html new file mode 100644 index 0000000..5332110 --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/class-use/JEException.html @@ -0,0 +1,181 @@ + + + + + +Uses of Class com.sleepycat.je.jca.ra.JEException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.jca.ra.JEException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/package-frame.html b/docs/java/com/sleepycat/je/jca/ra/package-frame.html new file mode 100644 index 0000000..81f635f --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/package-frame.html @@ -0,0 +1,28 @@ + + + + + +com.sleepycat.je.jca.ra (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.jca.ra

      +
      +

      Interfaces

      + +

      Classes

      + +

      Exceptions

      + +
      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/package-summary.html b/docs/java/com/sleepycat/je/jca/ra/package-summary.html new file mode 100644 index 0000000..166c982 --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/package-summary.html @@ -0,0 +1,219 @@ + + + + + +com.sleepycat.je.jca.ra (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.jca.ra

      +
      +
      Support for the Java Connector Architecture, which provides a standard +for connecting the J2EE platform to legacy enterprise information +systems (EIS), such as ERP systems, database systems, and legacy +applications not written in Java.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        JEConnectionFactory +
        An application may obtain a JEConnection in this manner:
        +
        +
      • +
      • + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        JEConnection +
        A JEConnection provides access to JE services.
        +
        +
      • +
      • + + + + + + + + + + + + +
        Exception Summary 
        ExceptionDescription
        JEException 
        +
      • +
      + + + +

      Package com.sleepycat.je.jca.ra Description

      +
      Support for the Java Connector Architecture, which provides a standard +for connecting the J2EE platform to legacy enterprise information +systems (EIS), such as ERP systems, database systems, and legacy +applications not written in Java. + +

      Package Specification

      + +

      +Users who want to run JE within a J2EE Application Server can use the +JCA Resource Adapter to connect to JE through a standard API. The JE +Resource Adapter supports all three J2EE application server +transaction types: +

      + +
        +
      • No transaction. +
      • Local transactions. +
      • XA transactions. +
      • +
      + +

      +JCA also includes the Java Transaction API (JTA), which means that JE +supports 2 phase commit (XA). Therefore, JE can participate +in distributed transactions managed by either a J2EE server or +the applications direct use of the JTA API. +

      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/package-tree.html b/docs/java/com/sleepycat/je/jca/ra/package-tree.html new file mode 100644 index 0000000..3bb300e --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/package-tree.html @@ -0,0 +1,168 @@ + + + + + +com.sleepycat.je.jca.ra Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.jca.ra

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      +
        +
      • java.lang.Object +
          +
        • com.sleepycat.je.jca.ra.JEConnection (implements java.io.Closeable)
        • +
        • java.lang.Throwable (implements java.io.Serializable) +
            +
          • java.lang.Exception + +
          • +
          +
        • +
        +
      • +
      +

      Interface Hierarchy

      +
        +
      • javax.naming.Referenceable +
          +
        • javax.resource.Referenceable + +
        • +
        +
      • +
      • java.io.Serializable + +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jca/ra/package-use.html b/docs/java/com/sleepycat/je/jca/ra/package-use.html new file mode 100644 index 0000000..90cce4e --- /dev/null +++ b/docs/java/com/sleepycat/je/jca/ra/package-use.html @@ -0,0 +1,178 @@ + + + + + +Uses of Package com.sleepycat.je.jca.ra (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.jca.ra

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/JEDiagnostics.html b/docs/java/com/sleepycat/je/jmx/JEDiagnostics.html new file mode 100644 index 0000000..8d359dc --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/JEDiagnostics.html @@ -0,0 +1,656 @@ + + + + + +JEDiagnostics (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jmx
      +

      Class JEDiagnostics

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar, javax.management.DynamicMBean
        +
        +
        +
        +
        public class JEDiagnostics
        +extends JEMBean
        +implements javax.management.DynamicMBean
        +

        + JEDiagnostics is a debugging mbean for a non replicated JE Environment. + This is intended as a locus of field support functionality. While it may be + used by the application developer, the primary use case is for a support + situation. Currently much of this functionality is also available through + the standard java.util.logging MBean. +

        + It is a concrete MBean created by registering a JE Environment as an MBean + through setting the JEDiagnostics system property. It only works on an + active JE Environment, and one Environment can only have one JEDiagnostics + instance. There are two attributes and one operation: +

        + Attributes: +

          +
        • consoleHandlerLevel: which sets the console handler level. +
        • fileHandlerLevel: which sets the file handler level. +
        + Operations: +
          +
        • resetLoggingLevel: which sets the level for the current loggers in + the LogManager. +
        +

        + We can use these attributes and operations to dynamically change the + logging level for debugging purposes.

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            CONSOLEHANDLER_LEVEL

            +
            protected static final java.lang.String CONSOLEHANDLER_LEVEL
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            FILEHANDLER_LEVEL

            +
            protected static final java.lang.String FILEHANDLER_LEVEL
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_CONSOLEHANDLER_LEVEL

            +
            protected static final javax.management.MBeanAttributeInfo ATT_CONSOLEHANDLER_LEVEL
            +
          • +
          + + + +
            +
          • +

            ATT_FILEHANDLER_LEVEL

            +
            protected static final javax.management.MBeanAttributeInfo ATT_FILEHANDLER_LEVEL
            +
          • +
          + + + +
            +
          • +

            OP_RESET_LOGGING

            +
            protected static final java.lang.String OP_RESET_LOGGING
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            resetLoggingParams

            +
            protected static final javax.management.MBeanParameterInfo[] resetLoggingParams
            +
          • +
          + + + +
            +
          • +

            OP_RESET_LOGGING_LEVEL

            +
            protected static final javax.management.MBeanOperationInfo OP_RESET_LOGGING_LEVEL
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JEDiagnostics

            +
            protected JEDiagnostics(Environment env)
            +
          • +
          + + + +
            +
          • +

            JEDiagnostics

            +
            public JEDiagnostics()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            initClassFields

            +
            protected void initClassFields()
            +
            +
            Specified by:
            +
            initClassFields in class JEMBean
            +
            +
          • +
          + + + +
            +
          • +

            getAttribute

            +
            public java.lang.Object getAttribute(java.lang.String attributeName)
            +                              throws javax.management.AttributeNotFoundException,
            +                                     javax.management.MBeanException
            +
            +
            Specified by:
            +
            getAttribute in interface javax.management.DynamicMBean
            +
            Throws:
            +
            javax.management.AttributeNotFoundException
            +
            javax.management.MBeanException
            +
            See Also:
            +
            DynamicMBean.getAttribute(java.lang.String)
            +
            +
          • +
          + + + +
            +
          • +

            setAttribute

            +
            public void setAttribute(javax.management.Attribute attribute)
            +                  throws javax.management.AttributeNotFoundException,
            +                         javax.management.InvalidAttributeValueException,
            +                         javax.management.MBeanException
            +
            +
            Specified by:
            +
            setAttribute in interface javax.management.DynamicMBean
            +
            Throws:
            +
            javax.management.AttributeNotFoundException
            +
            javax.management.InvalidAttributeValueException
            +
            javax.management.MBeanException
            +
            See Also:
            +
            DynamicMBean.setAttribute(javax.management.Attribute)
            +
            +
          • +
          + + + +
            +
          • +

            getAttributes

            +
            public javax.management.AttributeList getAttributes(java.lang.String[] attributes)
            +
            +
            Specified by:
            +
            getAttributes in interface javax.management.DynamicMBean
            +
            See Also:
            +
            DynamicMBean.getAttributes(java.lang.String[])
            +
            +
          • +
          + + + +
            +
          • +

            setAttributes

            +
            public javax.management.AttributeList setAttributes(javax.management.AttributeList attributes)
            +
            +
            Specified by:
            +
            setAttributes in interface javax.management.DynamicMBean
            +
            See Also:
            +
            DynamicMBean.setAttributes(javax.management.AttributeList)
            +
            +
          • +
          + + + +
            +
          • +

            invoke

            +
            public java.lang.Object invoke(java.lang.String actionName,
            +                               java.lang.Object[] params,
            +                               java.lang.String[] signature)
            +                        throws javax.management.MBeanException
            +
            +
            Specified by:
            +
            invoke in interface javax.management.DynamicMBean
            +
            Throws:
            +
            javax.management.MBeanException
            +
            See Also:
            +
            DynamicMBean.invoke(java.lang.String, java.lang.Object[], java.lang.String[])
            +
            +
          • +
          + + + +
            +
          • +

            doRegisterMBean

            +
            protected void doRegisterMBean(Environment env)
            +                        throws java.lang.Exception
            +
            +
            Specified by:
            +
            doRegisterMBean in class JEMBean
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            getAttributeList

            +
            protected javax.management.MBeanAttributeInfo[] getAttributeList()
            +
            Description copied from class: JEMBean
            +
            Get attribute metadata for this MBean.
            +
            +
            Specified by:
            +
            getAttributeList in class JEMBean
            +
            Returns:
            +
            array of MBeanAttributeInfo objects describing the available + attributes.
            +
            +
          • +
          + + + +
            +
          • +

            addOperations

            +
            protected void addOperations()
            +
            Description copied from class: JEMBean
            +
            Add MBean operations into the list.
            +
            +
            Specified by:
            +
            addOperations in class JEMBean
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/JEMBean.html b/docs/java/com/sleepycat/je/jmx/JEMBean.html new file mode 100644 index 0000000..4b8df6e --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/JEMBean.html @@ -0,0 +1,629 @@ + + + + + +JEMBean (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jmx
      +

      Class JEMBean

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.jmx.JEMBean
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar
        +
        +
        +
        Direct Known Subclasses:
        +
        JEDiagnostics, JEMonitor
        +
        +
        +
        +
        public abstract class JEMBean
        +extends java.lang.Object
        +implements com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          protected java.lang.StringclassName 
          protected java.lang.Class<?>currentClass 
          protected java.lang.StringDESCRIPTION 
          protected Environmentenv 
          protected javax.management.ObjectNamejeName 
          protected java.util.ArrayList<javax.management.MBeanOperationInfo>operationList 
          protected javax.management.MBeanServerserver 
          static javax.management.MBeanParameterInfo[]statParams 
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + + + + +
          Constructors 
          ModifierConstructor and Description
           JEMBean() 
          protected JEMBean(Environment env) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods Concrete Methods 
          Modifier and TypeMethod and Description
          protected abstract voidaddOperations() +
          Add MBean operations into the list.
          +
          voiddoRegister(Environment env) +
          For EnvironmentImpl.MBeanRegistrar interface.
          +
          protected abstract voiddoRegisterMBean(Environment env) 
          voiddoUnregister() +
          For EnvironmentImpl.MBeanRegistrar interface.
          +
          protected abstract javax.management.MBeanAttributeInfo[]getAttributeList() +
          Get attribute metadata for this MBean.
          +
          protected javax.management.MBeanConstructorInfo[]getConstructors() +
          Get constructor metadata for this MBean.
          +
          javax.management.MBeanInfogetMBeanInfo() 
          protected javax.management.MBeanNotificationInfo[]getNotificationInfo() +
          Get notification metadata for this MBean.
          +
          protected StatsConfiggetStatsConfig(java.lang.Object[] params) +
          Helper for creating a StatsConfig object to use as an operation + parameter.
          +
          protected abstract voidinitClassFields() 
          protected voidresetMBeanInfo() +
          Create the available management interface for this environment.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            statParams

            +
            public static final javax.management.MBeanParameterInfo[] statParams
            +
          • +
          + + + +
            +
          • +

            server

            +
            protected javax.management.MBeanServer server
            +
          • +
          + + + +
            +
          • +

            jeName

            +
            protected javax.management.ObjectName jeName
            +
          • +
          + + + +
            +
          • +

            className

            +
            protected java.lang.String className
            +
          • +
          + + + +
            +
          • +

            DESCRIPTION

            +
            protected java.lang.String DESCRIPTION
            +
          • +
          + + + +
            +
          • +

            currentClass

            +
            protected java.lang.Class<?> currentClass
            +
          • +
          + + + + + + + +
            +
          • +

            operationList

            +
            protected java.util.ArrayList<javax.management.MBeanOperationInfo> operationList
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + + + + + +
            +
          • +

            JEMBean

            +
            public JEMBean()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            initClassFields

            +
            protected abstract void initClassFields()
            +
          • +
          + + + +
            +
          • +

            resetMBeanInfo

            +
            protected void resetMBeanInfo()
            +
            Create the available management interface for this environment. The + attributes and operations available vary according to environment + configuration.
            +
          • +
          + + + +
            +
          • +

            getAttributeList

            +
            protected abstract javax.management.MBeanAttributeInfo[] getAttributeList()
            +
            Get attribute metadata for this MBean.
            +
            +
            Returns:
            +
            array of MBeanAttributeInfo objects describing the available + attributes.
            +
            +
          • +
          + + + +
            +
          • +

            addOperations

            +
            protected abstract void addOperations()
            +
            Add MBean operations into the list.
            +
          • +
          + + + +
            +
          • +

            getConstructors

            +
            protected javax.management.MBeanConstructorInfo[] getConstructors()
            +
            Get constructor metadata for this MBean. + + Since the process of getting constructors is the same for each concrete + MBean, define it here to reduce coding work.
            +
            +
            Returns:
            +
            array of MBeanConstructorInfo objects describing the constructor + attributes.
            +
            +
          • +
          + + + +
            +
          • +

            getNotificationInfo

            +
            protected javax.management.MBeanNotificationInfo[] getNotificationInfo()
            +
            Get notification metadata for this MBean.
            +
            +
            Returns:
            +
            array of MBeanNotificationInfo describing notifications.
            +
            +
          • +
          + + + +
            +
          • +

            doRegister

            +
            public void doRegister(Environment env)
            +                throws java.lang.Exception
            +
            For EnvironmentImpl.MBeanRegistrar interface. + + Register this MBean with the MBeanServer.
            +
            +
            Specified by:
            +
            doRegister in interface com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            doRegisterMBean

            +
            protected abstract void doRegisterMBean(Environment env)
            +                                 throws java.lang.Exception
            +
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            doUnregister

            +
            public void doUnregister()
            +                  throws java.lang.Exception
            +
            For EnvironmentImpl.MBeanRegistrar interface. + + Remove this MBean from the MBeanServer.
            +
            +
            Specified by:
            +
            doUnregister in interface com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            getMBeanInfo

            +
            public javax.management.MBeanInfo getMBeanInfo()
            +
            +
            See Also:
            +
            Implement the getMBeanInfo method of DynamicMBean.
            +
            +
          • +
          + + + +
            +
          • +

            getStatsConfig

            +
            protected StatsConfig getStatsConfig(java.lang.Object[] params)
            +
            Helper for creating a StatsConfig object to use as an operation + parameter.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/JEMBeanHelper.html b/docs/java/com/sleepycat/je/jmx/JEMBeanHelper.html new file mode 100644 index 0000000..4ed0f61 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/JEMBeanHelper.html @@ -0,0 +1,805 @@ + + + + + +JEMBeanHelper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jmx
      +

      Class JEMBeanHelper

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.jmx.JEMBeanHelper
        • +
        +
      • +
      +
      +
        +
      • +
        +
        Deprecated.  +
        As of JE 4, JEMBeanHelper is deprecated in favor of the concrete + MBeans available by default with a JE environment. These MBeans can be + registered and enabled by the environment by setting the following JVM + property: + JEMonitor: + This MBean provides general stats monitoring and access to basic + environment level operations. + + JEMBeanHelper is a utility class for the MBean implementation which wants to + add management of a JE environment to its capabilities. MBean + implementations can contain a JEMBeanHelper instance to get MBean metadata + for JE and to set attributes, get attributes, and invoke operations. +

        + com.sleepycat.je.jmx.JEMonitor and the example program + jmx.JEApplicationMBean are two MBean implementations which provide support + different application use cases. See those classes for examples of how to + use JEMBeanHelper.

        +
        +
        +
        public class JEMBeanHelper
        +extends java.lang.Object
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          JEMBeanHelper(java.io.File environmentHome, + boolean canConfigure) +
          Deprecated. 
          +
          Instantiate a helper, specifying environment home and open capabilities.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          java.lang.ObjectgetAttribute(Environment targetEnv, + java.lang.String attributeName) +
          Deprecated. 
          +
          Get an attribute value for the given environment.
          +
          java.util.List<javax.management.MBeanAttributeInfo>getAttributeList(Environment targetEnv) +
          Deprecated. 
          +
          Get MBean attribute metadata for this environment.
          +
          java.io.FilegetEnvironmentHome() +
          Deprecated. 
          +
          Return the target environment directory.
          +
          EnvironmentConfiggetEnvironmentOpenConfig() +
          Deprecated. 
          +
          If the helper was instantiated with canConfigure==true, it shows + environment configuration attributes.
          +
          booleangetNeedReset() +
          Deprecated. 
          +
          Tell the MBean if the available set of functionality has changed.
          +
          javax.management.MBeanNotificationInfo[]getNotificationInfo(Environment targetEnv) +
          Deprecated. 
          +
          No notifications are supported.
          +
          java.util.List<javax.management.MBeanOperationInfo>getOperationList(Environment targetEnv) +
          Deprecated. 
          +
          Get mbean operation metadata for this environment.
          +
          java.lang.Objectinvoke(Environment targetEnv, + java.lang.String actionName, + java.lang.Object[] params, + java.lang.String[] signature) +
          Deprecated. 
          +
          Invoke an operation for the given environment.
          +
          voidsetAttribute(Environment targetEnv, + javax.management.Attribute attribute) +
          Deprecated. 
          +
          Set an attribute value for the given environment.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            ATT_ENV_HOME

            +
            public static final java.lang.String ATT_ENV_HOME
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_OPEN

            +
            public static final java.lang.String ATT_OPEN
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_IS_READ_ONLY

            +
            public static final java.lang.String ATT_IS_READ_ONLY
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_IS_TRANSACTIONAL

            +
            public static final java.lang.String ATT_IS_TRANSACTIONAL
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_CACHE_SIZE

            +
            public static final java.lang.String ATT_CACHE_SIZE
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_CACHE_PERCENT

            +
            public static final java.lang.String ATT_CACHE_PERCENT
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_LOCK_TIMEOUT

            +
            public static final java.lang.String ATT_LOCK_TIMEOUT
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_IS_SERIALIZABLE

            +
            public static final java.lang.String ATT_IS_SERIALIZABLE
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_TXN_TIMEOUT

            +
            public static final java.lang.String ATT_TXN_TIMEOUT
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_SET_READ_ONLY

            +
            public static final java.lang.String ATT_SET_READ_ONLY
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_SET_TRANSACTIONAL

            +
            public static final java.lang.String ATT_SET_TRANSACTIONAL
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_SET_SERIALIZABLE

            +
            public static final java.lang.String ATT_SET_SERIALIZABLE
            +
            Deprecated. 
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JEMBeanHelper

            +
            public JEMBeanHelper(java.io.File environmentHome,
            +                     boolean canConfigure)
            +
            Deprecated. 
            +
            Instantiate a helper, specifying environment home and open capabilities.
            +
            +
            Parameters:
            +
            environmentHome - home directory of the target JE environment.
            +
            canConfigure - If true, the helper will show environment + configuration attributes.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getEnvironmentHome

            +
            public java.io.File getEnvironmentHome()
            +
            Deprecated. 
            +
            Return the target environment directory.
            +
            +
            Returns:
            +
            the environment directory.
            +
            +
          • +
          + + + +
            +
          • +

            getEnvironmentOpenConfig

            +
            public EnvironmentConfig getEnvironmentOpenConfig()
            +
            Deprecated. 
            +
            If the helper was instantiated with canConfigure==true, it shows + environment configuration attributes. Those attributes are returned + within this EnvironmentConfig object for use in opening environments.
            +
            +
            Returns:
            +
            EnvironmentConfig object which saves configuration attributes + recorded through MBean attributes.
            +
            +
          • +
          + + + +
            +
          • +

            getNeedReset

            +
            public boolean getNeedReset()
            +
            Deprecated. 
            +
            Tell the MBean if the available set of functionality has changed.
            +
            +
            Returns:
            +
            true if the MBean should regenerate its JE metadata.
            +
            +
          • +
          + + + +
            +
          • +

            getAttributeList

            +
            public java.util.List<javax.management.MBeanAttributeInfo> getAttributeList(Environment targetEnv)
            +
            Deprecated. 
            +
            Get MBean attribute metadata for this environment.
            +
            +
            Parameters:
            +
            targetEnv - The target JE environment. May be null if the + environment is not open.
            +
            Returns:
            +
            list of MBeanAttributeInfo objects describing the available + attributes.
            +
            +
          • +
          + + + +
            +
          • +

            getAttribute

            +
            public java.lang.Object getAttribute(Environment targetEnv,
            +                                     java.lang.String attributeName)
            +                              throws javax.management.AttributeNotFoundException,
            +                                     javax.management.MBeanException
            +
            Deprecated. 
            +
            Get an attribute value for the given environment. Check + JEMBeanHelper.getNeedReset() after this call because the helper may + detect that the environment has changed and that the MBean metadata + should be reset.
            +
            +
            Parameters:
            +
            targetEnv - The target JE environment. May be null if the + environment is not open.
            +
            attributeName - attribute name.
            +
            Returns:
            +
            attribute value.
            +
            Throws:
            +
            javax.management.AttributeNotFoundException
            +
            javax.management.MBeanException
            +
            +
          • +
          + + + +
            +
          • +

            setAttribute

            +
            public void setAttribute(Environment targetEnv,
            +                         javax.management.Attribute attribute)
            +                  throws javax.management.AttributeNotFoundException,
            +                         javax.management.InvalidAttributeValueException
            +
            Deprecated. 
            +
            Set an attribute value for the given environment.
            +
            +
            Parameters:
            +
            targetEnv - The target JE environment. May be null if the + environment is not open.
            +
            attribute - name/value pair
            +
            Throws:
            +
            javax.management.AttributeNotFoundException
            +
            javax.management.InvalidAttributeValueException
            +
            +
          • +
          + + + +
            +
          • +

            getOperationList

            +
            public java.util.List<javax.management.MBeanOperationInfo> getOperationList(Environment targetEnv)
            +
            Deprecated. 
            +
            Get mbean operation metadata for this environment.
            +
            +
            Parameters:
            +
            targetEnv - The target JE environment. May be null if the + environment is not open.
            +
            Returns:
            +
            List of MBeanOperationInfo describing available operations.
            +
            +
          • +
          + + + +
            +
          • +

            invoke

            +
            public java.lang.Object invoke(Environment targetEnv,
            +                               java.lang.String actionName,
            +                               java.lang.Object[] params,
            +                               java.lang.String[] signature)
            +                        throws javax.management.MBeanException
            +
            Deprecated. 
            +
            Invoke an operation for the given environment.
            +
            +
            Parameters:
            +
            targetEnv - The target JE environment. May be null if the + environment is not open.
            +
            actionName - operation name.
            +
            params - operation parameters. May be null.
            +
            signature - operation signature. May be null.
            +
            Returns:
            +
            the operation result
            +
            Throws:
            +
            javax.management.MBeanException
            +
            +
          • +
          + + + +
            +
          • +

            getNotificationInfo

            +
            public javax.management.MBeanNotificationInfo[] getNotificationInfo(Environment targetEnv)
            +
            Deprecated. 
            +
            No notifications are supported.
            +
            +
            Returns:
            +
            List of MBeanNotificationInfo for available notifications.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/JEMonitor.html b/docs/java/com/sleepycat/je/jmx/JEMonitor.html new file mode 100644 index 0000000..a138052 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/JEMonitor.html @@ -0,0 +1,674 @@ + + + + + +JEMonitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.jmx
      +

      Class JEMonitor

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar, javax.management.DynamicMBean
        +
        +
        +
        +
        public class JEMonitor
        +extends JEMBean
        +implements javax.management.DynamicMBean
        +

        + JEMonitor is a JMX MBean which makes statistics and basic administrative + operations available. The MBean is registered and enabled when the system + property JEMonitor is set. It only works on an active JE Environment, and + an Environment can only register one instance of JEMonitor.

        +
        +
        See Also:
        +
        Monitoring + JE with JConsole and JMX
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            ATT_ENV_HOME

            +
            public static final java.lang.String ATT_ENV_HOME
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_IS_READ_ONLY

            +
            public static final java.lang.String ATT_IS_READ_ONLY
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_IS_TRANSACTIONAL

            +
            public static final java.lang.String ATT_IS_TRANSACTIONAL
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_CACHE_SIZE

            +
            public static final java.lang.String ATT_CACHE_SIZE
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_CACHE_PERCENT

            +
            public static final java.lang.String ATT_CACHE_PERCENT
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_LOCK_TIMEOUT

            +
            public static final java.lang.String ATT_LOCK_TIMEOUT
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_IS_SERIALIZABLE

            +
            public static final java.lang.String ATT_IS_SERIALIZABLE
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ATT_TXN_TIMEOUT

            +
            public static final java.lang.String ATT_TXN_TIMEOUT
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            JEMonitor

            +
            protected JEMonitor(Environment env)
            +
          • +
          + + + +
            +
          • +

            JEMonitor

            +
            public JEMonitor()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            initClassFields

            +
            protected void initClassFields()
            +
            +
            Specified by:
            +
            initClassFields in class JEMBean
            +
            +
          • +
          + + + +
            +
          • +

            getAttribute

            +
            public java.lang.Object getAttribute(java.lang.String attributeName)
            +                              throws javax.management.AttributeNotFoundException,
            +                                     javax.management.MBeanException
            +
            +
            Specified by:
            +
            getAttribute in interface javax.management.DynamicMBean
            +
            Throws:
            +
            javax.management.AttributeNotFoundException
            +
            javax.management.MBeanException
            +
            See Also:
            +
            DynamicMBean.getAttribute(java.lang.String)
            +
            +
          • +
          + + + +
            +
          • +

            setAttribute

            +
            public void setAttribute(javax.management.Attribute attribute)
            +                  throws javax.management.AttributeNotFoundException,
            +                         javax.management.InvalidAttributeValueException,
            +                         javax.management.MBeanException
            +
            +
            Specified by:
            +
            setAttribute in interface javax.management.DynamicMBean
            +
            Throws:
            +
            javax.management.AttributeNotFoundException
            +
            javax.management.InvalidAttributeValueException
            +
            javax.management.MBeanException
            +
            See Also:
            +
            DynamicMBean.setAttribute(javax.management.Attribute)
            +
            +
          • +
          + + + +
            +
          • +

            getAttributes

            +
            public javax.management.AttributeList getAttributes(java.lang.String[] attributes)
            +
            +
            Specified by:
            +
            getAttributes in interface javax.management.DynamicMBean
            +
            See Also:
            +
            DynamicMBean.getAttributes(java.lang.String[])
            +
            +
          • +
          + + + +
            +
          • +

            setAttributes

            +
            public javax.management.AttributeList setAttributes(javax.management.AttributeList attributes)
            +
            +
            Specified by:
            +
            setAttributes in interface javax.management.DynamicMBean
            +
            See Also:
            +
            DynamicMBean.setAttributes(javax.management.AttributeList)
            +
            +
          • +
          + + + +
            +
          • +

            invoke

            +
            public java.lang.Object invoke(java.lang.String actionName,
            +                               java.lang.Object[] params,
            +                               java.lang.String[] signature)
            +                        throws javax.management.MBeanException
            +
            +
            Specified by:
            +
            invoke in interface javax.management.DynamicMBean
            +
            Throws:
            +
            javax.management.MBeanException
            +
            See Also:
            +
            DynamicMBean.invoke(java.lang.String, java.lang.Object[], java.lang.String[])
            +
            +
          • +
          + + + +
            +
          • +

            doRegisterMBean

            +
            protected void doRegisterMBean(Environment env)
            +                        throws java.lang.Exception
            +
            +
            Specified by:
            +
            doRegisterMBean in class JEMBean
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            getAttributeList

            +
            protected javax.management.MBeanAttributeInfo[] getAttributeList()
            +
            Description copied from class: JEMBean
            +
            Get attribute metadata for this MBean.
            +
            +
            Specified by:
            +
            getAttributeList in class JEMBean
            +
            Returns:
            +
            array of MBeanAttributeInfo objects describing the available + attributes.
            +
            +
          • +
          + + + +
            +
          • +

            addOperations

            +
            protected void addOperations()
            +
            Description copied from class: JEMBean
            +
            Add MBean operations into the list.
            +
            +
            Specified by:
            +
            addOperations in class JEMBean
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/class-use/JEDiagnostics.html b/docs/java/com/sleepycat/je/jmx/class-use/JEDiagnostics.html new file mode 100644 index 0000000..b91561b --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/class-use/JEDiagnostics.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.jmx.JEDiagnostics (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.jmx.JEDiagnostics

      +
      +
      No usage of com.sleepycat.je.jmx.JEDiagnostics
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/class-use/JEMBean.html b/docs/java/com/sleepycat/je/jmx/class-use/JEMBean.html new file mode 100644 index 0000000..bea1e49 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/class-use/JEMBean.html @@ -0,0 +1,182 @@ + + + + + +Uses of Class com.sleepycat.je.jmx.JEMBean (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.jmx.JEMBean

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/class-use/JEMBeanHelper.html b/docs/java/com/sleepycat/je/jmx/class-use/JEMBeanHelper.html new file mode 100644 index 0000000..6b38598 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/class-use/JEMBeanHelper.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.jmx.JEMBeanHelper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.jmx.JEMBeanHelper

      +
      +
      No usage of com.sleepycat.je.jmx.JEMBeanHelper
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/class-use/JEMonitor.html b/docs/java/com/sleepycat/je/jmx/class-use/JEMonitor.html new file mode 100644 index 0000000..9f861b8 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/class-use/JEMonitor.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.jmx.JEMonitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.jmx.JEMonitor

      +
      +
      No usage of com.sleepycat.je.jmx.JEMonitor
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/package-frame.html b/docs/java/com/sleepycat/je/jmx/package-frame.html new file mode 100644 index 0000000..2f05250 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/package-frame.html @@ -0,0 +1,23 @@ + + + + + +com.sleepycat.je.jmx (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.jmx

      + + + diff --git a/docs/java/com/sleepycat/je/jmx/package-summary.html b/docs/java/com/sleepycat/je/jmx/package-summary.html new file mode 100644 index 0000000..accc45a --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/package-summary.html @@ -0,0 +1,186 @@ + + + + + +com.sleepycat.je.jmx (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.jmx

      +
      +
      Implementations of JMX MBeans for JE.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        JEDiagnostics +
        + JEDiagnostics is a debugging mbean for a non replicated JE Environment.
        +
        JEMBean 
        JEMBeanHelperDeprecated +
        As of JE 4, JEMBeanHelper is deprecated in favor of the concrete + MBeans available by default with a JE environment.
        +
        JEMonitor +
        + JEMonitor is a JMX MBean which makes statistics and basic administrative + operations available.
        +
        +
      • +
      + + + +

      Package com.sleepycat.je.jmx Description

      +
      Implementations of JMX MBeans for JE. + +

      Package Specification

      +This package provides deployable JMX MBeans for JE.
      +
      +
      See Also:
      +
      Monitoring +JE with JConsole and JMX
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/package-tree.html b/docs/java/com/sleepycat/je/jmx/package-tree.html new file mode 100644 index 0000000..cd18b86 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/package-tree.html @@ -0,0 +1,148 @@ + + + + + +com.sleepycat.je.jmx Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.jmx

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      +
        +
      • java.lang.Object +
          +
        • com.sleepycat.je.jmx.JEMBean (implements com.sleepycat.je.dbi.EnvironmentImpl.MBeanRegistrar) +
            +
          • com.sleepycat.je.jmx.JEDiagnostics (implements javax.management.DynamicMBean)
          • +
          • com.sleepycat.je.jmx.JEMonitor (implements javax.management.DynamicMBean)
          • +
          +
        • +
        • com.sleepycat.je.jmx.JEMBeanHelper
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/jmx/package-use.html b/docs/java/com/sleepycat/je/jmx/package-use.html new file mode 100644 index 0000000..19fdf21 --- /dev/null +++ b/docs/java/com/sleepycat/je/jmx/package-use.html @@ -0,0 +1,164 @@ + + + + + +Uses of Package com.sleepycat.je.jmx (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.jmx

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/package-frame.html b/docs/java/com/sleepycat/je/package-frame.html new file mode 100644 index 0000000..9069b0d --- /dev/null +++ b/docs/java/com/sleepycat/je/package-frame.html @@ -0,0 +1,123 @@ + + + + + +com.sleepycat.je (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je

      +
      +

      Interfaces

      + +

      Classes

      + +

      Enums

      + +

      Exceptions

      + +
      + + diff --git a/docs/java/com/sleepycat/je/package-summary.html b/docs/java/com/sleepycat/je/package-summary.html new file mode 100644 index 0000000..9073612 --- /dev/null +++ b/docs/java/com/sleepycat/je/package-summary.html @@ -0,0 +1,852 @@ + + + + + +com.sleepycat.je (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je

      +
      +
      Foundation for creating environments, databases and transactions; provides +cursor based data access.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        BinaryEqualityComparator +
        A tag interface used to mark a BTree or duplicate comparator class as a + binary equality comparator, that is, a comparator that considers + two keys (byte arrays) to be equal if and only if they have the same + length and they are equal byte-per-byte.
        +
        CustomStats +
        A custom statistics object.
        +
        DatabaseComparator +
        Implemented by btree and duplicate comparators that need to be initialized + before they are used or need access to the environment's ClassLoader + property.
        +
        ExceptionListener +
        A callback to notify the application program when an exception occurs in a + JE Daemon thread.
        +
        ForeignKeyNullifier +
        The interface implemented for setting single-valued foreign keys to null.
        +
        ForeignMultiKeyNullifier +
        The interface implemented for setting multi-valued foreign keys to null.
        +
        ForwardCursor +
        The interface for forward-moving Cursor operations.
        +
        PartialComparator +
        A tag interface used to mark a B-tree or duplicate comparator class as a + partial comparator.
        +
        ProgressListener<T extends java.lang.Enum<T>> +
        ProgressListener provides feedback to the application that progress is being + made on a potentially long running or asynchronous JE operation.
        +
        ReplicaConsistencyPolicy +
        The interface for Consistency policies used to provide consistency + guarantees at a Replica.
        +
        SecondaryKeyCreator +
        The interface implemented for extracting single-valued secondary keys from + primary records.
        +
        SecondaryMultiKeyCreator +
        The interface implemented for extracting multi-valued secondary keys from + primary records.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        BtreeStats +
        The BtreeStats object is used to return Btree database statistics.
        +
        CheckpointConfig +
        Specifies the attributes of a checkpoint operation invoked from Environment.checkpoint.
        +
        CommitToken +
        Defines an opaque token that can be used to identify a specific transaction + commit in a replicated environment.
        +
        Cursor +
        A database cursor.
        +
        CursorConfig +
        Specifies the attributes of database cursor.
        +
        Database +
        A database handle.
        +
        DatabaseConfig +
        Specifies the attributes of a database.
        +
        DatabaseEntry +
        Encodes database key and data items as a byte array.
        +
        DatabaseStats +
        Statistics for a single database.
        +
        DiskOrderedCursor +
        DiskOrderedCursor returns records in unsorted order in exchange for + generally faster retrieval times.
        +
        DiskOrderedCursorConfig +
        Specifies the attributes of a DiskOrderedCursor.
        +
        Durability +
        Durability defines the overall durability characteristics associated with a + transaction.
        +
        Environment +
        A database environment.
        +
        EnvironmentConfig +
        Specifies the attributes of an environment.
        +
        EnvironmentMutableConfig +
        Specifies the environment attributes that may be changed after the + environment has been opened.
        +
        EnvironmentStats +
        Statistics for a single environment.
        +
        ExceptionEvent +
        A class representing an exception event.
        +
        JEVersion +
        Berkeley DB Java Edition version information.
        +
        JoinConfig +
        The configuration properties of a JoinCursor.
        +
        JoinCursor +
        A specialized join cursor for use in performing equality or natural joins on + secondary indices.
        +
        LockStatsDeprecated +
        as of 4.0.10, replaced by Environment.getStats(StatsConfig).
        +
        OperationResult +
        The result of an operation that successfully reads or writes a record.
        +
        PreloadConfig +
        Specifies the attributes of an application invoked preload operation.
        +
        PreloadStats + +
        PreloadStatus +
        Describes the result of the Database.preload operation.
        +
        ReadOptions +
        Options for calling methods that read records.
        +
        SecondaryConfig +
        The configuration properties of a SecondaryDatabase extend + those of a primary Database.
        +
        SecondaryCursor +
        A database cursor for a secondary database.
        +
        SecondaryDatabase +
        A secondary database handle.
        +
        Sequence +
        A Sequence handle is used to manipulate a sequence record in a + database.
        +
        SequenceConfig +
        Specifies the attributes of a sequence.
        +
        SequenceStats +
        A SequenceStats object is used to return sequence statistics.
        +
        StatsConfig +
        Specifies the attributes of a statistics retrieval operation.
        +
        Transaction +
        The Transaction object is the handle for a transaction.
        +
        TransactionConfig +
        Specifies the attributes of a database environment transaction.
        +
        TransactionStats +
        Transaction statistics for a database environment.
        +
        TransactionStats.Active +
        The Active class represents an active transaction.
        +
        VerifyConfig +
        Specifies the attributes of a verification operation.
        +
        WriteOptions +
        Options for calling methods that write (insert, update or delete) records.
        +
        XAEnvironment +
        An Environment that implements XAResource.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Enum Summary 
        EnumDescription
        CacheMode +
        Modes that can be specified for control over caching of records in the JE + in-memory cache.
        +
        Durability.ReplicaAckPolicy +
        A replicated environment makes it possible to increase an application's + transaction commit guarantees by committing changes to its replicas on + the network.
        +
        Durability.SyncPolicy +
        Defines the synchronization policy to be used when committing a + transaction.
        +
        ForeignKeyDeleteAction +
        The action taken when a referenced record in the foreign key database is + deleted.
        +
        Get +
        The operation type passed to "get" methods on databases and cursors.
        +
        LockMode +
        Record lock modes for read operations.
        +
        OperationStatus +
        Status values from database operations.
        +
        PreloadConfig.Phases +
        Preload progress listeners report this phase value, along with a + count of the number if times that the preload has fetched from disk.
        +
        Put +
        The operation type passed to "put" methods on databases and cursors.
        +
        RecoveryProgress +
        Describes the different phases of initialization that + be executed when an Environment is instantiated.
        +
        Transaction.State +
        The current state of the transaction.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Exception Summary 
        ExceptionDescription
        DatabaseException +
        The root of all BDB JE-defined exceptions.
        +
        DatabaseExistsException +
        Thrown by Environment.openDatabase and + Environment.openSecondaryDatabase + if the database already exists and the DatabaseConfig + ExclusiveCreate parameter is true.
        +
        DatabaseNotFoundException +
        Thrown when an operation requires a database and that database does not + exist.
        +
        DeadlockException +
        Thrown when a deadlock is detected.
        +
        DeleteConstraintException +
        Thrown when an attempt is made to delete a key from a foreign key database, + when that key is referenced by a secondary database, and the secondary is + configured to cause an abort in this situation.
        +
        DiskLimitException +
        Thrown when a write operation cannot be performed because a disk limit has + been violated.
        +
        DiskOrderedCursorProducerException +
        Thrown by ForwardCursor.getNext when a + DiskOrderedCursor producer thread throws an exception.
        +
        DuplicateDataException +
        Thrown by Cursor.putCurrent if the old and new + data are not equal according to the configured duplicate comparator or + default comparator.
        +
        EnvironmentFailureException +
        Indicates that a failure has occurred that could impact the Environment as a whole.
        +
        EnvironmentLockedException +
        Thrown by the Environment constructor when an environment cannot be + opened for write access because another process has the same environment + open for write access.
        +
        EnvironmentNotFoundException +
        Thrown by the Environment constructor when EnvironmentConfig + AllowCreate property is false (environment creation is not permitted), but + there are no log files in the environment directory.
        +
        EnvironmentWedgedException +
        Thrown by the Environment.close() when the current process must be + shut down and restarted before re-opening the Environment.
        +
        ForeignConstraintException +
        Thrown when an attempt to write a primary database record would insert a + secondary record with a key that does not exist in a foreign key database, + when the secondary key is configured as a foreign key.
        +
        LockConflictException +
        The common base class for all exceptions that result from record lock + conflicts during read and write operations.
        +
        LockNotAvailableException +
        Thrown when a non-blocking operation fails to get a lock.
        +
        LockNotGrantedExceptionDeprecated + +
        LockTimeoutException +
        Thrown when multiple threads are competing for a lock and the lock timeout + interval is exceeded for the current operation.
        +
        LogWriteException +
        Thrown when an IOException or other failure occurs when writing to + the JE log.
        +
        OperationFailureException +
        Indicates that a failure has occurred that impacts the current operation + and/or transaction.
        +
        RunRecoveryExceptionDeprecated + +
        SecondaryConstraintException +
        Base class for exceptions thrown when a write operation fails because of a + secondary constraint.
        +
        SecondaryIntegrityException +
        Thrown when an integrity problem is detected while accessing a secondary + database, including access to secondaries while writing to a primary + database.
        +
        SecondaryReferenceException +
        Base class for exceptions thrown when a read or write operation fails + because of a secondary constraint or integrity problem.
        +
        SequenceExistsException +
        Thrown by Database.openSequence if the + sequence record already exists and the SequenceConfig + ExclusiveCreate parameter is true.
        +
        SequenceIntegrityException +
        Thrown by Sequence.get if the sequence record has been + deleted.
        +
        SequenceNotFoundException +
        Thrown by Database.openSequence if the + sequence record does not exist and the SequenceConfig AllowCreate + parameter is false.
        +
        SequenceOverflowException +
        Thrown by Sequence.get if the end of the sequence is + reached and wrapping is not configured.
        +
        ThreadInterruptedException +
        Thrown when java.lang.InterruptedException (a thread interrupt) or + java.nio.channels.ClosedChannelException (which also results from a + thread interrupt) occurs in any JE method.
        +
        TransactionTimeoutException +
        Thrown when the transaction timeout interval is exceeded.
        +
        UniqueConstraintException +
        Thrown when an attempt to write a primary database record would insert a + secondary record with a duplicate key, for secondaries that represent + one-to-one and one-to-many relationships.
        +
        VersionMismatchException +
        Thrown by the Environment constructor when an environment cannot be + opened because the version of the existing log is not compatible with the + version of JE that is running.
        +
        XAFailureException +
        Thrown if an attempt is made to use a Transaction after it has been + invalidated as the result of an XA failure.
        +
        +
      • +
      + + + +

      Package com.sleepycat.je Description

      +
      Foundation for creating environments, databases and transactions; provides +cursor based data access. + +

      Package Specification

      +This package constitutes the base public API for Berkeley DB, Java +Edition. The classes here are used to create database +objects, and insert and retrieve data. +

      +This package provides a key/data pair model of a database +record. Databases and database cursors are the key objects used to +access data. An alternative collections based API is available through +com.sleepycat.collections. +

      +The Environment class embodies the database environment and is the starting +point for the application. Databases and transaction objects are +created through the Environment class. +

      +Data can be inserted and retrieved directly through the Database +object, or through a Cursor obtained from the Database. A database record +consist of a key/data pair, where key and data are each individually +represented by a DatabaseEntry object. Classes in com.sleepycat.bind +provide optional support for mapping a Java object to a DatabaseEntry. +

      +Configuration classes are used to specify the attributes of particular +operations. For example the attributes of a database environment are +specified in the EnvironmentConfig class. An instance of that class is +required for Environment construction. Likewise, the attributes of a +database are described in DatabaseConfig, which is a parameter to the +Environment.openDatabase() method.

      +
      +
      See Also:
      +
      [Getting Started Guide]
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/package-tree.html b/docs/java/com/sleepycat/je/package-tree.html new file mode 100644 index 0000000..522f827 --- /dev/null +++ b/docs/java/com/sleepycat/je/package-tree.html @@ -0,0 +1,321 @@ + + + + + +com.sleepycat.je Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      + +

      Enum Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/package-use.html b/docs/java/com/sleepycat/je/package-use.html new file mode 100644 index 0000000..bb2c386 --- /dev/null +++ b/docs/java/com/sleepycat/je/package-use.html @@ -0,0 +1,1250 @@ + + + + + +Uses of Package com.sleepycat.je (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/AppStateMonitor.html b/docs/java/com/sleepycat/je/rep/AppStateMonitor.html new file mode 100644 index 0000000..d3383eb --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/AppStateMonitor.html @@ -0,0 +1,274 @@ + + + + + +AppStateMonitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Interface AppStateMonitor

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface AppStateMonitor
        +
        A mechanism for adding application specific information when asynchronously + tracking the state of a running JE HA application. +

        + NodeState provides information about the current state of a member + of the replication group. The application can obtain NodeState via ReplicationGroupAdmin.getNodeState(com.sleepycat.je.rep.ReplicationNode, int) or DbPing.getNodeState(). A NodeState contains mostly + JE-centric information, such as whether the node is a master or + replica. However, it may be important to add in some application specific + information to enable the best use of the status. +

        + For example, an application may want to direct operations to specific nodes + based on whether the node is available. The fields in NodeState will + tell the application whether the node is up and available in a JE HA sense, + but the application may also need information about an application level + resource, which would affect the load balancing decision. The AppStateMonitor + is a way for the application to inject this kind of application specific + information into the replicated node status. +

        + The AppStateMonitor is registered with the replicated environment using + ReplicatedEnvironment.registerAppStateMonitor(AppStateMonitor). + There is at most one AppStateMonitor associated with the actual environment + (not an Environment handle) at any given time. JE + HA calls getAppState() when it is assembling status + information for a given node. +

        + After registration, the application can obtain this application specific + information along with other JE HA status information when it obtains a + NodeState, through NodeState.getAppState(). +

        + getAppState() returns a byte array whose length + should be larger than 0. An IllegalStateException will be thrown if the + returned byte array is 0 size. Users are responsible for serializing and + deserializing the desired information into this byte array.

        +
        +
        Since:
        +
        5.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          byte[]getAppState() +
          Return a byte array which holds information about the application's + state.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getAppState

            +
            byte[] getAppState()
            +
            Return a byte array which holds information about the application's + state. The application is responsible for serialize and deserialize this + information. +

            + Note the returned byte array's length should be larger than 0.

            +
            +
            Returns:
            +
            the application state
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/CommitPointConsistencyPolicy.html b/docs/java/com/sleepycat/je/rep/CommitPointConsistencyPolicy.html new file mode 100644 index 0000000..6465665 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/CommitPointConsistencyPolicy.html @@ -0,0 +1,498 @@ + + + + + +CommitPointConsistencyPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class CommitPointConsistencyPolicy

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.CommitPointConsistencyPolicy
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ReplicaConsistencyPolicy
        +
        +
        +
        +
        public class CommitPointConsistencyPolicy
        +extends java.lang.Object
        +implements ReplicaConsistencyPolicy
        +
        A consistency policy which ensures that the environment on a Replica node is + at least as current as denoted by the specified CommitToken. This + token represents a point in the serialized transaction schedule created by + the master. In other words, this token is like a bookmark, representing a + particular transaction commit in the replication stream. The Replica ensures + that the commit identified by the CommitToken has been executed on + this node before allowing the application's Environment.beginTransaction() + operation on the Replica to proceed. +

        + For example, suppose the application is a web application where a replicated + group is implemented within a load balanced web server group. Each request + to the web server consists of an update operation followed by read + operations (say from the same client), The read operations naturally expect + to see the data from the updates executed by the same request. However, the + read operations might have been routed to a node that did not execute the + update. +

        + In such a case, the update request would generate a CommitToken, + which would be resubmitted by the browser, along with subsequent read + requests. The read request could be directed at any one of the available web + servers by a load balancer. The node which executes the read request would + create a CommitPointConsistencyPolicy with that CommitToken and use + it at transaction begin. If the environment at the web server was already + current (wrt the commit token), it could immediately execute the transaction + and satisfy the request. If not, the "transaction begin" would stall until + the Replica replay had caught up and the change was available at that web + server. +

        + Consistency policies are specified at either a per-transaction level through + TransactionConfig.setConsistencyPolicy(com.sleepycat.je.ReplicaConsistencyPolicy) or as an + replication node wide default through ReplicationConfig.setConsistencyPolicy(com.sleepycat.je.ReplicaConsistencyPolicy)

        +
        +
        See Also:
        +
        CommitToken, +Managing Consistency
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static java.lang.StringNAME +
          The name:"CommitPointConsistencyPolicy" associated with this policy.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          CommitPointConsistencyPolicy(CommitToken commitToken, + long timeout, + java.util.concurrent.TimeUnit timeoutUnit) +
          Defines how current a Replica needs to be in terms of a specific + transaction that was committed on the Master.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object obj) 
          CommitTokengetCommitToken() +
          Return the CommitToken used to create this consistency + policy.
          +
          java.lang.StringgetName() +
          Returns the name:"CommitPointConsistencyPolicy", associated with this policy.
          +
          longgetTimeout(java.util.concurrent.TimeUnit unit) +
          Return the timeout specified when creating this consistency policy.
          +
          inthashCode() 
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            NAME

            +
            public static final java.lang.String NAME
            +
            The name:"CommitPointConsistencyPolicy" associated with this policy. The name can be used when + constructing policy property values for use in je.properties files.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            CommitPointConsistencyPolicy

            +
            public CommitPointConsistencyPolicy(CommitToken commitToken,
            +                                    long timeout,
            +                                    java.util.concurrent.TimeUnit timeoutUnit)
            +
            Defines how current a Replica needs to be in terms of a specific + transaction that was committed on the Master. A transaction on the + Replica that uses this consistency policy is allowed to start only + after the transaction identified by the commitToken has + been committed on the Replica. The Environment.beginTransaction() will wait for at most + timeout for the Replica to catch up. If the Replica has + not caught up in this period, the beginTransaction() + method will throw a ReplicaConsistencyException.
            +
            +
            Parameters:
            +
            commitToken - the token identifying the transaction
            +
            timeout - the maximum amount of time that the transaction start + will wait to allow the Replica to catch up.
            +
            timeoutUnit - the TimeUnit for the timeout parameter.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the commitToken or timeoutUnit is + null.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            getCommitToken

            +
            public CommitToken getCommitToken()
            +
            Return the CommitToken used to create this consistency + policy.
            +
            +
            Returns:
            +
            the CommitToken used to create this consistency + policy.
            +
            +
          • +
          + + + +
            +
          • +

            getTimeout

            +
            public long getTimeout(java.util.concurrent.TimeUnit unit)
            +
            Return the timeout specified when creating this consistency policy.
            +
            +
            Specified by:
            +
            getTimeout in interface ReplicaConsistencyPolicy
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value.
            +
            Returns:
            +
            the timeout specified when creating this consistency policy
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            See Also:
            +
            Object.hashCode()
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object obj)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            See Also:
            +
            Object.equals(java.lang.Object)
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/DatabasePreemptedException.html b/docs/java/com/sleepycat/je/rep/DatabasePreemptedException.html new file mode 100644 index 0000000..36ee0d2 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/DatabasePreemptedException.html @@ -0,0 +1,349 @@ + + + + + +DatabasePreemptedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class DatabasePreemptedException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class DatabasePreemptedException
        +extends OperationFailureException
        +
        Thrown when attempting to use a Database handle that was forcibly closed by + replication. This exception only occurs in a replicated environment and + normally only occurs on a Replica node. In the case of a DPL schema upgrade + where an entity class or secondary key is renamed, it may also occur on a + Master node, as described below. + +

        This exception occurs when accessing a database or store and one of the + following methods was recently executed on the master node and then replayed + on a replica node: + truncateDatabase, + removeDatabase and + renameDatabase.

        + +

        When using the DPL, this occurs only in two + circumstances:

        +
          +
        1. This exception is thrown on a Replica node when the truncateClass method has + been called on the Master node.
        2. +
        3. This exception is thrown on a Replica or Master node when an entity + class or secondary key has been renamed and the application has been + upgraded. See + Upgrading + a Replication Group.
        4. +
        + +

        When this exception occurs, the application must close any open cursors + and abort any open transactions that are using the database or store, and + then close the database or store handle. If the application wishes, it may + then reopen the database (if it still exists) or store.

        + +

        Some applications may wish to coordinate the Master and Replica sites to + prevent a Replica from accessing a database that is being truncated, removed + or renamed, and thereby prevent this exception. Such coordination is not + directly supported by JE. The DatabasePreemptedException is provided to + allow an application to handle database truncation, removal and renaming + without such coordination between nodes.

        + +

        The Transaction handle is not + invalidated as a result of this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          DatabasegetDatabase() +
          Returns the database handle that was forcibly closed.
          +
          java.lang.StringgetDatabaseName() +
          Returns the name of the database that was forcibly closed.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDatabase

            +
            public Database getDatabase()
            +
            Returns the database handle that was forcibly closed.
            +
          • +
          + + + +
            +
          • +

            getDatabaseName

            +
            public java.lang.String getDatabaseName()
            +
            Returns the name of the database that was forcibly closed.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/GroupShutdownException.html b/docs/java/com/sleepycat/je/rep/GroupShutdownException.html new file mode 100644 index 0000000..380353c --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/GroupShutdownException.html @@ -0,0 +1,257 @@ + + + + + +GroupShutdownException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class GroupShutdownException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/InsufficientAcksException.html b/docs/java/com/sleepycat/je/rep/InsufficientAcksException.html new file mode 100644 index 0000000..4d41685 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/InsufficientAcksException.html @@ -0,0 +1,372 @@ + + + + + +InsufficientAcksException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class InsufficientAcksException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class InsufficientAcksException
        +extends OperationFailureException
        +

        + This exception is thrown at the time of a commit in a Master, if the Master + could not obtain transaction commit acknowledgments from its Replicas in + accordance with the Durability.ReplicaAckPolicy currently in effect and within + the requested timeout interval. This exception will never be thrown when the + ReplicaAckPolicy of NONE is in effect. +

        + Note that an InsufficientAcksException means the transaction has + already committed at the master. The transaction may also have been + committed at one or more Replicas, but the lack of replica acknowledgments + means that the number of replicas that committed could not be + established. If the transaction was in fact committed by less than a simple + majority of the nodes, it could result in a RollbackException when + the node subsequently attempts to rejoin the group as a Replica. +

        + The application can handle the exception and choose to respond in a number + of ways. For example, it can +

          +
        • do nothing, assuming that the transaction will eventually propagate to + enough replicas to become durable, +
        • retry the operation in a new transaction, which may succeed or fail + depending on whether the underlying problems have been resolved, +
        • retry using a larger timeout interval and return to the original + timeout interval at a later time, +
        • fall back temporarily to a read-only mode, +
        • increase the durability of the transaction on the Master by ensuring + that the changes are flushed to the operating system's buffers or to + the disk, or +
        • give up and report an error at a higher level, perhaps to allow an + administrator to check the underlying cause of the failure. +
        +
        +
        See Also:
        +
        Durability, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intacksPending() +
          It returns the number of Replicas that did not respond with an + acknowledgment within the Replica commit timeout period.
          +
          intacksRequired() +
          It returns the number of acknowledgments required by the commit policy.
          +
          intackTimeout() +
          Returns the acknowledgment timeout that was in effect at the time of the + exception.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            acksPending

            +
            public int acksPending()
            +
            It returns the number of Replicas that did not respond with an + acknowledgment within the Replica commit timeout period.
            +
            +
            Returns:
            +
            the number of missing acknowledgments
            +
            +
          • +
          + + + +
            +
          • +

            acksRequired

            +
            public int acksRequired()
            +
            It returns the number of acknowledgments required by the commit policy.
            +
            +
            Returns:
            +
            the number of acknowledgments required
            +
            +
          • +
          + + + +
            +
          • +

            ackTimeout

            +
            public int ackTimeout()
            +
            Returns the acknowledgment timeout that was in effect at the time of the + exception.
            +
            +
            Returns:
            +
            the acknowledgment timeout in milliseconds
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/InsufficientLogException.html b/docs/java/com/sleepycat/je/rep/InsufficientLogException.html new file mode 100644 index 0000000..57474a9 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/InsufficientLogException.html @@ -0,0 +1,344 @@ + + + + + +InsufficientLogException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class InsufficientLogException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class InsufficientLogException
        +extends RestartRequiredException
        +
        This exception indicates that the log files constituting the Environment are + insufficient and cannot be used as the basis for continuing with the + replication stream provided by the current master. +

        + This exception is typically thrown by the ReplicatedEnvironment constructor + when a node has been down for a long period of time and is being started up + again. It may also be thrown when a brand new node attempts to become a + member of the group and it does not have a sufficiently current set of log + files. If the group experiences sustained network connectivity problems, + this exception may also be thrown by an active Replica that has been unable + to stay in touch with the members of its group for an extended period of + time. +

        + In the typical case, application handles the exception by invoking + NetworkRestore.execute(com.sleepycat.je.rep.InsufficientLogException, com.sleepycat.je.rep.NetworkRestoreConfig) to obtain the log files it needs from one of + the members of the replication group. After the log files are obtained, the + node recreates its environment handle and resumes participation as an active + member of the group.

        +
        +
        See Also:
        +
        NetworkRestore, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.util.Set<ReplicationNode>getLogProviders() +
          Returns the members of the replication group that can serve as candidate + log providers to supply the logs needed by this node.
          +
          java.lang.StringtoString() 
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getLogProviders

            +
            public java.util.Set<ReplicationNode> getLogProviders()
            +
            Returns the members of the replication group that can serve as candidate + log providers to supply the logs needed by this node.
            +
            +
            Returns:
            +
            a list of members that can provide logs
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Throwable
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/InsufficientReplicasException.html b/docs/java/com/sleepycat/je/rep/InsufficientReplicasException.html new file mode 100644 index 0000000..75369b1 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/InsufficientReplicasException.html @@ -0,0 +1,393 @@ + + + + + +InsufficientReplicasException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class InsufficientReplicasException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          InsufficientReplicasException(com.sleepycat.je.txn.Locker locker, + Durability.ReplicaAckPolicy ackPolicy, + int requiredAckCount, + java.util.Set<java.lang.String> availableReplicas) +
          Creates a Commit exception.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.util.Set<java.lang.String>getAvailableReplicas() +
          Returns the set of Replicas that were in contact with the master at the + time of the commit operation.
          +
          Durability.ReplicaAckPolicygetCommitPolicy() +
          Returns the Replica ack policy that was in effect for the transaction.
          +
          intgetRequiredNodeCount() +
          Returns the number of nodes (including the master) that were + required to be active in order to satisfy the Replica ack + policy.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            InsufficientReplicasException

            +
            public InsufficientReplicasException(com.sleepycat.je.txn.Locker locker,
            +                                     Durability.ReplicaAckPolicy ackPolicy,
            +                                     int requiredAckCount,
            +                                     java.util.Set<java.lang.String> availableReplicas)
            +
            Creates a Commit exception.
            +
            +
            Parameters:
            +
            ackPolicy - the ack policy that could not be implemented
            +
            requiredAckCount - the replica acks required to satisfy the policy
            +
            availableReplicas - the set of available Replicas
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getCommitPolicy

            +
            public Durability.ReplicaAckPolicy getCommitPolicy()
            +
            Returns the Replica ack policy that was in effect for the transaction.
            +
            +
            Returns:
            +
            the Replica ack policy
            +
            +
          • +
          + + + +
            +
          • +

            getRequiredNodeCount

            +
            public int getRequiredNodeCount()
            +
            Returns the number of nodes (including the master) that were + required to be active in order to satisfy the Replica ack + policy.
            +
            +
            Returns:
            +
            the required number of nodes
            +
            +
          • +
          + + + +
            +
          • +

            getAvailableReplicas

            +
            public java.util.Set<java.lang.String> getAvailableReplicas()
            +
            Returns the set of Replicas that were in contact with the master at the + time of the commit operation.
            +
            +
            Returns:
            +
            a set of Replica node names
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/LockPreemptedException.html b/docs/java/com/sleepycat/je/rep/LockPreemptedException.html new file mode 100644 index 0000000..65953ed --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/LockPreemptedException.html @@ -0,0 +1,278 @@ + + + + + +LockPreemptedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class LockPreemptedException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class LockPreemptedException
        +extends LockConflictException
        +
        Thrown when a lock has been "stolen", or preempted, from a transaction in a + replicated environment. + +

        The Transaction handle is invalidated as a + result of this exception.

        + +

        Locks may be preempted in a JE HA environment on a Replica system when + the HA write operation needs a lock that an application reader transaction + or cursor holds. This exception is thrown by a reader transaction or cursor + method that is called after a lock has been preempted.

        + +

        Normally, applications should catch the base class LockConflictException rather than catching one of its subclasses. All lock + conflicts are typically handled in the same way, which is normally to abort + and retry the transaction. See LockConflictException for more + information.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/LogOverwriteException.html b/docs/java/com/sleepycat/je/rep/LogOverwriteException.html new file mode 100644 index 0000000..83c3866 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/LogOverwriteException.html @@ -0,0 +1,267 @@ + + + + + +LogOverwriteException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class LogOverwriteException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class LogOverwriteException
        +extends OperationFailureException
        +
        Thrown when one or more log files are modified (overwritten) as the result + of a replication operation. This occurs when a replication operation must + change existing data in a log file in order to synchronize with other nodes + in a replication group. Any previously copied log files may be invalid and + should be discarded. + +

        This exception is thrown by DbBackup. Backups and similar operations that copy + log files should discard any copied files when this exception occurs, and + may retry the operation at a later time. The time interval during which + backups are not possible will be fairly short (less than a minute).

        + +

        Note that this exception is never thrown in a standalone (non-replicated) + environment.

        + +

        The Transaction handle is not + invalidated as a result of this exception.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/MasterReplicaTransitionException.html b/docs/java/com/sleepycat/je/rep/MasterReplicaTransitionException.html new file mode 100644 index 0000000..efffcc7 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/MasterReplicaTransitionException.html @@ -0,0 +1,318 @@ + + + + + +MasterReplicaTransitionException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class MasterReplicaTransitionException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Deprecated.  +
        as of JE 5.0.88 because the environment no longer needs to + restart when transitioning from master to replica.
        +
        +
        +
        @Deprecated
        +public class MasterReplicaTransitionException
        +extends RestartRequiredException
        +
        In the past, MasterReplicaTransitionException was sometimes thrown in JE + replication systems when an environment that was a master and transitioned + to replica state. In some cases, the environment had to reinitialize + internal state to become a replica, and the application was required to + the application close and reopen its environment handle, thereby + properly reinitializing the node. +

        + As of JE 5.0.88, the environment can transition from master to replica + without requiring an environment close and re-open.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          MasterReplicaTransitionException(com.sleepycat.je.dbi.EnvironmentImpl envImpl, + java.lang.Exception cause) +
          Deprecated. 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            MasterReplicaTransitionException

            +
            public MasterReplicaTransitionException(com.sleepycat.je.dbi.EnvironmentImpl envImpl,
            +                                        java.lang.Exception cause)
            +
            Deprecated. 
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/MasterStateException.html b/docs/java/com/sleepycat/je/rep/MasterStateException.html new file mode 100644 index 0000000..0f69f5b --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/MasterStateException.html @@ -0,0 +1,264 @@ + + + + + +MasterStateException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class MasterStateException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/MasterTransferFailureException.html b/docs/java/com/sleepycat/je/rep/MasterTransferFailureException.html new file mode 100644 index 0000000..b3d4291 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/MasterTransferFailureException.html @@ -0,0 +1,251 @@ + + + + + +MasterTransferFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class MasterTransferFailureException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/MemberNotFoundException.html b/docs/java/com/sleepycat/je/rep/MemberNotFoundException.html new file mode 100644 index 0000000..f55fb48 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/MemberNotFoundException.html @@ -0,0 +1,251 @@ + + + + + +MemberNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class MemberNotFoundException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class MemberNotFoundException
        +extends OperationFailureException
        +
        Thrown when an operation requires a replication group member and that member + is not present in the replication group.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/NetworkRestore.html b/docs/java/com/sleepycat/je/rep/NetworkRestore.html new file mode 100644 index 0000000..4d66fd2 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/NetworkRestore.html @@ -0,0 +1,361 @@ + + + + + +NetworkRestore (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class NetworkRestore

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.NetworkRestore
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class NetworkRestore
        +extends java.lang.Object
        +
        Obtains log files for a Replica from other members of the replication + group. A Replica may need to do so if it has been offline for some time, and + has fallen behind in its execution of the replication stream. +

        + During that time, the connected nodes may have reduced their log files by + deleting files after doing log cleaning. When this node rejoins the group, + it is possible that the current Master's log files do not go back far enough + to adequately + sync * up this node. In that case, the node can use a NetworkRestore object to copy the log files from one of the nodes in the + group. The system tries to avoid deleting log files that either would be + needed for replication by current nodes or where replication would be more + efficient than network restore. +

        + A Replica discovers the need for a NetworkRestore operation when a call to + ReplicatedEnvironment() fails with a InsufficientLogException. +

        + A call to NetworkRestore.execute() will copy the required log + files from a member of the group who owns the files and seems to be the + least busy. For example: +

        +  try {
        +     node = new ReplicatedEnvironment(envDir, envConfig, repConfig);
        + } catch (InsufficientLogException insufficientLogEx) {
        +
        +     NetworkRestore restore = new NetworkRestore();
        +     NetworkRestoreConfig config = new NetworkRestoreConfig();
        +     config.setRetainLogFiles(false); // delete obsolete log files.
        +
        +     // Use the members returned by insufficientLogEx.getLogProviders() to
        +     // select the desired subset of members and pass the resulting list
        +     // as the argument to config.setLogProviders(), if the default selection
        +     // of providers is not suitable.
        +
        +     restore.execute(insufficientLogEx, config);
        +
        +     // retry
        +     node = new ReplicatedEnvironment(envDir, envConfig, repConfig);
        + }
        + 
        +
        +
        See Also:
        +
        + Restoring Log Files
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          NetworkRestore() +
          Creates an instance of NetworkRestore suitable for restoring the logs at + this node.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            NetworkRestore

            +
            public NetworkRestore()
            +
            Creates an instance of NetworkRestore suitable for restoring the logs at + this node. After the logs are restored, the node can create a new + ReplicatedEnvironment and join the group
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            execute

            +
            public void execute(InsufficientLogException logException,
            +                    NetworkRestoreConfig config)
            +             throws EnvironmentFailureException,
            +                    java.lang.IllegalArgumentException
            +
            Restores the log files from one of the members of the replication group. +

            + If config.getLogProviders() returns null, or an empty list, + it uses the member that is least busy as the provider of the log files. + Otherwise it selects a member from the list, choosing the first member + that's available, to provide the log files. If the members in this list + are not present in logException.getLogProviders(), it will + result in an IllegalArgumentException being thrown. + Exceptions handlers for InsufficientLogException will + typically use InsufficientLogException.getLogProviders() as the + starting point to compute an appropriate list, with which to set up + the config argument. +

            + Log files that are currently at the node will be retained if they are + part of a consistent set of log files. Obsolete log files are either + deleted, or are renamed based on the the configuration of + config.getRetainLogFiles().

            +
            +
            Parameters:
            +
            logException - the exception thrown by ReplicatedEnvironment() that necessitated this log refresh operation
            +
            config - configures the execution of the network restore operation
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalArgumentException - if the config is invalid
            +
            See Also:
            +
            NetworkRestoreConfig
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/NetworkRestoreConfig.html b/docs/java/com/sleepycat/je/rep/NetworkRestoreConfig.html new file mode 100644 index 0000000..f40886c --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/NetworkRestoreConfig.html @@ -0,0 +1,427 @@ + + + + + +NetworkRestoreConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class NetworkRestoreConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.NetworkRestoreConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class NetworkRestoreConfig
        +extends java.lang.Object
        +
        NetworkRestoreConfig defines the configuration parameters used to configure + a NetworkRestore operation.
        +
        +
        See Also:
        +
        NetworkRestore
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.util.List<ReplicationNode>getLogProviders() +
          Returns the candidate list of data nodes, either ELECTABLE or SECONDARY + members, that may be used to obtain log files.
          +
          intgetReceiveBufferSize() +
          Returns the size of the receive buffer associated with the socket used + to transfer files during the NetworkRestore operation.
          +
          booleangetRetainLogFiles() +
          Returns a boolean indicating whether existing log files should be + retained or deleted.
          +
          NetworkRestoreConfigsetLogProviders(java.util.List<ReplicationNode> providers) +
          Sets the prioritized list of data nodes, either ELECTABLE or SECONDARY + members, used to select a node from which to obtain log files for the + NetworkRestore operation.
          +
          NetworkRestoreConfigsetReceiveBufferSize(int receiveBufferSize) +
          Sets the size of the receive buffer associated with the socket used to + transfer files during the NetworkRestore operation.
          +
          NetworkRestoreConfigsetRetainLogFiles(boolean retainLogFiles) +
          If true retains obsolete log files, by renaming them instead of deleting + them.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            NetworkRestoreConfig

            +
            public NetworkRestoreConfig()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getRetainLogFiles

            +
            public boolean getRetainLogFiles()
            +
            Returns a boolean indicating whether existing log files should be + retained or deleted.
            +
            +
            Returns:
            +
            true if log files must be retained
            +
            +
          • +
          + + + +
            +
          • +

            setRetainLogFiles

            +
            public NetworkRestoreConfig setRetainLogFiles(boolean retainLogFiles)
            +
            If true retains obsolete log files, by renaming them instead of deleting + them. The default is "true". +

            + A renamed file has its .jdb suffix replaced by + .bup and an additional numeric monotonically increasing + numeric suffix. All files that were renamed as part of the same + NetworkRestore attempt will have the same numeric suffix. +

            + For example, if files 00000001.jdb and files 00000002.jdb were rendered + obsolete, and 4 was the highest suffix in use for this environment when + the operation was initiated, then the files would be renamed as + 00000001.bup.5 and 00000002.bup.5.

            +
            +
            Parameters:
            +
            retainLogFiles - if true retains obsolete log files
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getReceiveBufferSize

            +
            public int getReceiveBufferSize()
            +
            Returns the size of the receive buffer associated with the socket used + to transfer files during the NetworkRestore operation.
            +
          • +
          + + + +
            +
          • +

            setReceiveBufferSize

            +
            public NetworkRestoreConfig setReceiveBufferSize(int receiveBufferSize)
            +
            Sets the size of the receive buffer associated with the socket used to + transfer files during the NetworkRestore operation. +

            + Note that if the size specified is larger than the operating system + constrained maximum, it will be limited to this maximum value. For + example, on Linux you may need to set the kernel parameter: + net.core.rmem_max property using the command: sysctl -w + net.core.rmem_max=1048576 to increase the operating system imposed + limit. +

            +
            +
            Parameters:
            +
            receiveBufferSize - the size of the receive buffer. If it's zero, + the operating system default value is used.
            +
            +
          • +
          + + + +
            +
          • +

            getLogProviders

            +
            public java.util.List<ReplicationNode> getLogProviders()
            +
            Returns the candidate list of data nodes, either ELECTABLE or SECONDARY + members, that may be used to obtain log files.
            +
            +
            Returns:
            +
            the list of data nodes in priority order, or null
            +
            +
          • +
          + + + +
            +
          • +

            setLogProviders

            +
            public NetworkRestoreConfig setLogProviders(java.util.List<ReplicationNode> providers)
            +
            Sets the prioritized list of data nodes, either ELECTABLE or SECONDARY + members, used to select a node from which to obtain log files for the + NetworkRestore operation. If a list is supplied, NetworkRestore will + only use nodes from this list, trying each one in order. + +

            The default value is null. If a null value is configured for + NetworkRestore, it will choose the least busy data node with a current + set of logs, as the provider of log files.

            +
            +
            Parameters:
            +
            providers - the list of data nodes in priority order, or null
            +
            Returns:
            +
            this
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/NoConsistencyRequiredPolicy.html b/docs/java/com/sleepycat/je/rep/NoConsistencyRequiredPolicy.html new file mode 100644 index 0000000..0ebb55b --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/NoConsistencyRequiredPolicy.html @@ -0,0 +1,435 @@ + + + + + +NoConsistencyRequiredPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class NoConsistencyRequiredPolicy

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.NoConsistencyRequiredPolicy
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static java.lang.StringNAME +
          The name:"NoConsistencyRequiredPolicy" associated with this policy.
          +
          static NoConsistencyRequiredPolicyNO_CONSISTENCY +
          Convenience instance.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          NoConsistencyRequiredPolicy() +
          Create a NoConsistencyRequiredPolicy.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidensureConsistency(com.sleepycat.je.dbi.EnvironmentImpl repInstance) 
          booleanequals(java.lang.Object obj) 
          java.lang.StringgetName() +
          Returns the name:"NoConsistencyRequiredPolicy", associated with this policy.
          +
          longgetTimeout(java.util.concurrent.TimeUnit unit) +
          Always returns 0, no timeout is needed for this policy.
          +
          inthashCode() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            NAME

            +
            public static final java.lang.String NAME
            +
            The name:"NoConsistencyRequiredPolicy" associated with this policy. The name can be used when + constructing policy property values for use in je.properties files.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            NoConsistencyRequiredPolicy

            +
            public NoConsistencyRequiredPolicy()
            +
            Create a NoConsistencyRequiredPolicy.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            ensureConsistency

            +
            public void ensureConsistency(com.sleepycat.je.dbi.EnvironmentImpl repInstance)
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object obj)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            getTimeout

            +
            public long getTimeout(java.util.concurrent.TimeUnit unit)
            +
            Always returns 0, no timeout is needed for this policy.
            +
            +
            Specified by:
            +
            getTimeout in interface ReplicaConsistencyPolicy
            +
            Returns:
            +
            the timeout associated with the policy
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/NodeState.html b/docs/java/com/sleepycat/je/rep/NodeState.html new file mode 100644 index 0000000..99fdb6f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/NodeState.html @@ -0,0 +1,521 @@ + + + + + +NodeState (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class NodeState

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.NodeState
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class NodeState
        +extends java.lang.Object
        +
        The current state of a replication node and the application this node is + running in. +

        + This includes the following information: +

        +

          +
        • the replication state of this + node
        • +
        • the name of the current master, as known by this node
        • +
        • the time when this node joined the replication group
        • +
        • the latest transaction end (abort or commit) VLSN on this node
        • +
        • the transaction end (abort or commit) VLSN on the master known by this + node. The difference between transaction end VLSNs on the master versus on + this node gives an indication of how current this node's data is. The gap + in VLSN values indicates the number of replication records that must be + processed by this node, to be caught up to the master.
        • +
        • the number of feeders running on this node
        • +
        • the system load average for the last minute
        • +
        • + The appState field is a byte array meant to hold information generated by + the JE HA application, as provided by a registered AppStateMonitor. + Users are responsible for serializing and deserializing information for this + field.
        • +
        +
        +
        Since:
        +
        5.0
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the name of the node whose state is requested.
            +
            +
            Returns:
            +
            the name of the node.
            +
            +
          • +
          + + + +
            +
          • +

            getGroupName

            +
            public java.lang.String getGroupName()
            +
            Returns the name of the group which the node joins.
            +
            +
            Returns:
            +
            name of the group which the node joins
            +
            +
          • +
          + + + +
            +
          • +

            getNodeState

            +
            public ReplicatedEnvironment.State getNodeState()
            +
            Returns the replication state of + this node.
            +
            +
            Returns:
            +
            the replication state of this node.
            +
            +
          • +
          + + + +
            +
          • +

            getMasterName

            +
            public java.lang.String getMasterName()
            +
            Returns the name of the current + master known by this node.
            +
            +
            Returns:
            +
            the name of the current master
            +
            +
          • +
          + + + +
            +
          • +

            getJEVersion

            +
            public JEVersion getJEVersion()
            +
            Returns the current JEVersion that this node runs on.
            +
            +
            Returns:
            +
            the current JEVersion used by this node.
            +
            +
          • +
          + + + +
            +
          • +

            getJoinTime

            +
            public long getJoinTime()
            +
            Returns the time when this node joins the replication group.
            +
            +
            Returns:
            +
            the time when this node joins the group
            +
            +
          • +
          + + + +
            +
          • +

            getCurrentTxnEndVLSN

            +
            public long getCurrentTxnEndVLSN()
            +
            Returns the latest transaction end VLSN on this replication node.
            +
            +
            Returns:
            +
            the commit VLSN on this node
            +
            +
          • +
          + + + +
            +
          • +

            getKnownMasterTxnEndVLSN

            +
            public long getKnownMasterTxnEndVLSN()
            +
            Returns the transaction end VLSN on the master known by this node.
            +
            +
            Returns:
            +
            the known commit VLSN on master
            +
            +
          • +
          + + + +
            +
          • +

            getActiveFeeders

            +
            public int getActiveFeeders()
            +
            Returns the number of current active Feeders running on this node.
            +
            +
            Returns:
            +
            the number of running Feeders on the node
            +
            +
          • +
          + + + +
            +
          • +

            getLogVersion

            +
            public int getLogVersion()
            +
            Returns the log version of this node.
            +
            +
            Returns:
            +
            the log version of this node.
            +
            +
          • +
          + + + +
            +
          • +

            getAppState

            +
            public byte[] getAppState()
            +
            Returns the application state which is obtained via + AppStateMonitor.getAppState().
            +
            +
            Returns:
            +
            the application state
            +
            +
          • +
          + + + +
            +
          • +

            getSystemLoad

            +
            public double getSystemLoad()
            +
            Returns the system load average for the last minute.
            +
            +
            Returns:
            +
            the system average load, -1.0 if the node is running on jdk5 or + exceptions thrown while getting this information.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/NodeType.html b/docs/java/com/sleepycat/je/rep/NodeType.html new file mode 100644 index 0000000..2f08344 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/NodeType.html @@ -0,0 +1,516 @@ + + + + + +NodeType (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Enum NodeType

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<NodeType>
        • +
        • +
            +
          • com.sleepycat.je.rep.NodeType
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<NodeType>
        +
        +
        +
        +
        public enum NodeType
        +extends java.lang.Enum<NodeType>
        +
        The different types of nodes that can be in a replication group.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ARBITER 
          ELECTABLE +
          A full fledged member of the replication group with an associated + replicated environment that can serve as both a Master and a Replica.
          +
          MONITOR +
          A node that passively listens for the results of elections, but does not + participate in them.
          +
          SECONDARY +
          A member of the replication group with an associated replicated + environment that serves as a Replica but does not participate in + elections or durability decisions.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanisArbiter() +
          Returns whether this is the ARBITER type.
          +
          booleanisDataNode() +
          Returns whether this type represents a data node, either ELECTABLE or SECONDARY.
          +
          booleanisElectable() +
          Returns whether this is the ELECTABLE type.
          +
          booleanisMonitor() +
          Returns whether this is the MONITOR type.
          +
          booleanisSecondary() +
          Returns whether this is the SECONDARY type.
          +
          static NodeTypevalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static NodeType[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            MONITOR

            +
            public static final NodeType MONITOR
            +
            A node that passively listens for the results of elections, but does not + participate in them. It does not have a replicated environment + associated with it.
            +
            +
            See Also:
            +
            Monitor
            +
            +
          • +
          + + + +
            +
          • +

            ELECTABLE

            +
            public static final NodeType ELECTABLE
            +
            A full fledged member of the replication group with an associated + replicated environment that can serve as both a Master and a Replica.
            +
          • +
          + + + +
            +
          • +

            SECONDARY

            +
            public static final NodeType SECONDARY
            +
            A member of the replication group with an associated replicated + environment that serves as a Replica but does not participate in + elections or durability decisions. Secondary nodes are only remembered + by the group while they maintain contact with the Master. + +

            You can use SECONDARY nodes to: +

              +
            • Provide a copy of the data available at a distant location +
            • Maintain an extra copy of the data to increase redundancy +
            • Change the number of replicas to adjust to dynamically changing read + loads +
            +
            +
            Since:
            +
            6.0
            +
            +
          • +
          + + + +
            +
          • +

            ARBITER

            +
            public static final NodeType ARBITER
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static NodeType[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (NodeType c : NodeType.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static NodeType valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            isMonitor

            +
            public boolean isMonitor()
            +
            Returns whether this is the MONITOR type.
            +
            +
            Returns:
            +
            whether this is MONITOR
            +
            Since:
            +
            6.0
            +
            +
          • +
          + + + +
            +
          • +

            isElectable

            +
            public boolean isElectable()
            +
            Returns whether this is the ELECTABLE type.
            +
            +
            Returns:
            +
            whether this is ELECTABLE
            +
            Since:
            +
            6.0
            +
            +
          • +
          + + + +
            +
          • +

            isSecondary

            +
            public boolean isSecondary()
            +
            Returns whether this is the SECONDARY type.
            +
            +
            Returns:
            +
            whether this is SECONDARY
            +
            Since:
            +
            6.0
            +
            +
          • +
          + + + +
            +
          • +

            isDataNode

            +
            public boolean isDataNode()
            +
            Returns whether this type represents a data node, either ELECTABLE or SECONDARY.
            +
            +
            Returns:
            +
            whether this represents a data node
            +
            Since:
            +
            6.0
            +
            +
          • +
          + + + +
            +
          • +

            isArbiter

            +
            public boolean isArbiter()
            +
            Returns whether this is the ARBITER type.
            +
            +
            Returns:
            +
            whether this is ARBITER
            +
            Since:
            +
            6.0
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/QuorumPolicy.html b/docs/java/com/sleepycat/je/rep/QuorumPolicy.html new file mode 100644 index 0000000..393483f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/QuorumPolicy.html @@ -0,0 +1,385 @@ + + + + + +QuorumPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Enum QuorumPolicy

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<QuorumPolicy>
        • +
        • +
            +
          • com.sleepycat.je.rep.QuorumPolicy
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<QuorumPolicy>
        +
        +
        +
        +
        public enum QuorumPolicy
        +extends java.lang.Enum<QuorumPolicy>
        +
        The quorum policy determine the number of nodes that must participate to + pick the winner of an election, and therefore the master of the group. + The default quorum policy during the lifetime of the group is + QuorumPolicy.SIMPLE_MAJORITY. The only time that the application needs to + specify a specific quorum policy is at node startup time, by passing one + to the ReplicatedEnvironment constructor. + +

        Note that NodeType.SECONDARY nodes are not counted as part of + master election quorums.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ALL +
          All participants are required to vote.
          +
          SIMPLE_MAJORITY +
          A simple majority of participants is required to vote.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intquorumSize(int groupSize) +
          Returns the minimum number of nodes to needed meet the quorum policy.
          +
          static QuorumPolicyvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static QuorumPolicy[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            ALL

            +
            public static final QuorumPolicy ALL
            +
            All participants are required to vote.
            +
          • +
          + + + +
            +
          • +

            SIMPLE_MAJORITY

            +
            public static final QuorumPolicy SIMPLE_MAJORITY
            +
            A simple majority of participants is required to vote.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static QuorumPolicy[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (QuorumPolicy c : QuorumPolicy.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static QuorumPolicy valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            quorumSize

            +
            public int quorumSize(int groupSize)
            +
            Returns the minimum number of nodes to needed meet the quorum policy.
            +
            +
            Parameters:
            +
            groupSize - the number of election participants in the replication + group
            +
            Returns:
            +
            the number of nodes that are needed for a quorum for a group + with groupSize number of election participants
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicaConsistencyException.html b/docs/java/com/sleepycat/je/rep/ReplicaConsistencyException.html new file mode 100644 index 0000000..feb5144 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicaConsistencyException.html @@ -0,0 +1,364 @@ + + + + + +ReplicaConsistencyException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicaConsistencyException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class ReplicaConsistencyException
        +extends OperationFailureException
        +
        This exception is thrown by a Replica to indicate it could not meet the + consistency requirements as defined by the + ReplicaConsistencyPolicy in effect for the transaction, within + the allowed timeout period. +

        + A Replica will typically keep current with its Master. However, network + problems, excessive load on the Master, or Replica, may prevent the Replica + from keeping up and the Replica may fall further behind than is permitted by + its consistency policy. If the Replica cannot catch up in the time defined + by its ReplicaConsistencyPolicy, it will throw this exception + from the Environment.beginTransaction method, thus preventing the transaction from + accessing data that does not meet its consistency requirements. +

        + If this exception is encountered frequently, it indicates that the + consistency policy requirements are too strict and cannot be met routinely + given the load being placed on the system and the hardware resources that + are available to service the load. The exception may also indicate that + there is a network related issue that is preventing the Replica from + communicating with the master and keeping up with the replication stream. +

        + The application can choose to retry the transaction, until the underlying + system problem has been resolved. Or it can try relaxing the consistency + constraints, or choose the NoConsistencyRequiredPolicy so that the + constraints can be satisfied more easily. + For example, in a two node + replication group, if the primary goes down, the application may want + the secondary node to continue to service read requests, and will lower the + consistency requirement on that node in order to maintain read availability.

        +
        +
        See Also:
        +
        ReplicaConsistencyPolicy, +Managing Consistency, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          ReplicaConsistencyPolicygetConsistencyPolicy() +
          Returns the Replica consistency policy that could not be satisfied.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ReplicaConsistencyException

            +
            public ReplicaConsistencyException(java.lang.String message,
            +                                   ReplicaConsistencyPolicy consistencyPolicy)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getConsistencyPolicy

            +
            public ReplicaConsistencyPolicy getConsistencyPolicy()
            +
            Returns the Replica consistency policy that could not be satisfied.
            +
            +
            Returns:
            +
            the Replica consistency policy
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicaStateException.html b/docs/java/com/sleepycat/je/rep/ReplicaStateException.html new file mode 100644 index 0000000..7ffd707 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicaStateException.html @@ -0,0 +1,264 @@ + + + + + +ReplicaStateException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicaStateException

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicaWriteException.html b/docs/java/com/sleepycat/je/rep/ReplicaWriteException.html new file mode 100644 index 0000000..54cb137 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicaWriteException.html @@ -0,0 +1,272 @@ + + + + + +ReplicaWriteException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicaWriteException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class ReplicaWriteException
        +extends StateChangeException
        +
        This exception indicates that an update operation or transaction commit + or abort was attempted while in the + ReplicatedEnvironment.State.REPLICA state. The transaction is marked + as being invalid. +

        + The exception is the result of either an error in the application logic or + the result of a transition of the node from Master to Replica while a + transaction was in progress. +

        + The application must abort the current transaction and redirect all + subsequent update operations to the Master.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.State.html b/docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.State.html new file mode 100644 index 0000000..dffa9a4 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.State.html @@ -0,0 +1,518 @@ + + + + + +ReplicatedEnvironment.State (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Enum ReplicatedEnvironment.State

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<ReplicatedEnvironment.State>
        +
        +
        +
        Enclosing class:
        +
        ReplicatedEnvironment
        +
        +
        +
        +
        public static enum ReplicatedEnvironment.State
        +extends java.lang.Enum<ReplicatedEnvironment.State>
        +
        The replication node state determines the operations that the + application can perform against its replicated environment. + The method ReplicatedEnvironment.getState() returns the current state. +

        + When the first handle to a ReplicatedEnvironment is instantiated + and the node is bought up, the node usually establishes + MASTER or REPLICA state before returning from + the constructor. However, these states are actually preceeded by the + UNKNOWN state, which may be visible if the application has + configured a suitable ReplicationConfig.ENV_UNKNOWN_STATE_TIMEOUT. +

        + As the various remote nodes in the group become unavailable and + elections are held, the local node may change between + MASTER and REPLICA states, always with a + (usually brief) transition through UNKNOWN state. +

        + When the last handle to the environment is closed, the node transitions + to the DETACHED state. +

        + The state transitions visible to the application can be summarized by + the regular expression: +

        + [ MASTER | REPLICA | UNKNOWN ]+ DETACHED +
        + with the caveat that redundant "transitions" (MASTER to + MASTER, REPLICA to REPLICA, etc.) + never occur.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          DETACHED +
          The node is not associated with the group.
          +
          MASTER +
          The node is the unique master of the group and can both read and + write to its environment.
          +
          REPLICA +
          The node is a replica that is being updated by the master.
          +
          UNKNOWN +
          The node is not currently in contact with the master, but is actively + trying to establish contact with, or decide upon, a master.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            DETACHED

            +
            public static final ReplicatedEnvironment.State DETACHED
            +
            The node is not associated with the group. Its handle has been + closed. No operations can be performed on the environment when it is + in this state.
            +
          • +
          + + + +
            +
          • +

            UNKNOWN

            +
            public static final ReplicatedEnvironment.State UNKNOWN
            +
            The node is not currently in contact with the master, but is actively + trying to establish contact with, or decide upon, a master. While in + this state the node is restricted to performing just read operations + on its environment. In a functioning group, this state is + transitory.
            +
          • +
          + + + +
            +
          • +

            MASTER

            +
            public static final ReplicatedEnvironment.State MASTER
            +
            The node is the unique master of the group and can both read and + write to its environment. When the node transitions to the + state, the application running on the node must make provisions to + start processing application level write requests in addition to + read requests.
            +
          • +
          + + + +
            +
          • +

            REPLICA

            +
            public static final ReplicatedEnvironment.State REPLICA
            +
            The node is a replica that is being updated by the master. It is + restricted to reading its environment. When the node + transitions to this state, the application running on the node must + make provisions to ensure that it does not write to the + environment. It must arrange for all write requests to be routed to + the master.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static ReplicatedEnvironment.State[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (ReplicatedEnvironment.State c : ReplicatedEnvironment.State.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static ReplicatedEnvironment.State valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          + + + +
            +
          • +

            isMaster

            +
            public final boolean isMaster()
            +
            +
            Returns:
            +
            true if the node is a Master when in this state
            +
            +
          • +
          + + + +
            +
          • +

            isReplica

            +
            public final boolean isReplica()
            +
            +
            Returns:
            +
            true if the node is a Replica when in this state
            +
            +
          • +
          + + + +
            +
          • +

            isDetached

            +
            public final boolean isDetached()
            +
            +
            Returns:
            +
            true if the node is disconnected from the replication + group when in this state.
            +
            +
          • +
          + + + +
            +
          • +

            isUnknown

            +
            public final boolean isUnknown()
            +
            +
            Returns:
            +
            true if the node's state is unknown, and it is attempting + to transition to Master or Replica.
            +
            +
          • +
          + + + +
            +
          • +

            isActive

            +
            public final boolean isActive()
            +
            +
            Returns:
            +
            true if the node is currently participating in the group as + a Replica or a Master
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.html b/docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.html new file mode 100644 index 0000000..d74ac7a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicatedEnvironment.html @@ -0,0 +1,1293 @@ + + + + + +ReplicatedEnvironment (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicatedEnvironment

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class ReplicatedEnvironment
        +extends Environment
        +
        A replicated database environment that is a node in a replication + group. Please read the Berkeley DB JE High + Availability Overview for an introduction to basic concepts and key + terminology. +

        + Berkeley DB JE High Availability (JE HA) is a replicated, embedded database + management system which provides fast, reliable, and scalable data + management. JE HA enables replication of an environment across a Replication + Group. A ReplicatedEnvironment is a single node in the replication group. +

        + ReplicatedEnvironment extends Environment. All database operations + are executed in the same fashion in both replicated and non replicated + applications, using Environment methods. A ReplicatedEnvironment + must be transactional. All replicated databases created in the replicated + environment must be transactional as well. However, non-replicated databases may be used as well. +

        + ReplicatedEnvironment handles are analogous to Environment + handles. A replicated environment handle is a ReplicatedEnvironment + instance; multiple ReplicatedEnvironment instances may be created for the + same physical directory. In other words, more than one ReplicatedEnvironment + handle may be open at a time for a given environment. +

        +

        + A ReplicatedEnvironment joins its replication group when it is instantiated. + When the constructor returns, the node will have established contact with + the other members of the group and will be ready to service operations. The + life + cycle overview is useful for understanding replication group creation. +

        + The membership of a replication group is dynamically defined. The group + comes into being when ReplicatedEnvironments that are configured as members + of a group are created and discover each other. ReplicatedEnvironments are + identified by a group name, a node name, and a hostname:port + value. Membership information for electable and monitor nodes is stored in + an internal, replicated database available to electable and secondary nodes. +

        + To start a node and join a group, instantiate a ReplicatedEnvironment. The + very first instantiation of a node differs slightly from all future + instantiations. A brand new, empty node does not yet have access to the + membership database, so it must discover the group with the aid of a + helper node, which is a fellow member. If this is the very first node of the + entire group, there is no available helper. Instead, the helper host address + to use is the node's own address. The example below takes the simple + approach of creating a replication group by starting up a node that will act + as the first master, though it is not necessary to follow this order. + + Configuring Replicated Environments describes group startup in greater + detail. +

        + To create the master node in a brand new group, instantiate a + ReplicatedEnvironment this way: +

        + EnvironmentConfig envConfig = new EnvironmentConfig();
        + envConfig.setAllowCreate(true);
        + envConfig.setTransactional(true);
        +
        + // Identify the node
        + ReplicationConfig repConfig = new ReplicationConfig();
        + repConfig.setGroupName("PlanetaryRepGroup");
        + repConfig.setNodeName("Mercury");
        + repConfig.setNodeHostPort("mercury.acme.com:5001");
        +
        + // This is the first node, so its helper is itself
        + repConfig.setHelperHosts("mercury.acme.com:5001");
        +
        + ReplicatedEnvironment repEnv =
        +     new ReplicatedEnvironment(envHome, repConfig, envConfig);
        + 
        +

        + To create a new node when there are other existing group members, + set a helper address which points to an existing node in the group. A simple + way to bring up a new group is to "chain" the new nodes by having the + helpers reference a previously created node. +

        + EnvironmentConfig envConfig = new EnvironmentConfig();
        + envConfig.setAllowCreate(true);
        + envConfig.setTransactional(true);
        +
        + // Identify the node
        + ReplicationConfig repConfig =
        +     new ReplicationConfig("PlanetaryRepGroup",
        +                           "Jupiter",
        +                           "jupiter.acme.com:5002");
        +
        + // Use the node at mercury.acme.com:5001 as a helper to find the rest
        + // of the group.
        + repConfig.setHelperHosts("mercury.acme.com:5001");
        +
        + ReplicatedEnvironment repEnv =
        +     new ReplicatedEnvironment(envHome, repConfig, envConfig);
        + 
        +

        + In these examples, node Mercury was configured as its own helper, and + becomes the first master. The next nodes were configured to use Mercury as + their helper, and became replicas. It is also possible to start these in + reverse order, bringing mercury up last. In that case, the earlier nodes + will block until a helper is awake and can service their requests for group + metadata. +

        + Creating a ReplicatedEnvironment for an existing environment requires + less configuration. The call + to EnvironmentConfig.setAllowCreate() is eliminated to guard + against the unintentional creation of a new environment. Also, there is no + need to set a helper host address, because the environment exists and has + access to the shared, persistent membership information. +

        + EnvironmentConfig envConfig = new EnvironmentConfig();
        + envConfig.setTransactional(true);
        + ReplicationConfig repConfig =
        +     new ReplicationConfig("PlanetaryRepGroup",
        +                           "Mercury",
        +                           "mercury.acme.com:5001");
        +
        + ReplicatedEnvironment repEnv =
        +     new ReplicatedEnvironment(envHome, repConfig, envConfig);
        + 
        +

        + See ReplicationGroupAdmin for information on how to remove nodes from the + replication group. + +

        + ReplicatedEnvironment properties can be set via the the <environmentHome>/je.properties file, just like Environment + properties. They follow the same property value precedence rules. + +

        + A replicated environment directory can only be accessed by a read write + ReplicatedEnvironment handle or a read only Environment handle. In + the current release, there is an additional restriction that a read only + Environment is only permitted when the directory is not also + accessed from a different process by a read/write ReplicatedEnvironment. If + a read/write ReplicatedEnvironment and a read only Environment from + two different processes concurrently access an environment directory, there + is the small possibility that the read only Environment may see + see exceptions thrown about an inconsistent log if the ReplicatedEnvironment + executes certain kinds of failover. There is no problem if the Environment and ReplicatedEnvironment are in the same process, or are not + concurrent. +

        + JE HA prohibits opening a replicated environment directory with a read/write + Environment handle, because from the group's perspective, + unreplicated updates to a single node would cause data inconsistency. To + use an existing, non-replicated environment to bootstrap a replication + group, use DbEnableReplication to do a one + time conversion of the directory. +

        + All other database objects, such as Database or + Cursor (when using the Base API) or EntityStore or PrimaryIndex (when using the Direct Persistence + Layer) should be created, used and closed before calling close(). + +

        Replicated environments can be created with node type NodeType.ELECTABLE or NodeType.SECONDARY. ELECTABLE nodes can be + masters or replicas, and participate in both master elections and commit + durability decisions. + +

        SECONDARY nodes can only be replicas, not masters, and do not participate + in either elections or durability decisions. SECONDARY nodes can be used to + increase the available number of read replicas without changing the election + or durability quorum of the group, and without requiring communication with + the secondaries during master elections or transaction commits. As a result, + SECONDARY nodes are a good choice for nodes that are connected to the other + nodes in the group by high latency network connections, for example over + long distance networks. SECONDARY nodes maintain replication streams with + the replication group master to update the data contents of their + environment. + +

        You can use SECONDARY nodes to: +

          +
        • Provide a copy of the data available at a distant location +
        • Maintain an extra copy of the data to increase redundancy +
        • Change the number of replicas to adjust to dynamically changing read + loads +
        + +

        Membership information for SECONDARY nodes is not stored persistently, so + their membership is only known to the master, and only while the nodes + remain connected to the master. Because a SECONDARY node cannot become a + master, it will not act as master even if it is the first node created for + the group. + +

        Non-replicated Databases in a Replicated + Environment

        + + A database or entity store in a replicated environment is replicated by + default, but may be explicitly configured as non-replicated using + DatabaseConfig.setReplicated(boolean) or + StoreConfig.setReplicated(boolean). Such + non-replicated databases may be transactional or non-transactional + (including deferred-write and temporary). The special considerations for + using non-replicated databases in a replicated environment are described + below. +

        + The data in a non-replicated database is not guaranteed to be persistent, + for two reasons. +

          +
        • + When a hard recovery occurs as part of an election, some data at the end of + the transaction log may be lost. For a replicated database this data is + automatically recovered from other members of the group, but for a + non-replicated database it is not. +
        • +
        • + When a node's contents are replaced via network restore or by otherwise + copying the transaction log from another node, all previously existing + non-replicated databases on that node are destroyed, and the non-replicated + databases from the source node are copied along with the replicated + data. The non-replicated databases copied from the source node will be in + whatever state they were in at the time of the copy. +
        • +
        +

        + Therefore, non-replicated databases are intended to be used primarily for + persistent caching and other non-critical local storage. The application + is responsible for maintaining the state of the database and handling data + loss after one the events described above. +

        + To perform write operations on a non-replicated database, special + considerations are necessary for user-supplied transactions. Namely, the + transaction must be configured for + local-write. A given transaction may be used to write to either replicated + databases or non-replicated databases, but not both. +

        + For auto-commit transactions (when the Transaction parameter is null), the + local-write setting is automatically set to correspond to whether the + database is replicated. With auto-commit, local-write is always true for a + non-replicated database, and always false for a replicated database. +

        + A local-write transaction automatically uses + Durability.ReplicaAckPolicy.NONE. + A local-write transaction on a Master will thus not be held up, or + throw InsufficientReplicasException, if the + Master is not in contact with a sufficient number of Replicas at the + time the transaction is initiated. +

        + For read operations, a single transaction may be used to read any + combination of replicated and non-replicated databases. If only read + operations are performed, it is normally desirable to configure a user + supplied transaction as + read-only. + Like a local-write transaction, a read-only transaction automatically uses + Durability.ReplicaAckPolicy.NONE. +

        + For user-supplied transactions, note that even when accessing only + non-replicated databases, group consistency checks are performed by + default. In this case it is normally desirable to disable consistency + checks by calling + TransactionConfig.setConsistencyPolicy(com.sleepycat.je.ReplicaConsistencyPolicy) with + NoConsistencyRequiredPolicy.NO_CONSISTENCY. This allows the + non-replicated databases to be accessed regardless of the state of the other + members of the group and the network connections to them. When auto-commit + is used (when the Transaction parameter is null) with a non-replicated + database, consistency checks are automatically disabled.

        +
        +
        Since:
        +
        4.0
        +
        See Also:
        +
        Environment, +Replication First Steps
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ReplicatedEnvironment

            +
            public ReplicatedEnvironment(java.io.File envHome,
            +                             ReplicationConfig repConfig,
            +                             EnvironmentConfig envConfig,
            +                             ReplicaConsistencyPolicy consistencyPolicy,
            +                             QuorumPolicy initialElectionPolicy)
            +                      throws EnvironmentNotFoundException,
            +                             EnvironmentLockedException,
            +                             InsufficientLogException,
            +                             ReplicaConsistencyException,
            +                             java.lang.IllegalArgumentException
            +
            Creates a replicated environment handle and starts participating in the + replication group as either a Master or a Replica. The node's state is + determined when it joins the group, and mastership is not preconfigured. + If the group has no current master and the node has the default node + type of NodeType.ELECTABLE, then creation of a handle will + trigger an election to determine whether this node will participate as a + Master or a Replica. +

            + If the node participates as a Master, the constructor will return after + a sufficient number of Replicas, in accordance with the + initialElectionPolicy argument, have established contact with + the Master. +

            + If the node participates as a Replica, it will become consistent in + accordance with the consistencyPolicy argument before returning + from the constructor. +

            + If an election cannot be concluded in the time period defined by ReplicationConfig.ENV_SETUP_TIMEOUT, by default it will throw an UnknownMasterException. This behavior can be overridden via the ReplicationConfig.ENV_UNKNOWN_STATE_TIMEOUT to permit the creation of + the handle in the ReplicatedEnvironment.State.UNKNOWN state. A handle in UNKNOWN state + can be used to service read operations with an appropriately relaxed + consistency policy. Note that these timeouts do not apply when opening + an environment for the very first time. In the first time case, if the + node is not the only group member, or if it is a SECONDARY node, the + constructor will wait indefinitely until it can contact an existing + group member. +

            + A brand new node will always join an existing group as a Replica, unless + it is the very first electable node that is creating the group. In that + case it joins as the Master of the newly formed singleton group. A brand + new node must always specify one or more active helper nodes via the + ReplicationMutableConfig.setHelperHosts(String) method, or via the + <environment home>/je.properties file. If this is the + very first member of a nascent group, it must specify just itself as the + helper. +

            + There are special considerations to keep in mind when a replication + group is started and elections are first held to determine a master. The + default QuorumPolicy.SIMPLE_MAJORITY calls + for a simple majority vote. If the group members were previously created + and populated, the default election policy may result in the election of + a master that may not have the most up to date copy of the environment. + This could happen if the best qualified node is slow to start up; it's + possible that by the time it's ready to participate in an election, the + election has already have completed with a simple majority. +

            + To avoid this possibility, the method has a parameter + initialElectionPolicy, which can be used to specify + QuorumPolicy.ALL, which will cause the + elections to wait until all electable nodes can vote. By ensuring that + all the nodes can vote, the best possible node is chosen to be the + master at group startup. +

            + Note that it is the application's responsibility to ensure that all + electable nodes coordinate their choice of initialElectionPolicy so that + the very first elections held when a group is brought up use the same + value for this parameter. This parameter is only used for the first + election. After the first election has been held and the group is + functioning, subsequent elections do not require participation of all + the nodes. A simple majority is sufficient to elect the node with the + most up to date environment as the master. +

            +
            +
            Parameters:
            +
            envHome - The environment's home directory.
            +
            repConfig - replication configurations. If null, the default + replication configurations are used.
            +
            envConfig - environment configurations for this node. If null, the + default environment configurations are used.
            +
            consistencyPolicy - the consistencyPolicy used by the Replica at + startup to make its environment current with respect to the master. This + differs from the consistency policy specified + ReplicationConfig.setConsistencyPolicy(com.sleepycat.je.ReplicaConsistencyPolicy) because it is used only + at construction, when the node joins the group for the first time. The + consistency policy set in ReplicationConfig is used any time a + policy is used after node startup, such as at transaction begins.
            +
            initialElectionPolicy - the policy to use when holding the initial + election.
            +
            Throws:
            +
            RestartRequiredException - if some type of corrective action is + required. The subclasses of this exception provide further details.
            +
            ReplicaConsistencyException - if it is a Replica and cannot + satisfy the specified consistency policy within the consistency timeout + period
            +
            UnknownMasterException - if the + ReplicationConfig.ENV_UNKNOWN_STATE_TIMEOUT has a zero value and + the node cannot join the group in the time period specified by the + ReplicationConfig.ENV_SETUP_TIMEOUT property. The node may be + unable to join the group because the Master could not be determined due + to a lack of sufficient nodes as required by the election policy, or + because a master was present but lacked a + QuorumPolicy.SIMPLE_MAJORITY needed to update the environment + with information about this node, if it's a new node and is joining the + group for the first time.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            EnvironmentLockedException - when an environment cannot be opened + for write access because another process has the same environment open + for write access. Warning: This exception should be + handled when an environment is opened by more than one process.
            +
            VersionMismatchException - when the existing log is not compatible + with the version of JE that is running. This occurs when a later version + of JE was used to create the log. Warning: This + exception should be handled when more than one version of JE may be used + to access an environment.
            +
            java.lang.UnsupportedOperationException - if the environment exists and has + not been enabled for replication.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid EnvironmentConfig parameter.
            +
            EnvironmentNotFoundException
            +
            InsufficientLogException
            +
            +
          • +
          + + + + +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            getState

            +
            public ReplicatedEnvironment.State getState()
            +                                     throws DatabaseException
            +
            Returns the current state of the node associated with this replication + environment. See ReplicatedEnvironment.State for a description of node states. +

            + If the caller's intent is to track the state of the node, + StateChangeListener may be a more convenient and efficient + approach, rather than using getState() directly.

            +
            +
            Returns:
            +
            the current replication state associated with this node
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getGroup

            +
            public ReplicationGroup getGroup()
            +                          throws DatabaseException
            +
            Returns a description of the replication group as known by this node. + The replicated group metadata is stored in a replicated database and + updates are propagated by the current master node to all replicas. If + this node is not the master, it is possible for its description of the + group to be out of date, and it will not include information about + SECONDARY nodes.
            +
            +
            Returns:
            +
            the group description
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws DatabaseException
            +
            Close this ReplicatedEnvironment and release any resources used by the + handle. + +

            + When the last handle is closed, allocated resources are freed, and + daemon threads are stopped, even if they are performing work. The node + ceases participation in the replication group. If the node was currently + the master, the rest of the group will hold an election. If a quorum of + nodes can participate in the election, a new master will be chosen. +

            + The ReplicatedEnvironment should not be closed while any other type of + handle that refers to it is not yet closed. For example, the + ReplicatedEnvironment should not be closed while there are open Database + instances, or while transactions in the environment have not yet + committed or aborted. Specifically, this includes Database, Cursor and Transaction handles. +

            + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Overrides:
            +
            close in class Environment
            +
            Throws:
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            setStateChangeListener

            +
            public void setStateChangeListener(StateChangeListener listener)
            +                            throws DatabaseException
            +
            Sets the listener used to receive asynchronous replication node state + change events. Note that there is one listener per replication node, not + one per handle. Invoking this method replaces the previous Listener. + + Invoking this method typically results in an immediate callback to the + application via the StateChangeListener.stateChange(com.sleepycat.je.rep.StateChangeEvent) method, so + that the application is made aware of the existing state of the + node at the time StateChangeListener is first established.
            +
            +
            Parameters:
            +
            listener - the state change listener.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getStateChangeListener

            +
            public StateChangeListener getStateChangeListener()
            +                                           throws DatabaseException
            +
            Returns the listener used to receive asynchronous replication node state + change events. A StateChangeListener provides the replication + application with an asynchronous mechanism for tracking the State of the replicated environment. +

            + Note that there is one listener per replication node, not one per + ReplicatedEnvironment handle.

            +
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            getRepConfig

            +
            public ReplicationConfig getRepConfig()
            +                               throws DatabaseException
            +
            Return the replication configuration that has been used to create this + handle. This is derived from the original configuration argument, after + cloning a copy to keep it distinct from the user's instance, applying + je.properties settings, and validating against the underlying + node.
            +
            +
            Returns:
            +
            this handle's configuration.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getRepStats

            +
            public ReplicatedEnvironmentStats getRepStats(StatsConfig config)
            +                                       throws DatabaseException
            +
            Returns statistics associated with this environment. See ReplicatedEnvironmentStats for the kind of information available.
            +
            +
            Parameters:
            +
            config - is used to specify attributes such as whether the stats + should be cleared, whether the complete set of stats should be obtained, + etc.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            printStartupInfo

            +
            public void printStartupInfo(java.io.PrintStream out)
            +
            Print a detailed report about the costs of different phases of + environment startup. This report is by default logged to the je.info + file if startup takes longer than je.env.startupThreshold.
            +
            +
            Overrides:
            +
            printStartupInfo in class Environment
            +
            +
          • +
          + + + +
            +
          • +

            shutdownGroup

            +
            public void shutdownGroup(long replicaShutdownTimeout,
            +                          java.util.concurrent.TimeUnit unit)
            +                   throws java.lang.IllegalStateException
            +
            Closes this handle and shuts down the Replication Group by forcing all + active Replicas to exit. +

            + This method must be invoked on the node that's currently the Master + after all other outstanding handles have been closed. +

            + The Master waits for all active Replicas to catch up so that they have a + current set of logs, and then shuts them down. The Master will wait for + a maximum of replicaShutdownTimeout for a Replica to catch + up. If the Replica has not caught up in this time period it will force + the Replica to shut down before it is completely caught up. A negative + or zero replicaShutdownTimeout value will result in an + immediate shutdown without waiting for lagging Replicas to catch up. + Nodes that are currently inactive cannot be contacted by the Master, as + a consequence, their state is not impacted by the shutdown. +

            + The shutdown operation will close this handle on the Master node. The + environments on Replica nodes will be invalidated, and attempts to use + those handles will result in a GroupShutdownException being + thrown. The application is responsible for closing the remaining handles + on the Replica.

            +
            +
            Parameters:
            +
            replicaShutdownTimeout - the maximum amount of time the Master + waits for a Replica to shutdown.
            +
            unit - the time unit associated with the + replicaShutdownTimeout
            +
            Throws:
            +
            java.lang.IllegalStateException - if the method is invoked on a node that's + not currently the Master, or there are other open handles to this + Environment.
            +
            +
          • +
          + + + +
            +
          • +

            registerAppStateMonitor

            +
            public void registerAppStateMonitor(AppStateMonitor appStateMonitor)
            +                             throws java.lang.IllegalStateException
            +
            Registers an AppStateMonitor to receive the application state + which this ReplicatedEnvironment is running in. Note that there + is only one AppStateMonitor per replication node, not one + per handle. Invoking this method replaces the previous + AppStateMonitor. +

            + After registration, the application state can be returned by invoking + ReplicationGroupAdmin.getNodeState(com.sleepycat.je.rep.ReplicationNode, int).

            +
            +
            Parameters:
            +
            appStateMonitor - the user implemented AppStateMonitor
            +
            Throws:
            +
            java.lang.IllegalStateException - if this handle or the underlying + environment has already been closed.
            +
            +
          • +
          + + + +
            +
          • +

            transferMaster

            +
            public java.lang.String transferMaster(java.util.Set<java.lang.String> replicas,
            +                                       int timeout,
            +                                       java.util.concurrent.TimeUnit timeUnit)
            +
            Transfers the current master state from this node to one of the + electable replicas supplied in the argument list. The replica that is + actually chosen to be the new master is the one with which the Master + Transfer can be completed most rapidly. The transfer operation ensures + that all changes at this node are available at the new master upon + conclusion of the operation. +

            + The following sequence of steps is used to accomplish the transfer: +

              +
            1. The master first waits for at least one replica, from + amongst the supplied Set of candidate replicas, to + become reasonably current. It may have to wait for at least + one of the replicas to establish a feeder, if none of them are + currently connected to the master. "Reasonably current" means + that the replica is close enough to the end of the transaction + stream that it has managed to acknowledge a transaction within + the time that the commit thread is still awaiting + acknowledgments. If the candidate replicas are working + through a long backlog after having been disconnected, this can + take some time, so the timeout value should be chosen to allow + for this possibility. + +
            2. The master blocks new transactions from being committed or + aborted. + +
            3. The master now waits for one of the candidate replicas to + become fully current (completely caught up with the end of the + log on the master). The first replica that becomes current is + the one that is chosen to become the new master. This second + wait period is expected to be brief, since it only has to wait + until transactions that were committed in the interval between + step 1) and step 2) have been acknowledged by a replica. + +
            4. The master sends messages to all other nodes announcing the chosen + replica as the new master. This node will eventually become a replica, + and any subsequent attempt commit or abort existing transactions, or to + do write operations will result in a ReplicaWriteException. + +
            5. The current master releases the transactions that were blocked in + step 2) allowing them to proceed. The released transactions will fail + with ReplicaWriteException since the environment has become a + replica. +
            +
            +
            Parameters:
            +
            replicas - the set of replicas to be considered when choosing the + new master. The method returns immediately if this node is a member of + the set.
            +
            timeout - the amount of time to allow for the transfer to be + accomplished. A MasterTransferFailureException is thrown if the + transfer is not accomplished within this timeout period.
            +
            timeUnit - the time unit associated with the timeout
            +
            Returns:
            +
            the name of the replica that was chosen to be the new master + from amongst the set of supplied replicas
            +
            Throws:
            +
            MasterTransferFailureException - if the master transfer operation + fails
            +
            java.lang.IllegalArgumentException - if any of the named replicas is not a + member of the replication group or is not of type + NodeType.ELECTABLE
            +
            java.lang.IllegalStateException - if this node is not currently the master, + or this handle or the underlying environment has already been closed.
            +
            +
          • +
          + + + +
            +
          • +

            transferMaster

            +
            public java.lang.String transferMaster(java.util.Set<java.lang.String> replicas,
            +                                       int timeout,
            +                                       java.util.concurrent.TimeUnit timeUnit,
            +                                       boolean force)
            +
            Transfers the current master state from this node to one of the replicas + supplied in the argument list.
            +
            +
            Parameters:
            +
            force - true if this request should supersede and cancel any + currently pending Master Transfer operation
            +
            See Also:
            +
            transferMaster(Set, int, TimeUnit)
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicatedEnvironmentStats.html b/docs/java/com/sleepycat/je/rep/ReplicatedEnvironmentStats.html new file mode 100644 index 0000000..64dd086 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicatedEnvironmentStats.html @@ -0,0 +1,1329 @@ + + + + + +ReplicatedEnvironmentStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicatedEnvironmentStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.ReplicatedEnvironmentStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class ReplicatedEnvironmentStats
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Statistics for a replicated environment. +

        + The statistics are logically grouped into four categories. Viewing the + statistics through toString() displays + the values in these categories, as does viewing the stats through the RepJEMonitor + mbean. Viewing the stats with toStringVerbose() will provide more detailed + descriptions of the stats and stat categories. +

        + The current categories are: +

          +
        • FeederManager: A feed is the replication + stream between a master and replica. The current number of feeders + gives a sense of the connectivity of the replication group. +
        • +
        • BinaryProtocol: These statistics center on the network traffic + engendered by the replication stream, and provide a sense of the network + bandwidth seen by the replication group. +
        • +
        • Replay: The act of receiving and applying the replication stream + at the Replica node is called Replay. These stats give a sense of how much + load the replica node is experiencing when processing the traffic from the + replication group. +
        • +
        • ConsistencyTracker: The tracker is invoked when consistency + policies are used at a replica node. This provides a measure of delays + experienced by read requests at a replica, in order to conform with the + consistency specified by the application. +
        • +
        +
        +
        See Also:
        +
        Viewing + Statistics with JConsole, +Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNFeedersCreated

            +
            public int getNFeedersCreated()
            +
            The number of Feeder threads since this node was started. A Master + supplies the Replication Stream to a Replica via a Feeder thread. The + Feeder thread is created when a Replica connects to the node and is + shutdown when the connection is terminated.
            +
          • +
          + + + +
            +
          • +

            getNFeedersShutdown

            +
            public int getNFeedersShutdown()
            +
            The number of Feeder threads that were shut down, either because this + node, or the Replica terminated the connection.
            +
            +
            See Also:
            +
            getNFeedersCreated()
            +
            +
          • +
          + + + +
            +
          • +

            getNMaxReplicaLag

            +
            public long getNMaxReplicaLag()
            +
            The lag (in VLSNs) associated with the replica that's farthest behind in + replaying the replication stream.
            +
          • +
          + + + +
            +
          • +

            getNMaxReplicaLagName

            +
            public java.lang.String getNMaxReplicaLagName()
            +
            The name of the replica that's farthest behind in replaying the + replication stream.
            +
          • +
          + + + +
            +
          • +

            getReplicaDelayMap

            +
            public java.util.SortedMap<java.lang.String,java.lang.Long> getReplicaDelayMap()
            +
            Returns a map from replica node name to the delay, in milliseconds, + between when a transaction was committed on the master and when the + master learned that the transaction was processed on the replica, if + known. Returns an empty map if this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getReplicaLastCommitTimestampMap

            +
            public java.util.SortedMap<java.lang.String,java.lang.Long> getReplicaLastCommitTimestampMap()
            +
            Returns a map from replica node name to the commit timestamp of the last + committed transaction that was processed on the replica, if known. + Returns an empty map if this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getReplicaLastCommitVLSNMap

            +
            public java.util.SortedMap<java.lang.String,java.lang.Long> getReplicaLastCommitVLSNMap()
            +
            Returns a map from replica node name to the VLSN of the last committed + transaction that was processed on the replica, if known. Returns an + empty map if this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getReplicaVLSNLagMap

            +
            public java.util.SortedMap<java.lang.String,java.lang.Long> getReplicaVLSNLagMap()
            +
            Returns a map from replica node name to the lag, in VLSNs, between the + replication state of the replica and the master, if known. Returns an + empty map if this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getReplicaVLSNRateMap

            +
            public java.util.SortedMap<java.lang.String,java.lang.Long> getReplicaVLSNRateMap()
            +
            Returns a map from replica node name to a moving average of the rate, in + VLSNs per minute, that the replica is processing replication data, if + known. Returns an empty map if this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getNTxnsAcked

            +
            public long getNTxnsAcked()
            +
            The number of transactions that were successfully acknowledged based + upon the Durability.ReplicaAckPolicy policy associated with the + transaction commit.
            +
          • +
          + + + + + + + +
            +
          • +

            getTotalTxnMs

            +
            public long getTotalTxnMs()
            +
            The total time in milliseconds spent in replicated transactions. This + represents the time from the start of the transaction until its + successful commit and acknowledgment. It includes the time spent + waiting for transaction commit acknowledgments, as determined by + getAckWaitMs().
            +
          • +
          + + + +
            +
          • +

            getAckWaitMs

            +
            public long getAckWaitMs()
            +
            The total time in milliseconds that the master spent waiting for the + Durability.ReplicaAckPolicy to be satisfied during successful transaction + commits.
            +
            +
            See Also:
            +
            getTotalTxnMs()
            +
            +
          • +
          + + + +
            +
          • +

            getLastCommitVLSN

            +
            public long getLastCommitVLSN()
            +
            The VLSN of the last committed transaction on the master, or 0 if not + known or this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getLastCommitTimestamp

            +
            public long getLastCommitTimestamp()
            +
            The commit timestamp of the last committed transaction on the master, or + 0 if not known or this node is not the master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getVLSNRate

            +
            public long getVLSNRate()
            +
            A moving average of the rate replication data is being generated by the + master, in VLSNs per minute, or 0 if not known or this node is not the + master.
            +
            +
            Since:
            +
            6.3.0
            +
            +
          • +
          + + + +
            +
          • +

            getNReplayCommits

            +
            public long getNReplayCommits()
            +
            The number of commit log records that were replayed by this node when + it was a Replica. There is one commit record record for each actual + commit on the Master.
            +
          • +
          + + + +
            +
          • +

            getNReplayCommitAcks

            +
            public long getNReplayCommitAcks()
            +
            The number of commit log records that needed to be acknowledged to the + Master by this node when it was a Replica. The rate of change of this + statistic, will show a strong correlation with that of + NReplayCommits statistic, if the Durability + policy used by transactions on the master calls for transaction commit + acknowledgments and the Replica is current with respect to the Master.
            +
          • +
          + + + +
            +
          • +

            getNReplayCommitSyncs

            +
            public long getNReplayCommitSyncs()
            +
            The number of commitSync() calls executed when satisfying transaction + commit acknowledgment requests from the Master.
            +
          • +
          + + + +
            +
          • +

            getNReplayCommitNoSyncs

            +
            public long getNReplayCommitNoSyncs()
            +
            The number of commitNoSync() calls executed when satisfying transaction + commit acknowledgment requests from the Master.
            +
          • +
          + + + +
            +
          • +

            getNReplayCommitWriteNoSyncs

            +
            public long getNReplayCommitWriteNoSyncs()
            +
            The number of commitNoSync() calls executed when satisfying transaction + commit acknowledgment requests from the Master.
            +
          • +
          + + + +
            +
          • +

            getNReplayAborts

            +
            public long getNReplayAborts()
            +
            The number of abort records which were replayed while the node was in + the Replica state.
            +
          • +
          + + + +
            +
          • +

            getNReplayNameLNs

            +
            public long getNReplayNameLNs()
            +
            The number of NameLN records which were replayed while the node was in + the Replica state.
            +
          • +
          + + + +
            +
          • +

            getNReplayLNs

            +
            public long getNReplayLNs()
            +
            The number of data records (creation, update, deletion) which were + replayed while the node was in the Replica state.
            +
          • +
          + + + +
            +
          • +

            getReplayElapsedTxnTime

            +
            public long getReplayElapsedTxnTime()
            +
            The total elapsed time in milliseconds spent replaying committed and + aborted transactions.
            +
          • +
          + + + +
            +
          • +

            getNReplayGroupCommitTimeouts

            +
            public long getNReplayGroupCommitTimeouts()
            +
            The number of group commits that were initiated due to the + group timeout + interval being exceeded.
            +
            +
            Since:
            +
            5.0.76
            +
            +
          • +
          + + + +
            +
          • +

            getNReplayGroupCommitMaxExceeded

            +
            public long getNReplayGroupCommitMaxExceeded()
            +
            The number of group commits that were initiated due the + max group size being + exceeded.
            +
            +
            Since:
            +
            5.0.76
            +
            +
          • +
          + + + +
            +
          • +

            getNReplayGroupCommitTxns

            +
            public long getNReplayGroupCommitTxns()
            +
            The number of replay transaction commits that were part of a group + commit operation.
            +
            +
            Since:
            +
            5.0.76
            +
            +
          • +
          + + + +
            +
          • +

            getNReplayGroupCommits

            +
            public long getNReplayGroupCommits()
            +
            The number of group commit operations.
            +
            +
            Since:
            +
            5.0.76
            +
            +
          • +
          + + + +
            +
          • +

            getReplayMinCommitProcessingNanos

            +
            public long getReplayMinCommitProcessingNanos()
            +
            The minimum time taken to replay a transaction commit operation.
            +
          • +
          + + + +
            +
          • +

            getReplayMaxCommitProcessingNanos

            +
            public long getReplayMaxCommitProcessingNanos()
            +
            The maximum time taken to replay a transaction commit operation.
            +
          • +
          + + + +
            +
          • +

            getReplayTotalCommitProcessingNanos

            +
            public long getReplayTotalCommitProcessingNanos()
            +
            The total time spent to replay all commit operations.
            +
          • +
          + + + +
            +
          • +

            getNProtocolBytesRead

            +
            public long getNProtocolBytesRead()
            +
            The number of bytes of Replication Stream read over the network. It does + not include the TCP/IP overhead. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the sum total of all Feeder related + network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getNProtocolMessagesRead

            +
            public long getNProtocolMessagesRead()
            +
            The number of Replication Stream messages read over the network. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the sum total of all Feeder related + network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getNProtocolBytesWritten

            +
            public long getNProtocolBytesWritten()
            +
            The number of Replication Stream bytes written over the network. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the sum total of all Feeder related + network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getNProtocolMessagesBatched

            +
            public long getNProtocolMessagesBatched()
            +
            The number of Replication Stream messages that were written as part + of a message batch instead of being written individually. + + It represents a subset of the messages returned by + getNProtocolMessagesWritten()
            +
            +
            Since:
            +
            6.2.7
            +
            See Also:
            +
            getNProtocolMessageBatches()
            +
            +
          • +
          + + + +
            +
          • +

            getNProtocolMessageBatches

            +
            public long getNProtocolMessageBatches()
            +
            The number of Replication Stream message batches written to the network.
            +
            +
            Since:
            +
            6.2.7
            +
            See Also:
            +
            getNProtocolMessagesBatched()
            +
            +
          • +
          + + + +
            +
          • +

            getNProtocolMessagesWritten

            +
            public long getNProtocolMessagesWritten()
            +
            The total number of Replication Stream messages written over the + network. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the sum total of all Feeder related + network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getProtocolReadNanos

            +
            public long getProtocolReadNanos()
            +
            The number of nanoseconds spent reading from the network channel. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the sum total of all Feeder related + network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getProtocolWriteNanos

            +
            public long getProtocolWriteNanos()
            +
            The number of nanoseconds spent writing to the network channel. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the sum total of all Feeder related + network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getProtocolMessageReadRate

            +
            public long getProtocolMessageReadRate()
            +
            Incoming replication message throughput, in terms of messages received + from the replication network channels per second. +

            If the node has served as both a Replica and Master since + it was first started, the number represents the message reading rate + over all Feeder related network activity, as well as Replica network + activity.

            +
          • +
          + + + +
            +
          • +

            getProtocolMessageWriteRate

            +
            public long getProtocolMessageWriteRate()
            +
            Outgoing message throughput, in terms of message written to the + replication network channels per second. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the message writing rate over all Feeder + related network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getProtocolBytesReadRate

            +
            public long getProtocolBytesReadRate()
            +
            Bytes read throughput, in terms of bytes received from the replication + network channels per second. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the bytes reading rate over all Feeder + related network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getProtocolBytesWriteRate

            +
            public long getProtocolBytesWriteRate()
            +
            Bytes written throughput, in terms of bytes written to the replication + network channels per second. +

            + If the node has served as both a Replica and Master since it was first + started, the number represents the bytes writing rate over all Feeder + related network activity, as well as Replica network activity.

            +
          • +
          + + + +
            +
          • +

            getNProtocolEntriesWrittenOldVersion

            +
            public long getNProtocolEntriesWrittenOldVersion()
            +
            Returns the number of messages containing log entries that were written + to the replication stream using the previous log format to support + replication to a replica running an earlier version during an upgrade.
            +
          • +
          + + + + + + + + + + + + + + + + + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns a string representation of the statistics.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toStringVerbose

            +
            public java.lang.String toStringVerbose()
            +
          • +
          + + + +
            +
          • +

            getTips

            +
            public java.util.Map<java.lang.String,java.lang.String> getTips()
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicationConfig.html b/docs/java/com/sleepycat/je/rep/ReplicationConfig.html new file mode 100644 index 0000000..5cca53f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicationConfig.html @@ -0,0 +1,2412 @@ + + + + + +ReplicationConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicationConfig

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        com.sleepycat.je.dbi.RepConfigProxy, java.io.Serializable, java.lang.Cloneable
        +
        +
        +
        +
        public class ReplicationConfig
        +extends ReplicationMutableConfig
        +implements com.sleepycat.je.dbi.RepConfigProxy
        +
        Specifies the immutable attributes of a replicated environment. +

        + To change the default settings for a replicated environment, an application + creates a configuration object, customizes settings and uses it for ReplicatedEnvironment construction. The set methods of this class validate + the configuration values when the method is invoked. An + IllegalArgumentException is thrown if the value is not valid for that + attribute. +

        + Note that ReplicationConfig only describes those attributes which must be + set at ReplicatedEnvironment construction time, while its superclass + ReplicationMutableConfig describes attributes that may be modified + during the life of the replication group. +

        + ReplicationConfig follows precedence rules similar to those of + EnvironmentConfig. +

          +
        1. Configuration parameters specified + in <environmentHome>/je.properties take first precedence.
        2. +
        3. Configuration parameters set in the ReplicationConfig object used + at ReplicatedEnvironment construction are next.
        4. +
        5. Any configuration parameters not set by the application are set to + system defaults, described along with the parameter name String constants + in this class.
        6. +
        +

        + After a ReplicatedEnvironment has been constructed, its mutable + properties may be changed using ReplicatedEnvironment#setMutableConfig. See ReplicationMutableConfig for a list of mutable properties; all other + properties are immutable. Whether a property is mutable or immutable is + also described along with the parameter name String constants in this class. + +

        Getting the Current ReplicatedEnvironment Properties

        + + To get the current "live" properties of a replicated environment after + constructing it or changing its properties, you must call ReplicatedEnvironment.getRepConfig() or ReplicatedEnvironment.getRepMutableConfig(). The original ReplicationConfig + or ReplicationMutableConfig object used to set the properties is not kept up + to date as properties are changed, and does not reflect property validation + or properties that are computed.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            GROUP_NAME

            +
            public static final java.lang.String GROUP_NAME
            +
            The name for the replication group. + The name should consist of letters, digits, and/or hyphen ("-"), + underscore ("_"), or period ("."). + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.rep.groupName"StringNo"DefaultGroup"

            +
            +
            See Also:
            +
            setGroupName(java.lang.String), +getGroupName(), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            NODE_NAME

            +
            public static final java.lang.String NODE_NAME
            +
            The node name uniquely identifies this node within the replication + group. + The name should consist of letters, digits, and/or hyphen ("-"), + underscore ("_"), or period ("."). + +

            Note that the node name is immutable. Normally the host name should + not be used as the node name, unless you intend to reuse the host + name when a machine fails and is replaced, or the node is upgraded to + new hardware.

            + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.rep.nodeName"StringNo"DefaultRepNodeName"

            +
            +
            See Also:
            +
            setNodeName(java.lang.String), +getNodeName(), +Constant Field Values
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            DEFAULT_PORT

            +
            public static final java.lang.String DEFAULT_PORT
            +
            The default port used for replication. +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.defaultPort"IntegerNo50011024Short.MAX_VALUE

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            NODE_HOST_PORT

            +
            public static final java.lang.String NODE_HOST_PORT
            +
            Names the hostname and port associated with this node in the + replication group, e.g. je.rep.nodeHostPort=foo.com:5001. +

            + The hostname is defaulted to "localhost" to make it easy to prototype + and to execute the examples, but the user should be very sure to set a + specific hostname before starting nodes on multiple machines. The value + of je.rep.nodeHostPort is saved persistently in replication group + metadata and is expected to be a unique address, and a value of + "localhost" in the replication metadata will cause severe communication + confusion. +

            + The port portion of the host value is optional. If it's not specified, + the value of "je.rep.defaultPort" is used. +

            + + + + + + + +
            NameTypeMutableDefault
            "je.rep.nodeHostPort"StringNo"localhost"

            +
            +
            See Also:
            +
            setNodeHostPort(java.lang.String), +getNodeHostPort(), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            BIND_INADDR_ANY

            +
            public static final java.lang.String BIND_INADDR_ANY
            +
            When this configuration parameter is set to true, it binds the HA socket + to INADDR_ANY, so that HA services are available on all network + interfaces. The default value (false) results in the HA socket being + bound to the specific interface specified by the NODE_HOST_PORT + configuration. + +

            + + + + + + + + + + + + + +
            NameTypeMutableDefault
            "je.rep.bindInaddrAny"BooleanNofalse
            +

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            REP_STREAM_TIMEOUT

            +
            public static final java.lang.String REP_STREAM_TIMEOUT
            +
            Deprecated. and no longer used as of JE 7.5. Reserved files are now + retained based on available disk space -- see + EnvironmentConfig.MAX_DISK and + EnvironmentConfig.FREE_DISK should be used instead. + However, this param is still used when some, but not all, nodes in a + group have been upgraded to 7.5 or later.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            REPLAY_FREE_DISK_PERCENT

            +
            public static final java.lang.String REPLAY_FREE_DISK_PERCENT
            +
            Deprecated. and no longer needed as of JE 7.5. Reserved files are now + retained based on available disk space -- see + EnvironmentConfig.MAX_DISK and + EnvironmentConfig.FREE_DISK should be used instead. + However, this param is still used when it has been specified and + is non-zero, and FREE_DISK has not been specified. In this case, + REPLAY_FREE_DISK_PERCENT overrides the FREE_DISK default value. If + both REPLAY_FREE_DISK_PERCENT and FREE_DISK are specified, an + IllegalArgumentException is thrown.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLAY_TXN_LOCK_TIMEOUT

            +
            public static final java.lang.String REPLAY_TXN_LOCK_TIMEOUT
            +
            The maximum amount of time for a replay transaction to wait for a lock. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replayTxnLockTimeout" + Duration + No500 ms1 ms75 min

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLAY_MAX_OPEN_DB_HANDLES

            +
            @Deprecated
            +public static final java.lang.String REPLAY_MAX_OPEN_DB_HANDLES
            + +
            The maximum number of most recently used database handles that + are kept open during the replay of the replication stream. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replayMaxOpenDbHandles"IntYes101-none-

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLAY_DB_HANDLE_TIMEOUT

            +
            @Deprecated
            +public static final java.lang.String REPLAY_DB_HANDLE_TIMEOUT
            + +
            The maximum amount of time that an inactive database handle is kept open + during a replay of the replication stream. Handles that are inactive for + more than this time period are automatically closed. Note that this does + not impact any handles that may have been opened by the application. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replayOpenHandleTimeout"DurationYes30 sec1 sec-none-

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_CONSISTENCY_TIMEOUT

            +
            public static final java.lang.String ENV_CONSISTENCY_TIMEOUT
            +
            The amount of time to wait for a Replica to become consistent with the + Master, when a ReplicatedEnvironment handle is created and + no ConsistencyPolicy is specified. If the Replica does not + become consistent within this period, a + ReplicaConsistencyException is thrown by the + ReplicatedEnvironment constructor. +

            + If an explicit ConsistencyPolicy is specified via a + constructor argument, then the timeout defined by the + ConsistencyPolicy argument is used instead of this default. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.envConsistencyTimeout" + Duration + No5 min10 ms-none-
            +

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLICA_ACK_TIMEOUT

            +
            public static final java.lang.String REPLICA_ACK_TIMEOUT
            +
            The amount of time that the + Transaction.commit(com.sleepycat.je.Durability) + on the Master will wait for a sufficient number of acknowledgments from + electable Replicas. If the Master does not receive a sufficient number of + acknowledgments within this timeout period, the commit() + will throw InsufficientAcksException. In the special case of a + two node group, if this node is the designated Primary, + the Primary will be activated, and the + commit() will proceed normally instead of throwing an + exception. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replicaAckTimeout" + Duration + No5 s10 ms-none-
            +

            +
            +
            See Also:
            +
            Time Duration + Properties, +ReplicationMutableConfig.DESIGNATED_PRIMARY, +Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            MAX_MESSAGE_SIZE

            +
            public static final java.lang.String MAX_MESSAGE_SIZE
            +
            The maximum message size which will be accepted by a node (to prevent + DOS attacks). While the default shown here is 0, it dynamically + calculated when the node is created and is set to the half of the + environment cache size. The cache size is mutable, but changing the + cache size at run time (after environment initialization) will not + change the value of this parameter. If a value other than cache size / + 2 is desired, this non-mutable parameter should be specified at + initialization time. +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.maxMessageSize"LongNohalf of cache size256KBLong.MAX_VALUE

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            ELECTIONS_PRIMARY_RETRIES

            +
            public static final java.lang.String ELECTIONS_PRIMARY_RETRIES
            +
            The number of times an unsuccessful election will be retried by a + designated Primary in a two node group before it is + activated and becomes the Master. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.electionsPrimaryRetries"IntegerNo20Integer.MAX_VALUE

            +
            +
            See Also:
            +
            ReplicationMutableConfig.DESIGNATED_PRIMARY, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ELECTIONS_REBROADCAST_PERIOD

            +
            public static final java.lang.String ELECTIONS_REBROADCAST_PERIOD
            +
            The time interval between rebroadcasts of election results by the master + node to all nodes not currently connected to it. These rebroadcasts help + ensure that a replication group is fully restored after a network + partition, by permitting nodes on either side of the resolved partition + to catch up with the latest election results. +

            + A network partition, may in some circumstances, result in a node + continuing to think it is the master, even though it is on the side of + the partition containing a minority of electable nodes, and the side + with the majority has elected a new master. Rebroadcasting election + results on a periodic basis ensures that the obsolete master is brought + up to date after the network partition has been resolved. As a result of + the update, the environment at the obsolete master will transition into + a replica state. +

            + Decreasing the period will result in more frequent broadcasts and thus a + faster return to normal operations after a network partition has been + resolved. + +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.electionsRebroadcastPeriod" + DurationNo1 min1 snone
            +

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TXN_ROLLBACK_LIMIT

            +
            public static final java.lang.String TXN_ROLLBACK_LIMIT
            +
            In rare cases, a node may need to rollback committed transactions in + order to rejoin a replication group. This parameter limits the number of + durable transactions that may be rolled back. Durable transactions are + transactions that were successfully committed with a durability + requiring acknowledgments from at least a simple majority of nodes. If + the number of durable committed transactions targeted for rollback + exceeds this parameter, a RollbackProhibitedException will be + thrown. + +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.txnRollbackLimit"IntegerNo100Integer.MAX_VALUE
            +

            +
            +
            See Also:
            +
            RollbackProhibitedException, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            TXN_ROLLBACK_DISABLED

            +
            public static final java.lang.String TXN_ROLLBACK_DISABLED
            +
            In rare cases, a node may need to rollback committed transactions in + order to rejoin a replication group. If this parameter is set to true + and a rollback is necessary to rejoin the group, a RollbackProhibitedException will be thrown. + +

            Unlike setting TXN_ROLLBACK_LIMIT to zero, setting this + parameter to true disables the rollback without regard to whether the + transactions to roll back are considered durable.

            + +

            Setting TXN_ROLLBACK_DISABLED to true should not be + necessary for most applications. Its intended purpose is for the rare + application that needs manual control over rollback of all transactions, + including transactions that are not considered to be durable.

            + +

            + + + + + + + + + + + + + +
            NameTypeMutableDefault
            "je.rep.txnRollbackDisabled"BooleanNoFalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            FEEDER_TIMEOUT

            +
            public static final java.lang.String FEEDER_TIMEOUT
            +
            A heartbeat is exchanged between the feeder and replica to ensure they + are alive. This is the timeout associated with the heartbeat on the + feeder side of the connection. +

            + Reducing this value enables the master to discover failed Replicas, and + recycle feeder connections, faster. However, it increases the chances of + false timeouts, if the network is experiencing transient problems, or + the Java GC is responsible for long pauses. In the latter case, it's + generally better to tune the GC to avoid such pauses. + +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.feederTimeout" + Duration + No30 s2 s-none-
            +

            +
            +
            Since:
            +
            4.0.100
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLICA_TIMEOUT

            +
            public static final java.lang.String REPLICA_TIMEOUT
            +
            A heartbeat is exchanged between the feeder and replica to ensure they + are alive. This is the timeout associated with the heartbeat on the + replica side of the connection. +

            + Reducing the value means that a master failure will be discovered more + promptly in some circumstances and the overall time needed to failover + to a new master will be reduced. However, it increases the chances of + false timeouts, if the network is experiencing transient problems, or + the Java GC is responsible for long pauses. In the latter case, it's + generally better to tune the GC to avoid such pauses. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replicaTimeout" + Duration + No30 s2 s-none-
            +

            +
            +
            Since:
            +
            4.0.100
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLICA_RECEIVE_BUFFER_SIZE

            +
            public static final java.lang.String REPLICA_RECEIVE_BUFFER_SIZE
            +
            The size of the the TCP receive buffer associated with the socket used + by the replica to transfer the replication stream. +

            + Larger values help handle incoming network traffic even when the replica + has been paused for a garbage collection. The parameter default value of + 1 MB should be sufficient in most of the environments. Consider + increasing the value if network monitoring shows packet loss, or if your + JE environment contains large data values. Note that if the size + specified is larger than the operating system constrained maximum, it + will be limited to this maximum value. For example, on Linux you may + need to set the kernel parameter: net.core.rmem_max property using the + command: sysctl -w net.core.rmem_max=1048576 to increase the + operating system imposed limit. +

            + A parameter value of zero will result in the use of operating system + specified default socket buffer size. + +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replicaReceiveBufferSize"IntegerNo10485760-none-
            +

            +
            +
            Since:
            +
            5.0.37
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLICA_MAX_GROUP_COMMIT

            +
            public static final java.lang.String REPLICA_MAX_GROUP_COMMIT
            +
            The maximum number of transactions that can be grouped to amortize the + cost of an fsync when a transaction commits with SyncPolicy#SYNC on the + Replica. A value of zero effectively turns off the group commit + optimization. +

            + Specifying larger values can result in more transactions being grouped + together decreasing average commit times. +

            + An fsync is issued if the size of the transaction group reaches the + maximum within the time period specified by + REPLICA_GROUP_COMMIT_INTERVAL. +

            + The ReplicatedEnvironmentStats.getNReplayGroupCommitMaxExceeded() + statistic may be used to tune this parameter. Large values indicate that + commit throughput could be improved by increasing the current value. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replicaMaxGroupCommit"IntegerNo2000-none-
            +

            +
            +
            Since:
            +
            5.0.76
            +
            See Also:
            +
            REPLICA_GROUP_COMMIT_INTERVAL, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLICA_GROUP_COMMIT_INTERVAL

            +
            public static final java.lang.String REPLICA_GROUP_COMMIT_INTERVAL
            +
            The time interval during which transactions may be grouped to amortize + the cost of fsync when a transaction commits with SyncPolicy#SYNC on the + Replica. This parameter is only meaningful if the + group commit size is greater than one. +

            + The first (as ordered by transaction serialization) transaction in a + transaction group may be delayed by at most this amount. Subsequent + transactions in the group will have smaller delays since they are later + in the serialization order. +

            + The ReplicatedEnvironmentStats.getNReplayGroupCommitTimeouts() + statistic may be used to tune this parameter. Large numbers of timeouts + in conjunction with large numbers of group commits ( + ReplicatedEnvironmentStats.getNReplayGroupCommits()) indicate + that commit throughput could be improved by increasing the time + interval. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replicaGroupCommitInterval"DurationNo3 ms0-none-
            +

            +
            +
            Since:
            +
            5.0.76
            +
            See Also:
            +
            REPLICA_MAX_GROUP_COMMIT, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_SETUP_TIMEOUT

            +
            public static final java.lang.String ENV_SETUP_TIMEOUT
            +
            The maximum amount of time for the internal housekeeping, like + elections, syncup with the master, etc. to be accomplished when opening + a new handle to an environment. +

            + This timeout does not encompass the time spent making the node + consistent with the master, if it is a Replica. The timeout associated + with making a replica consistent is normally determined by the + ENV_CONSISTENCY_TIMEOUT parameter but can be overridden by the + timeout associated with the ReplicaConsistencyPolicy if a + consistencyPolicy argument was supplied to the handle + constructor. +

            + Note that the default value (10 hours) is a long time to allow for cases + where elections may take a long time when other nodes are not available. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.envSetupTimeout"DurationNo10 h-none--none-
            +

            +
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ENV_UNKNOWN_STATE_TIMEOUT

            +
            public static final java.lang.String ENV_UNKNOWN_STATE_TIMEOUT
            +
            Permits opening of a ReplicatedEnvironment handle in the + ReplicatedEnvironment.State.UNKNOWN state, if a Master cannot be + determined within this timeout period. For the timeout to be meaningful + it must be less than ENV_SETUP_TIMEOUT. This parameter is + ignored when creating a replicated environment for the first time. +

            + A ReplicatedEnvironment handle in the + ReplicatedEnvironment.State.UNKNOWN state can only be used to + initiate read operations with an appropriately relaxed, e.g. + NoConsistencyRequiredPolicy; write operations will fail with a + ReplicaWriteException. The handle will transition to a + Master or Replica state when it can contact a + sufficient number of other nodes in the replication group. +

            + If the parameter is set to zero, and an election cannot be concluded + within the timeout defined by ENV_SETUP_TIMEOUT, the + ReplicatedEnvironment constructor will throw UnknownMasterException. +

            + + + + + + + + + + + + + + + + + +
            +
            Since:
            +
            5.0.33
            +
            See Also:
            +
            Constant Field Values
            +
            + + + + + +
              +
            • +

              PROTOCOL_OLD_STRING_ENCODING

              +
              public static final java.lang.String PROTOCOL_OLD_STRING_ENCODING
              +
              When set to true, which is currently the default, the + replication network protocol will use the JVM platform default charset + (text encoding) for node names and host names. This is incorrect, in + that it requires that the JVM for all nodes in a replication group have + the same default charset. +

              + When this parameter is set to false, the UTF-8 charset is + always used in the replication protocol. In other words, the JVM + default charset has no impact on the replication protocol. +

              + An application is not impacted by this issue, and does not need + to set this parameter, if it has the following characteristics. +

                +
              • The default charset on all JVMs is UTF-8 or ASCII, or
              • +
              • all node names and host names contain only ASCII characters, and + the default charset on all JVMs is a superset of ASCII.
              • +
              +

              + In JE 5.1, the default value for this parameter will be changed to + false. In preparation for this, impacted applications should explicitly + set the parameter to false at the next available opportunity. For + applications not yet deployed, this should be done now. For deployed + applications, a hot upgrade may not be performed when changing the + parameter. Instead, a cold upgrade must be performed: all nodes must + be stopped and upgraded before bringing them up again. In other words, + for impacted applications the value of this configuration parameter must + be the same for all running nodes in a replication group. +

              + Note that the default charset issue applies only to the replication + network protocol and not to stored data of any kind. +

              +

            NameTypeMutableDefaultMinimumMaximum
            "je.rep.envUnknownStateTimeout"DurationNo0-none-ENV_SETUP_TIMEOUT
            + + + + + + + + + + + + +
            NameTypeMutableDefault
            "je.rep.protocolOldStringEncoding"BooleanNoTrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ARBITER_OUTPUT_QUEUE_SIZE

            +
            public static final java.lang.String ARBITER_OUTPUT_QUEUE_SIZE
            +
            The size of the the queue used to hold commit records that the Feeder + uses to request acknowledgment from an Arbiter. +

            + An entry is attempted to be put on the queue. If it cannot be done within + a certain amount of time, the transaction will fail due to insufficient + acks. +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.arbiterOutputQueueSize"IntegerNo40960-none-
            +

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ReplicationConfig

            +
            public ReplicationConfig()
            +
            Creates a ReplicationConfig initialized with the system default + settings. Defaults are documented with the string constants in this + class.
            +
          • +
          + + + +
            +
          • +

            ReplicationConfig

            +
            public ReplicationConfig(java.lang.String groupName,
            +                         java.lang.String nodeName,
            +                         java.lang.String hostPort)
            +
            Creates a ReplicationConfig initialized with the system default + settings and the specified group name, node name, and hostname/port + values. + +

            Note that the node name is immutable. Normally the host name should + not be used as the node name, unless you intend to reuse the host + name when a machine fails and is replaced, or the node is upgraded to + new hardware.

            +
            +
            Parameters:
            +
            groupName - the name for the replication group
            +
            nodeName - the name for this node
            +
            hostPort - the hostname and port for this node
            +
            See Also:
            +
            setGroupName(java.lang.String), +setNodeName(java.lang.String)
            +
            +
          • +
          + + + +
            +
          • +

            ReplicationConfig

            +
            public ReplicationConfig(java.util.Properties properties)
            +                  throws java.lang.IllegalArgumentException
            +
            Creates a ReplicationConfig which includes the properties specified in + the properties parameter.
            +
            +
            Parameters:
            +
            properties - Supported properties are described as the string + constants in this class.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - If any properties read from the + properties parameter are invalid.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getGroupName

            +
            public java.lang.String getGroupName()
            +
            Gets the name associated with the replication group.
            +
            +
            Returns:
            +
            the name of this replication group.
            +
            +
          • +
          + + + +
            +
          • +

            setGroupName

            +
            public ReplicationConfig setGroupName(java.lang.String groupName)
            +                               throws java.lang.IllegalArgumentException
            +
            Sets the name for the replication group. +

            + The name should consist of letters, digits, and/or hyphen ("-"), + underscore ("_"), or period (".").

            +
            +
            Parameters:
            +
            groupName - the string representing the name
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - If the string name is not valid
            +
            +
          • +
          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the unique name associated with this node.
            +
            +
            Returns:
            +
            the node name
            +
            +
          • +
          + + + +
            +
          • +

            setNodeName

            +
            public ReplicationConfig setNodeName(java.lang.String nodeName)
            +                              throws java.lang.IllegalArgumentException
            +
            Sets the name to be associated with this node. It must be unique within + the group. When the node is instantiated and joins the replication + group, a check is done to ensure that the name is unique, and a RestartRequiredException is thrown if it is not. +

            + The name should consist of letters, digits, and/or hyphen ("-"), + underscore ("_"), or period ("."). + +

            Note that the node name is immutable. Normally the host name should + not be used as the node name, unless you intend to reuse the host + name when a machine fails and is replaced, or the node is upgraded to + new hardware.

            +
            +
            Parameters:
            +
            nodeName - the node name for this replicated environment.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - If the name is not valid
            +
            +
          • +
          + + + +
            +
          • +

            getNodeType

            +
            public NodeType getNodeType()
            +
            Returns the NodeType of this node.
            +
            +
            Returns:
            +
            the node type
            +
            +
          • +
          + + + +
            +
          • +

            setNodeType

            +
            public ReplicationConfig setNodeType(NodeType nodeType)
            +
            Sets the type of this node.
            +
            +
            Parameters:
            +
            nodeType - the node type
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getNodeHostPort

            +
            public java.lang.String getNodeHostPort()
            +
            Returns the hostname and port associated with this node. The hostname + and port combination are denoted by a string of the form: +
            +   hostname:port
            + 
            +
            +
            Returns:
            +
            the hostname and port string.
            +
            See Also:
            +
            NODE_HOST_PORT
            +
            +
          • +
          + + + +
            +
          • +

            setNodeHostPort

            +
            public ReplicationConfig setNodeHostPort(java.lang.String hostPort)
            +
            Sets the hostname and port associated with this node. The hostname + and port combination are denoted by a string of the form: +
            +  hostname[:port]
            + 
            + The port must be outside the range of "Well Known Ports" + (zero through 1023).
            +
            +
            Parameters:
            +
            hostPort - the string containing the hostname and port as above.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            NODE_HOST_PORT
            +
            +
          • +
          + + + +
            +
          • +

            getReplicaAckTimeout

            +
            public long getReplicaAckTimeout(java.util.concurrent.TimeUnit unit)
            +
            Returns the configured replica timeout value.
            +
            +
            Returns:
            +
            the timeout in milliseconds
            +
            +
          • +
          + + + +
            +
          • +

            setReplicaAckTimeout

            +
            public ReplicationConfig setReplicaAckTimeout(long replicaAckTimeout,
            +                                              java.util.concurrent.TimeUnit unit)
            +
            Set the replica commit timeout.
            +
            +
            Parameters:
            +
            replicaAckTimeout - time in milliseconds
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getMaxClockDelta

            +
            public long getMaxClockDelta(java.util.concurrent.TimeUnit unit)
            +
            Returns the maximum acceptable clock skew between this Replica and its + Feeder, which is the node that is the source of its replication stream.
            +
            +
            Returns:
            +
            the max permissible clock skew
            +
            +
          • +
          + + + +
            +
          • +

            setMaxClockDelta

            +
            public ReplicationConfig setMaxClockDelta(long maxClockDelta,
            +                                          java.util.concurrent.TimeUnit unit)
            +                                   throws java.lang.IllegalArgumentException
            +
            Sets the maximum acceptable clock skew between this Replica and its + Feeder, which is the node that is the source of its replication + stream. This value is checked whenever a Replica establishes a + connection to its replication stream source. The connection is abandoned + if the clock skew is larger than this value.
            +
            +
            Parameters:
            +
            maxClockDelta - the maximum acceptable clock skew
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the value is not a positive integer
            +
            +
          • +
          + + + +
            +
          • +

            setConsistencyPolicy

            +
            public ReplicationConfig setConsistencyPolicy(ReplicaConsistencyPolicy policy)
            +
            Sets the consistency policy to be associated with the configuration. + This policy acts as the default policy used to govern the consistency + requirements when starting new transactions. See the overview on + consistency in replicated systems for more background. +

            +
            +
            Parameters:
            +
            policy - the consistency policy to be set for this config.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getConsistencyPolicy

            +
            public ReplicaConsistencyPolicy getConsistencyPolicy()
            +
            Returns the default consistency policy associated with the + configuration. +

            + If the user does not set the default consistency policy through setConsistencyPolicy(com.sleepycat.je.ReplicaConsistencyPolicy), the system will use the policy + defined by CONSISTENCY_POLICY.

            +
            +
            Specified by:
            +
            getConsistencyPolicy in interface com.sleepycat.je.dbi.RepConfigProxy
            +
            Returns:
            +
            the consistency policy currently associated with this config.
            +
            +
          • +
          + + + +
            +
          • +

            setConfigParam

            +
            public ReplicationConfig setConfigParam(java.lang.String paramName,
            +                                        java.lang.String value)
            +                                 throws java.lang.IllegalArgumentException
            +
            Description copied from class: ReplicationMutableConfig
            +
            Set this configuration parameter with this value. Values are validated + before setting the parameter.
            +
            +
            Overrides:
            +
            setConfigParam in class ReplicationMutableConfig
            +
            Parameters:
            +
            paramName - the configuration parameter name, one of the String + constants in this class
            +
            value - the configuration value.
            +
            Returns:
            +
            this;
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the paramName or value is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public ReplicationConfig clone()
            +
            Returns a copy of this configuration object.
            +
          • +
          + + + +
            +
          • +

            getNodeHostname

            +
            public java.lang.String getNodeHostname()
            +
            Returns the hostname component of the nodeHost property.
            +
            +
            Returns:
            +
            the hostname string
            +
            +
          • +
          + + + +
            +
          • +

            getNodePort

            +
            public int getNodePort()
            +
            Returns the port component of the nodeHost property.
            +
            +
            Returns:
            +
            the port number
            +
            +
          • +
          + + + +
            +
          • +

            setSyncupProgressListener

            +
            public ReplicationConfig setSyncupProgressListener(ProgressListener<SyncupProgress> progressListener)
            +
            Configure the environment to make periodic calls to a ProgressListener to provide feedback on replication stream sync-up. + The ProgressListener.progress() method is called at different stages of + the syncup process. See SyncupProgress for information about + those stages. +

            + When using progress listeners, review the information at ProgressListener.progress(T, long, long) to avoid any unintended disruption to + replication stream syncup.

            +
            +
            Parameters:
            +
            progressListener - The ProgressListener to callback during + environment instantiation (syncup).
            +
            Since:
            +
            5.0
            +
            See Also:
            +
            Replication Group Life Cycle
            +
            +
          • +
          + + + +
            +
          • +

            getSyncupProgressListener

            +
            public ProgressListener<SyncupProgress> getSyncupProgressListener()
            +
            Return the ProgressListener to be used at this environment startup.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicationGroup.html b/docs/java/com/sleepycat/je/rep/ReplicationGroup.html new file mode 100644 index 0000000..d689824 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicationGroup.html @@ -0,0 +1,462 @@ + + + + + +ReplicationGroup (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicationGroup

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.ReplicationGroup
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class ReplicationGroup
        +extends java.lang.Object
        +
        An administrative view of the collection of nodes that form the replication + group. Can be obtained from a ReplicatedEnvironment or a ReplicationGroupAdmin.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.util.Set<ReplicationNode>getArbiterNodes() +
          Returns the subset of nodes in the group that participates in elections + but does not have a copy of the data and cannot become a master.
          +
          java.util.Set<ReplicationNode>getDataNodes() +
          Returns the subset of nodes in the group that store replication data.
          +
          java.util.Set<ReplicationNode>getElectableNodes() +
          Returns the subset of nodes in the group with replicated environments + that participate in elections and can become masters, ignoring node + priority.
          +
          ReplicationNodegetMember(java.lang.String nodeName) +
          Get administrative information about a node by its node name.
          +
          java.util.Set<ReplicationNode>getMonitorNodes() +
          Returns the subset of nodes in the group that monitor group membership + but do not maintain replicated environments.
          +
          java.lang.StringgetName() +
          Returns the name associated with the group.
          +
          java.util.Set<ReplicationNode>getNodes() +
          Returns the set of all nodes in the group.
          +
          java.util.Set<ReplicationNode>getSecondaryNodes() +
          Returns the subset of nodes in the group with replicated environments + that do not participate in elections and cannot become masters.
          +
          java.lang.StringtoString() +
          Returns a formatted version of the information held in a + ReplicationGroup.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getName

            +
            public java.lang.String getName()
            +
            Returns the name associated with the group.
            +
            +
            Returns:
            +
            the name of the replication group.
            +
            +
          • +
          + + + +
            +
          • +

            getNodes

            +
            public java.util.Set<ReplicationNode> getNodes()
            +
            Returns the set of all nodes in the group. The return value includes + ELECTABLE, MONITOR, and SECONDARY nodes. + +

            Note that SECONDARY nodes will only be included in the result when + this method is called for a replicated environment that is the master.

            +
            +
            Returns:
            +
            the set of all nodes
            +
            See Also:
            +
            NodeType
            +
            +
          • +
          + + + +
            +
          • +

            getElectableNodes

            +
            public java.util.Set<ReplicationNode> getElectableNodes()
            +
            Returns the subset of nodes in the group with replicated environments + that participate in elections and can become masters, ignoring node + priority. The return value includes ELECTABLE nodes, and excludes + MONITOR and SECONDARY nodes.
            +
            +
            Returns:
            +
            the set of electable nodes
            +
            See Also:
            +
            NodeType
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryNodes

            +
            public java.util.Set<ReplicationNode> getSecondaryNodes()
            +
            Returns the subset of nodes in the group with replicated environments + that do not participate in elections and cannot become masters. The + return value includes SECONDARY nodes, and excludes ELECTABLE and + MONITOR nodes. + +

            Note that SECONDARY nodes will only be returned when this method is + called for a replicated environment that is the master.

            +
            +
            Returns:
            +
            the set of secondary nodes
            +
            Since:
            +
            6.0
            +
            See Also:
            +
            NodeType
            +
            +
          • +
          + + + +
            +
          • +

            getMonitorNodes

            +
            public java.util.Set<ReplicationNode> getMonitorNodes()
            +
            Returns the subset of nodes in the group that monitor group membership + but do not maintain replicated environments. The return value includes + MONITOR nodes, but excludes ELECTABLE and SECONDARY nodes.
            +
            +
            Returns:
            +
            the set of monitor nodes
            +
            See Also:
            +
            NodeType
            +
            +
          • +
          + + + +
            +
          • +

            getDataNodes

            +
            public java.util.Set<ReplicationNode> getDataNodes()
            +
            Returns the subset of nodes in the group that store replication data. + The return value includes all ELECTABLE and SECONDARY nodes, but + excludes MONITOR nodes. + +

            Note that SECONDARY nodes will only be included in the result when + this method is called for a replicated environment that is the master.

            +
            +
            Returns:
            +
            the set of data nodes
            +
            Since:
            +
            6.0
            +
            See Also:
            +
            NodeType
            +
            +
          • +
          + + + +
            +
          • +

            getArbiterNodes

            +
            public java.util.Set<ReplicationNode> getArbiterNodes()
            +
            Returns the subset of nodes in the group that participates in elections + but does not have a copy of the data and cannot become a master. + The return value includes ARBITER nodes.
            +
            +
            Returns:
            +
            the set of arbiter nodes
            +
            See Also:
            +
            NodeType
            +
            +
          • +
          + + + +
            +
          • +

            getMember

            +
            public ReplicationNode getMember(java.lang.String nodeName)
            +
            Get administrative information about a node by its node name. + +

            Note that SECONDARY nodes will only be returned when this method is + called for a replicated environment that is the master.

            +
            +
            Parameters:
            +
            nodeName - the node name to be used in the lookup
            +
            Returns:
            +
            an administrative view of the node associated with nodeName, or + null if there isn't such a node currently in the group
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns a formatted version of the information held in a + ReplicationGroup.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicationMutableConfig.html b/docs/java/com/sleepycat/je/rep/ReplicationMutableConfig.html new file mode 100644 index 0000000..241ae9e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicationMutableConfig.html @@ -0,0 +1,1005 @@ + + + + + +ReplicationMutableConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class ReplicationMutableConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.ReplicationMutableConfig
        • +
        +
      • +
      +
      + +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            ALLOW_ARBITER_ACK

            +
            public static final java.lang.String ALLOW_ARBITER_ACK
            +
            Boolean flag if set to true, an Arbiter may acknowledge a transaction if + a replication node is not available. + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.rep.allowArbiterAck"BooleanYesTrue

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            DESIGNATED_PRIMARY

            +
            public static final java.lang.String DESIGNATED_PRIMARY
            +
            Identifies the Primary node in a two node group. See the discussion of + issues when + + configuring two node groups + +

            + + + + + + + +
            NameTypeMutableDefault
            "je.rep.designatedPrimary"BooleanYesFalse

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            ELECTABLE_GROUP_SIZE_OVERRIDE

            +
            public static final java.lang.String ELECTABLE_GROUP_SIZE_OVERRIDE
            +
            An escape mechanism to modify the way in which the number of electable + nodes, and consequently the quorum requirements for elections and commit + acknowledgments, is calculated. The override is accomplished by + specifying the quorum size via this mutable configuration parameter. +

            + When this parameter is set to a non-zero value at a member node, the + member will use this value as the electable group size, instead of using + the metadata stored in the RepGroup database for its quorum + calculations. This parameter's value should be set to the number of + electable nodes known to be available. The default value is zero, which + indicates normal operation with the electable group size being + calculated from the metadata. +

            + Please keep in mind that this is an escape mechanism, only for use in + exceptional circumstances, to be used with care. Since JE HA is no + longer maintaining quorum requirements automatically, there is the + possibility that the simple majority of unavailable nodes could elect + their own Master, which would result in a diverging set of changes to + the same environment being made by multiple Masters. It is essential to + ensure that the problematic nodes are in fact down before making this + temporary configuration change. + + See the discussion in Appendix: + Managing a Failure of the Majority. +

            + + + + + + + + + + + + + +
            NameTypeMutableDefault
            "je.rep.electableGroupSizeOverride"IntegerYes0
            +

            +
            +
            See Also:
            +
            QuorumPolicy, +Durability.ReplicaAckPolicy, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            NODE_PRIORITY

            +
            public static final java.lang.String NODE_PRIORITY
            +
            The election priority associated with this node. The election algorithm + for choosing a new master will pick the participating node that has the + most current set of log files. When there is a tie, the election + priority is used as a tie-breaker to select amongst these nodes. +

            + A priority of zero is used to ensure that this node is never elected + master, even if it has the most up to date log files. Note that the node + still votes for a Master and participates in quorum requirements. Please + use this option with care, since it means that some node with less + current log files could be elected master. As a result, this node would + be forced to rollback committed data and must be prepared to handle any + RollbackException exceptions that might be thrown. + +

            + + + + + + + + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.node.priority"IntegerYes10Integer.MAX_VALUE
            +

            +
            +
            See Also:
            +
            RollbackException, +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            RUN_LOG_FLUSH_TASK

            +
            public static final java.lang.String RUN_LOG_FLUSH_TASK
            +
            Deprecated. as of 7.2. Log flushing can be disabled by setting EnvironmentConfig.LOG_FLUSH_SYNC_INTERVAL and EnvironmentConfig.LOG_FLUSH_NO_SYNC_INTERVAL to zero. For compatibility + with earlier releases, if this parameter is specified as false, no log + flushing will be performed; in this case, EnvironmentConfig.LOG_FLUSH_SYNC_INTERVAL and EnvironmentConfig.LOG_FLUSH_NO_SYNC_INTERVAL may not also be specified.
            +
            If true, JE HA (replication) will flush all committed transactions to + disk at the specified time interval. This is of interest because the + default durability for replicated transactions of Durability.COMMIT_NO_SYNC. The default for this behavior is true. +

            + When using Durability.COMMIT_NO_SYNC, continued activity will + naturally cause the steady flush of committed transactions, but a pause + in activity may cause the latest commits to stay in memory. In such a + case, it is unlikely but possible that all members of the replication + group have these last transactions in memory and that no members have + persisted them to disk. A catastrophic failure of all nodes in the + replication group would cause a loss of these transactions, in this + unlikely scenario. This background flush task will reduce such a + possibility. +

            + Note that enabling this feature when using Durability.COMMIT_NO_SYNC, does not constitute a guarantee that + updates made by a transaction are persisted. For an explicit guarantee, + transactions should use Durability.COMMIT_SYNC or Durability.COMMIT_WRITE_NO_SYNC. These more stringent, persistent + Durability options can be set at the environment or per-transaction + scope. Using one of these Durability settings for a given transaction + will also flush all commits that occurred earlier in time. +

            + + + + + + + + + + + + + +
            NameTypeMutableDefault
            "je.rep.runLogFlushTask"BooleanNotrue
            +

            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + + + + + +
            +
          • +

            REPLAY_MAX_OPEN_DB_HANDLES

            +
            public static final java.lang.String REPLAY_MAX_OPEN_DB_HANDLES
            +
            The maximum number of most recently used database handles that + are kept open during the replay of the replication stream. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replayMaxOpenDbHandles"IntYes101-none-

            +
            +
            Since:
            +
            5.0.38
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            HELPER_HOSTS

            +
            public static final java.lang.String HELPER_HOSTS
            +
            The string identifying one or more helper host and port pairs in + this format: +
            + hostname[:port][,hostname[:port]]*
            + 
            +

            + + + + + + + +
            NameTypeMutableDefault
            "je.rep.helperHosts"StringYes""

            +
            +
            See Also:
            +
            setHelperHosts(java.lang.String), +getHelperHosts(), +Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            REPLAY_DB_HANDLE_TIMEOUT

            +
            public static final java.lang.String REPLAY_DB_HANDLE_TIMEOUT
            +
            The maximum amount of time that an inactive database handle is kept open + during a replay of the replication stream. Handles that are inactive for + more than this time period are automatically closed. Note that this does + not impact any handles that may have been opened by the application. + +

            + + + + + + + + + + +
            NameTypeMutableDefaultMinimumMaximum
            "je.rep.replayOpenHandleTimeout"DurationNo30 sec1 sec-none-

            +
            +
            Since:
            +
            5.0.38
            +
            See Also:
            +
            Time Duration + Properties, +Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ReplicationMutableConfig

            +
            public ReplicationMutableConfig()
            +
            Create a ReplicationMutableConfig initialized with the system + default settings. Parameter defaults are documented with the string + constants in this class.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setDesignatedPrimary

            +
            public ReplicationMutableConfig setDesignatedPrimary(boolean isPrimary)
            +
            If isPrimary is true, designate this node as a Primary. This + setting only takes effect for electable nodes. The application must + ensure that exactly one electable node is designated to be a Primary at + any given time. Primary node configuration is only a concern when the + group has two electable nodes, and there cannot be a simple + majority. See the overview on configuring two + node groups.
            +
            +
            Parameters:
            +
            isPrimary - true if this node is to be made the Primary
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getDesignatedPrimary

            +
            public boolean getDesignatedPrimary()
            +
            Determines whether this node is the currently designated Primary. See + the overview on issues around + two node groups
            +
            +
            Returns:
            +
            true if this node is a Primary, false otherwise.
            +
            +
          • +
          + + + +
            +
          • +

            getElectableGroupSizeOverride

            +
            public int getElectableGroupSizeOverride()
            +
            Returns the value associated with the override. A value of zero means + that the number of electable nodes is determined as usual, that is, from + the contents of the group metadata.
            +
            +
            Returns:
            +
            the number of electable nodes as specified by the override
            +
            See Also:
            +
            ELECTABLE_GROUP_SIZE_OVERRIDE
            +
            +
          • +
          + + + +
            +
          • +

            setElectableGroupSizeOverride

            +
            public ReplicationMutableConfig setElectableGroupSizeOverride(int override)
            +
            Sets the size used to determine the number of electable nodes.
            +
            +
            Parameters:
            +
            override - the number of electable nodes. A value of zero means + that the number of electable nodes is determined as usual, that is, from + the contents of the group metadata.
            +
            Returns:
            +
            this
            +
            See Also:
            +
            ELECTABLE_GROUP_SIZE_OVERRIDE
            +
            +
          • +
          + + + +
            +
          • +

            getNodePriority

            +
            public int getNodePriority()
            +
            Returns the election priority associated with the node.
            +
            +
            Returns:
            +
            the priority for this node
            +
            See Also:
            +
            NODE_PRIORITY
            +
            +
          • +
          + + + +
            +
          • +

            setNodePriority

            +
            public ReplicationMutableConfig setNodePriority(int priority)
            +
            Sets the election priority for the node. The algorithm for choosing a + new master will pick the participating node that has the most current + set of log files. When there is a tie, the priority is used as a + tie-breaker to select amongst these nodes. +

            + A priority of zero is used to ensure that a node is never elected + master, even if it has the most current set of files. Please use this + option with caution, since it means that a node with less current log + files could be elected master potentially forcing this node to rollback + data that had been committed.

            +
            +
            Parameters:
            +
            priority - the priority to be associated with the node. It must be + zero, or a positive number.
            +
            See Also:
            +
            NODE_PRIORITY
            +
            +
          • +
          + + + +
            +
          • +

            getHelperHosts

            +
            public java.lang.String getHelperHosts()
            +
            Returns the string identifying one or more helper host and port pairs in + this format: +
            + hostname[:port][,hostname[:port]]*
            + 
            + The port name may be omitted if it's the default port.
            +
            +
            Returns:
            +
            the string representing the host port pairs
            +
            +
          • +
          + + + +
            +
          • +

            setHelperHosts

            +
            public ReplicationMutableConfig setHelperHosts(java.lang.String hostsAndPorts)
            +
            Identify one or more helpers nodes by their host and port pairs in this + format: +
            + hostname[:port][,hostname[:port]]*
            + 
            + If the port is omitted, the default port defined by XXX is used.
            +
            +
            Parameters:
            +
            hostsAndPorts - the string representing the host and port pairs.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            setConfigParam

            +
            public ReplicationMutableConfig setConfigParam(java.lang.String paramName,
            +                                               java.lang.String value)
            +                                        throws java.lang.IllegalArgumentException
            +
            Set this configuration parameter with this value. Values are validated + before setting the parameter.
            +
            +
            Parameters:
            +
            paramName - the configuration parameter name, one of the String + constants in this class
            +
            value - the configuration value.
            +
            Returns:
            +
            this;
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the paramName or value is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            getConfigParam

            +
            public java.lang.String getConfigParam(java.lang.String paramName)
            +                                throws java.lang.IllegalArgumentException
            +
            Return the value for this parameter.
            +
            +
            Parameters:
            +
            paramName - a valid configuration parameter, one of the String + constants in this class.
            +
            Returns:
            +
            the configuration value.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the paramName is invalid.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            List the configuration parameters and values that have been set + in this configuration object.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/ReplicationNode.html b/docs/java/com/sleepycat/je/rep/ReplicationNode.html new file mode 100644 index 0000000..3ebdf46 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/ReplicationNode.html @@ -0,0 +1,316 @@ + + + + + +ReplicationNode (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Interface ReplicationNode

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface ReplicationNode
        +
        An administrative view of a node in a replication group.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetHostName() +
          Returns the host name associated with the node.
          +
          java.lang.StringgetName() +
          Returns the unique name associated with the node.
          +
          intgetPort() +
          Returns the port number associated with the node.
          +
          java.net.InetSocketAddressgetSocketAddress() +
          The socket address used by other nodes in the replication group to + communicate with this node.
          +
          NodeTypegetType() +
          Returns the type associated with the node.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getName

            +
            java.lang.String getName()
            +
            Returns the unique name associated with the node.
            +
            +
            Returns:
            +
            the name of the node
            +
            +
          • +
          + + + +
            +
          • +

            getType

            +
            NodeType getType()
            +
            Returns the type associated with the node.
            +
            +
            Returns:
            +
            the node type
            +
            +
          • +
          + + + +
            +
          • +

            getSocketAddress

            +
            java.net.InetSocketAddress getSocketAddress()
            +
            The socket address used by other nodes in the replication group to + communicate with this node.
            +
            +
            Returns:
            +
            the socket address
            +
            +
          • +
          + + + +
            +
          • +

            getHostName

            +
            java.lang.String getHostName()
            +
            Returns the host name associated with the node.
            +
            +
            Returns:
            +
            the host name of the node
            +
            +
          • +
          + + + +
            +
          • +

            getPort

            +
            int getPort()
            +
            Returns the port number associated with the node.
            +
            +
            Returns:
            +
            the port number of the node
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/RestartRequiredException.html b/docs/java/com/sleepycat/je/rep/RestartRequiredException.html new file mode 100644 index 0000000..0375c62 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/RestartRequiredException.html @@ -0,0 +1,360 @@ + + + + + +RestartRequiredException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class RestartRequiredException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        InsufficientLogException, MasterReplicaTransitionException, RollbackException, RollbackProhibitedException
        +
        +
        +
        +
        public abstract class RestartRequiredException
        +extends EnvironmentFailureException
        +
        RestartRequiredException serves as the base class for all exceptions which + makes it impossible for HA to proceed without some form of corrective action + on the part of the user, followed by a restart of the application. The + corrective action may involve an increase in resources used by the + application, a JE configurations change, discarding cached state, etc. The + error message details the nature of the problem.
        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          Constructors 
          ModifierConstructor and Description
           RestartRequiredException(com.sleepycat.je.dbi.EnvironmentImpl envImpl, + com.sleepycat.je.dbi.EnvironmentFailureReason reason) 
           RestartRequiredException(com.sleepycat.je.dbi.EnvironmentImpl envImpl, + com.sleepycat.je.dbi.EnvironmentFailureReason reason, + java.lang.Exception cause) 
           RestartRequiredException(com.sleepycat.je.dbi.EnvironmentImpl envImpl, + com.sleepycat.je.dbi.EnvironmentFailureReason reason, + java.lang.String msg) 
          protected RestartRequiredException(java.lang.String message, + RestartRequiredException cause) +
          For internal use only.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            RestartRequiredException

            +
            public RestartRequiredException(com.sleepycat.je.dbi.EnvironmentImpl envImpl,
            +                                com.sleepycat.je.dbi.EnvironmentFailureReason reason)
            +
          • +
          + + + +
            +
          • +

            RestartRequiredException

            +
            public RestartRequiredException(com.sleepycat.je.dbi.EnvironmentImpl envImpl,
            +                                com.sleepycat.je.dbi.EnvironmentFailureReason reason,
            +                                java.lang.Exception cause)
            +
          • +
          + + + +
            +
          • +

            RestartRequiredException

            +
            public RestartRequiredException(com.sleepycat.je.dbi.EnvironmentImpl envImpl,
            +                                com.sleepycat.je.dbi.EnvironmentFailureReason reason,
            +                                java.lang.String msg)
            +
          • +
          + + + +
            +
          • +

            RestartRequiredException

            +
            protected RestartRequiredException(java.lang.String message,
            +                                   RestartRequiredException cause)
            +
            For internal use only.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/RollbackException.html b/docs/java/com/sleepycat/je/rep/RollbackException.html new file mode 100644 index 0000000..3f62bb2 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/RollbackException.html @@ -0,0 +1,358 @@ + + + + + +RollbackException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class RollbackException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class RollbackException
        +extends RestartRequiredException
        +
        This asynchronous exception indicates that a new master has been selected, + this Replica's log is ahead of the current Master, + and in this case, the Replica was unable to rollback without a + recovery. As a consequence, it is possible that one or more of the most + recently committed transactions may need to be rolled back, before the + Replica can synchronize its state with that of the current + Master. Note that any CommitTokens obtained before restarting + this Replica shouldn't be used after RollbackException + is thrown because the token may no longer exist on the current + Master node, due to failover processing. +

        + Existing ReplicatedEnvironment, and consequently Database + handles, are invalidated as a result of this exception. The application must + close all old handles and create new handles before it can proceed. The + actual rollback of any recently committed transactions is done when the + application re-instantiates and thereby reopens the ReplicatedEnvironment. The application is responsible for discarding and + recreating any transient state that may be associated with the committed + transactions that were rolled back. getEarliestTransactionId() and + getEarliestTransactionCommitTime() provide information to help + determine which transactions might be rolled back. Note that it is possible + that no committed transactions have been rolled back and that the + application need do no adjustments, in which case + getEarliestTransactionCommitTime() will return null. +

        + This exception should be encountered relatively infrequently in practice, + since the election mechanism favors nodes with the most advanced log when + deciding upon a master. The exception, due to its nature, can only be + encountered when the node is in the Replica state, or the node + is trying to transition to the Replica state. +

        + Use of weak durability requirements like + Durability.ReplicaAckPolicy.NONE or a + ReplicationMutableConfig.NODE_PRIORITY of zero + increases the likelihood of this exception.

        +
        +
        See Also:
        +
        RollbackProhibitedException, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.LonggetEarliestTransactionCommitTime() +
          Return the time in milliseconds of the earliest transaction commit that + has been rolled back.
          +
          longgetEarliestTransactionId() +
          Return the id of the earliest transaction commit that has been + rolled back.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getEarliestTransactionCommitTime

            +
            public java.lang.Long getEarliestTransactionCommitTime()
            +
            Return the time in milliseconds of the earliest transaction commit that + has been rolled back. May return null if no commits have been rolled + back.
            +
          • +
          + + + +
            +
          • +

            getEarliestTransactionId

            +
            public long getEarliestTransactionId()
            +
            Return the id of the earliest transaction commit that has been + rolled back. 0 is returned if no commits have been rolled back.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/RollbackProhibitedException.html b/docs/java/com/sleepycat/je/rep/RollbackProhibitedException.html new file mode 100644 index 0000000..cd5443b --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/RollbackProhibitedException.html @@ -0,0 +1,397 @@ + + + + + +RollbackProhibitedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class RollbackProhibitedException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class RollbackProhibitedException
        +extends RestartRequiredException
        +
        This exception may be thrown by a Replica during the + replication stream sync-up phase of startup. It indicates that a syncup + cannot proceed without undoing a number of committed transactions that + exceeds the limit defined by ReplicationConfig.TXN_ROLLBACK_LIMIT. +

        + It is rare for committed transactions to be rolled back during a + sync-up. One way this can happen is if a replication group has been + executing with a Durability policy that specifies a + ReplicaAckPolicy of + NONE. +

        + When ReplicaAckPolicy.NONE is specified, transactions can commit on the + master without receiving any acknowledgments from replica nodes. Using that + policy, it is possible that if the master node crashes at a given time, and + the group fails over and continues on with a new master, the old master's + environment will have transactions on disk that were never replicated and + received by other nodes. When this old master comes back up and rejoins the + group as a replica, it will have committed transactions that need to be + rolled back. +

        + If the number of committed transactions to be rolled back is less than or + equal to the limit specified by ReplicationConfig.TXN_ROLLBACK_LIMIT, JE will automatically truncate the + environment log to remove the unreplicated transactions, and will throw a + RollbackException. The application only needs to reinstantiate the + ReplicatedEnvironment and proceed on. If the limit specified by ReplicationConfig.TXN_ROLLBACK_LIMIT is exceeded, the application will + receive a RollbackProhibitedException to indicate that manual intervention + is required. +

        + The RollbackProhibitedException lets the user interject application specific + processing before the log is truncated. The exception message and getter + methods indicate the number of transactions that must be rolled back, and + the time and id of the earliest targeted transaction, and the user can use + this information to make any desired application adjustments. The + application may then manually truncate the log using DbTruncateLog. +

        + Note that any CommitTokens obtained before restarting this + Replica shouldn't be used after + RollbackProhibitedException is thrown because the token may no + longer exist on the current Master node.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getTruncationFileNumber

            +
            public long getTruncationFileNumber()
            +
          • +
          + + + +
            +
          • +

            getTruncationFileOffset

            +
            public long getTruncationFileOffset()
            +
            The JE log must be truncated to this offset in the specified + file in order for this node to rejoin the group.
            +
          • +
          + + + +
            +
          • +

            getEarliestTransactionCommitTime

            +
            public java.lang.Long getEarliestTransactionCommitTime()
            +
            Return the time in milliseconds of the earliest transaction commit that + will be rolled back if the log is truncated to the location specified by + getTruncationFileNumber() and getTruncationFileOffset()
            +
          • +
          + + + +
            +
          • +

            getEarliestTransactionId

            +
            public long getEarliestTransactionId()
            +
            Return the id of the earliest transaction commit that will be + rolled back if the log is truncated to the location specified by + getTruncationFileNumber() and getTruncationFileOffset()
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/StateChangeEvent.html b/docs/java/com/sleepycat/je/rep/StateChangeEvent.html new file mode 100644 index 0000000..0a4aa9d --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/StateChangeEvent.html @@ -0,0 +1,313 @@ + + + + + +StateChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class StateChangeEvent

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.StateChangeEvent
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class StateChangeEvent
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        Communicates the state change at a node + to the StateChangeListener. There is a distinct instance of this event + representing each state change at a node. +

        + Each event instance may have zero or more state change related exceptions + associated with it. The exceptions are of type StateChangeException. + StateChangeException has a method called StateChangeException.getEvent() that can be used to associate an event with + an exception.

        +
        +
        See Also:
        +
        StateChangeListener, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          longgetEventTime() +
          Returns the time (in nano second units) the event occurred, as reported + by System.nanoTime()
          +
          java.lang.StringgetMasterNodeName() +
          Returns the node name identifying the master at the time of the event.
          +
          ReplicatedEnvironment.StategetState() +
          Returns the state that the node has transitioned to.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getState

            +
            public ReplicatedEnvironment.State getState()
            +
            Returns the state that the node has transitioned to.
            +
            +
            Returns:
            +
            the new State resulting from this event
            +
            +
          • +
          + + + +
            +
          • +

            getEventTime

            +
            public long getEventTime()
            +
            Returns the time (in nano second units) the event occurred, as reported + by System.nanoTime()
            +
            +
            Returns:
            +
            the time the event occurred, in nanoseconds
            +
            +
          • +
          + + + +
            +
          • +

            getMasterNodeName

            +
            public java.lang.String getMasterNodeName()
            +                                   throws java.lang.IllegalStateException
            +
            Returns the node name identifying the master at the time of the event.
            +
            +
            Returns:
            +
            the master node name
            +
            Throws:
            +
            java.lang.IllegalStateException - if the node is in the + DETACHED or UNKNOWN state.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/StateChangeException.html b/docs/java/com/sleepycat/je/rep/StateChangeException.html new file mode 100644 index 0000000..9a7c0f2 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/StateChangeException.html @@ -0,0 +1,349 @@ + + + + + +StateChangeException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class StateChangeException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        MasterStateException, ReplicaStateException, ReplicaWriteException, UnknownMasterException
        +
        +
        +
        +
        public abstract class StateChangeException
        +extends OperationFailureException
        +
        Provides a synchronous mechanism for informing an application about a change + in the state of the replication node. StateChangeException is an abstract + class, with subtypes for each type of Transition. +

        + A single state change can result in multiple state change exceptions (one + per thread operating against the environment). Each exception is associated + with the event that provoked the exception. The application can use this + association to ensure that each such event is processed just once.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + +
          Constructors 
          ModifierConstructor and Description
          protected StateChangeException(java.lang.String message, + java.lang.Exception reason) +
          Used when no state change event is available
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          StateChangeEventgetEvent() +
          Returns the event that resulted in this exception.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            StateChangeException

            +
            protected StateChangeException(java.lang.String message,
            +                               java.lang.Exception reason)
            +
            Used when no state change event is available
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getEvent

            +
            public StateChangeEvent getEvent()
            +
            Returns the event that resulted in this exception.
            +
            +
            Returns:
            +
            the state change event
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/StateChangeListener.html b/docs/java/com/sleepycat/je/rep/StateChangeListener.html new file mode 100644 index 0000000..fbd0711 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/StateChangeListener.html @@ -0,0 +1,262 @@ + + + + + +StateChangeListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Interface StateChangeListener

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface StateChangeListener
        +
        An asynchronous mechanism for tracking the State of the replicated environment and + choosing how to route database operations. State determines which + operations are currently permitted on the node. For example, only the MASTER node can execute write + operations. +

        + The Listener is registered with the replicated environment using ReplicatedEnvironment.setStateChangeListener(StateChangeListener). There + is at most one Listener associated with the actual environment (not an + Environment handle) at any given instance in time. +

        + See the + examples for information on different approaches toward routing + database operations and an example of using the StateChangeListener.

        +
        +
        See Also:
        +
        Managing + Write Requests at a Replica
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            stateChange

            +
            void stateChange(StateChangeEvent stateChangeEvent)
            +          throws java.lang.RuntimeException
            +
            The notification method. It is initially invoked when the StateChangeListener is first associated with the ReplicatedEnvironment via the ReplicatedEnvironment.setStateChangeListener(StateChangeListener) + method and subsequently each time there is a state change. +

            + This method should do the minimal amount of work, queuing any resource + intensive operations for processing by another thread before returning + to the caller, so that it does not unduly delay the other housekeeping + operations performed by the internal thread which invokes this method. +

            +
            +
            Parameters:
            +
            stateChangeEvent - the new state change event
            +
            Throws:
            +
            java.lang.RuntimeException - Any uncaught exceptions will result in the + shutdown of the ReplicatedEnvironment.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/SyncupProgress.html b/docs/java/com/sleepycat/je/rep/SyncupProgress.html new file mode 100644 index 0000000..7303143 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/SyncupProgress.html @@ -0,0 +1,402 @@ + + + + + +SyncupProgress (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Enum SyncupProgress

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<SyncupProgress>
        • +
        • +
            +
          • com.sleepycat.je.rep.SyncupProgress
          • +
          +
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          CHECK_FOR_ROLLBACK +
          A matchpoint has been found, and the replica is determining whether it + has to rollback any uncommitted replicated records applied from the + previous master.
          +
          DO_ROLLBACK +
          The replica is rolling back uncommitted replicated records applied from + the previous master.
          +
          END +
          Replication stream syncup has ended.
          +
          FIND_MATCHPOINT +
          Syncup is starting up.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static SyncupProgressvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static SyncupProgress[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            FIND_MATCHPOINT

            +
            public static final SyncupProgress FIND_MATCHPOINT
            +
            Syncup is starting up. The replica and feeder are searching for the + most recent common shared point in the replication stream.
            +
          • +
          + + + +
            +
          • +

            CHECK_FOR_ROLLBACK

            +
            public static final SyncupProgress CHECK_FOR_ROLLBACK
            +
            A matchpoint has been found, and the replica is determining whether it + has to rollback any uncommitted replicated records applied from the + previous master.
            +
          • +
          + + + +
            +
          • +

            DO_ROLLBACK

            +
            public static final SyncupProgress DO_ROLLBACK
            +
            The replica is rolling back uncommitted replicated records applied from + the previous master.
            +
          • +
          + + + +
            +
          • +

            END

            +
            public static final SyncupProgress END
            +
            Replication stream syncup has ended.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static SyncupProgress[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (SyncupProgress c : SyncupProgress.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static SyncupProgress valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/TimeConsistencyPolicy.html b/docs/java/com/sleepycat/je/rep/TimeConsistencyPolicy.html new file mode 100644 index 0000000..20b862f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/TimeConsistencyPolicy.html @@ -0,0 +1,478 @@ + + + + + +TimeConsistencyPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class TimeConsistencyPolicy

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.TimeConsistencyPolicy
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static java.lang.StringNAME +
          The name:"TimeConsistencyPolicy" associated with this policy.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          TimeConsistencyPolicy(long permissibleLag, + java.util.concurrent.TimeUnit permissibleLagUnit, + long timeout, + java.util.concurrent.TimeUnit timeoutUnit) +
          Specifies the amount of time by which the Replica is allowed to lag the + master when initiating a transaction.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object obj) 
          java.lang.StringgetName() +
          Returns the name:"TimeConsistencyPolicy", associated with this policy.
          +
          longgetPermissibleLag(java.util.concurrent.TimeUnit unit) +
          Returns the allowed time lag associated with this policy.
          +
          longgetTimeout(java.util.concurrent.TimeUnit unit) +
          Returns the consistency timeout associated with this policy.
          +
          inthashCode() 
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            NAME

            +
            public static final java.lang.String NAME
            +
            The name:"TimeConsistencyPolicy" associated with this policy. The name can be used when + constructing policy property values for use in je.properties files.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            TimeConsistencyPolicy

            +
            public TimeConsistencyPolicy(long permissibleLag,
            +                             java.util.concurrent.TimeUnit permissibleLagUnit,
            +                             long timeout,
            +                             java.util.concurrent.TimeUnit timeoutUnit)
            +
            Specifies the amount of time by which the Replica is allowed to lag the + master when initiating a transaction. The Replica ensures that all + transactions that were committed on the Master before this lag interval + are available at the Replica before allowing a transaction to proceed + with Environment.beginTransaction. + + Effective use of this policy requires that the clocks on the Master and + Replica are synchronized by using a protocol like NTP.
            +
            +
            Parameters:
            +
            permissibleLag - the time interval by which the Replica may be out + of date with respect to the Master when a transaction is initiated on + the Replica.
            +
            permissibleLagUnit - the TimeUnit for the permissibleLag + parameter.
            +
            timeout - the amount of time to wait for the consistency to be + reached.
            +
            timeoutUnit - the TimeUnit for the timeout parameter.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the permissibleLagUnit or + timeoutUnit is null.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            getPermissibleLag

            +
            public long getPermissibleLag(java.util.concurrent.TimeUnit unit)
            +
            Returns the allowed time lag associated with this policy.
            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value.
            +
            Returns:
            +
            the permissible lag time in the specified unit.
            +
            +
          • +
          + + + +
            +
          • +

            getTimeout

            +
            public long getTimeout(java.util.concurrent.TimeUnit unit)
            +
            Returns the consistency timeout associated with this policy.
            +
            +
            Specified by:
            +
            getTimeout in interface ReplicaConsistencyPolicy
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value.
            +
            Returns:
            +
            the consistency timeout in the specified unit.
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object obj)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/UnknownMasterException.html b/docs/java/com/sleepycat/je/rep/UnknownMasterException.html new file mode 100644 index 0000000..4fc3b1b --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/UnknownMasterException.html @@ -0,0 +1,351 @@ + + + + + +UnknownMasterException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep
      +

      Class UnknownMasterException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class UnknownMasterException
        +extends StateChangeException
        +
        Indicates that the underlying operation requires communication with a + Master, but that a Master was not available. +

        + This exception typically indicates there is a system level problem. It could + indicate for example, that a sufficient number of nodes are not available to + hold an election and elect a Master, or that this node was having problems + with the network and was unable to communicate with other nodes. +

        + The application can choose to retry the operation, potentially logging the + problem, until the underlying system level problem has been addressed.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          UnknownMasterException(com.sleepycat.je.txn.Locker locker, + StateChangeEvent stateChangeEvent) 
          UnknownMasterException(java.lang.String message) +
          Used when the inability to determine a master is not related to a + state change.
          +
          UnknownMasterException(java.lang.String message, + java.lang.Exception reason) +
          Used when the inability to determine a master is not related to a + state change but some inability to communicate with a node identified + as a master.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            UnknownMasterException

            +
            public UnknownMasterException(com.sleepycat.je.txn.Locker locker,
            +                              StateChangeEvent stateChangeEvent)
            +
          • +
          + + + +
            +
          • +

            UnknownMasterException

            +
            public UnknownMasterException(java.lang.String message)
            +
            Used when the inability to determine a master is not related to a + state change.
            +
          • +
          + + + +
            +
          • +

            UnknownMasterException

            +
            public UnknownMasterException(java.lang.String message,
            +                              java.lang.Exception reason)
            +
            Used when the inability to determine a master is not related to a + state change but some inability to communicate with a node identified + as a master. The reason contains further explanation.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/Arbiter.html b/docs/java/com/sleepycat/je/rep/arbiter/Arbiter.html new file mode 100644 index 0000000..f17ebc4 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/Arbiter.html @@ -0,0 +1,406 @@ + + + + + +Arbiter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.arbiter
      +

      Class Arbiter

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.arbiter.Arbiter
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class Arbiter
        +extends java.lang.Object
        +
        Provides a mechanism to allow write availability for the Replication + group even when the number of replication nodes is less than majority. + The main use of an Arbiter is when the replication group consists of + two nodes. The addition of an Arbiter to the replication group + allows for one node to fail and provide write availability with ACK + durability of SIMPLE_MAJORITY. The Arbiter acknowledges the transaction, + but does not retain a copy of the data. The Arbiter persists a + small amount of state to insure that only the Replication nodes that + contain the Arbiter acknowledged transactions may become a Master. +

        + The Arbiter node participates in elections and may acknowledge transaction + commits. +

        + The Arbiter state is as follows: + UNKNOWN [ UNKNOWN | REPLICA]+ DETACHED

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Arbiter

            +
            public Arbiter(ArbiterConfig arbiterConfig)
            +        throws EnvironmentNotFoundException,
            +               EnvironmentLockedException,
            +               DatabaseException,
            +               java.lang.IllegalArgumentException
            +
            An Arbiter used in elections and transaction acknowledgments. + This method returns when a connection to the current master + replication node is made. The Arbiter.shutdown() method is + used to shutdown the threads that run as part of the Arbiter.
            +
            +
            Parameters:
            +
            arbiterConfig - Configuration parameters for the Arbiter.
            +
            Throws:
            +
            EnvironmentNotFoundException - if the environment does not exist
            +
            EnvironmentLockedException - when an environment cannot be opened + because another Arbiter has the environment open.
            +
            DatabaseException - problem establishing connection to the master.
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified, + for example, an invalid ArbiterConfig parameter.
            +
            +
          • +
          +
        • +
        + + +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/ArbiterConfig.html b/docs/java/com/sleepycat/je/rep/arbiter/ArbiterConfig.html new file mode 100644 index 0000000..827c502 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/ArbiterConfig.html @@ -0,0 +1,680 @@ + + + + + +ArbiterConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.arbiter
      +

      Class ArbiterConfig

      +
      +
      + +
      + +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ArbiterConfig

            +
            public ArbiterConfig()
            +
            Arbiter configuration.
            +
          • +
          + + + +
            +
          • +

            ArbiterConfig

            +
            public ArbiterConfig(java.util.Properties props)
            +
            Arbiter configuration.
            +
            +
            Parameters:
            +
            props - to initialize configuration object.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getArbiterHome

            +
            public java.lang.String getArbiterHome()
            +
            Gets the Arbiter home directory.
            +
            +
            Returns:
            +
            Path of the Arbiter home directory.
            +
            +
          • +
          + + + +
            +
          • +

            setArbiterHome

            +
            public void setArbiterHome(java.lang.String arbiterHome)
            +
            Sets the Arbiter Home directory
            +
            +
            Parameters:
            +
            arbiterHome - Path of the Arbiter home directory.
            +
            +
          • +
          + + + +
            +
          • +

            setNodeName

            +
            public ArbiterConfig setNodeName(java.lang.String nodeName)
            +                          throws java.lang.IllegalArgumentException
            +
            Sets the name to be associated with this Arbiter. It must + be unique within the group. When the Arbiter is + instantiated and joins the replication group, a check is done to ensure + that the name is unique, and a + RestartRequiredException is thrown if it is + not.
            +
            +
            Parameters:
            +
            nodeName - the name of this arbiter.
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            +
          • +
          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the unique name associated with this Arbiter.
            +
            +
            Returns:
            +
            the Arbiter name
            +
            +
          • +
          + + + +
            +
          • +

            setGroupName

            +
            public ArbiterConfig setGroupName(java.lang.String groupName)
            +                           throws java.lang.IllegalArgumentException
            +
            Sets the name for the replication group. The name must be made up of + just alpha numeric characters and must not be zero length.
            +
            +
            Parameters:
            +
            groupName - the alpha numeric string representing the name.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the string name is not valid.
            +
            +
          • +
          + + + +
            +
          • +

            getGroupName

            +
            public java.lang.String getGroupName()
            +
            Gets the name associated with the replication group.
            +
            +
            Returns:
            +
            the name of this replication group.
            +
            +
          • +
          + + + +
            +
          • +

            setNodeHostPort

            +
            public ArbiterConfig setNodeHostPort(java.lang.String hostPort)
            +
            Sets the hostname and port associated with this arbiter. The hostname + and port combination are denoted by a string of the form: +
            +  hostname[:port]
            + 
            + The port must be outside the range of "Well Known Ports" + (zero through 1023).
            +
            +
            Parameters:
            +
            hostPort - the string containing the hostname and port as above.
            +
            +
          • +
          + + + +
            +
          • +

            getNodeHostPort

            +
            public java.lang.String getNodeHostPort()
            +
            Returns the hostname and port associated with this node. The hostname + and port combination are denoted by a string of the form: +
            +  hostname:port
            + 
            +
            +
            Returns:
            +
            the hostname and port string of this Arbiter.
            +
            +
          • +
          + + + +
            +
          • +

            setUnknownStateTimeout

            +
            public ArbiterConfig setUnknownStateTimeout(long timeout,
            +                                            java.util.concurrent.TimeUnit unit)
            +                                     throws java.lang.IllegalArgumentException
            +
            Time to wait for the discovery of the Master during the instantiation + of the Arbiter. If no Master is found with in the timeout period, + the Arbiter constructor return with the Arbiter in the UNKNOWN state.
            +
            +
            Parameters:
            +
            timeout - The unknown state timeout. A value of 0 turns off + Unknown state timeouts. The creation of the Arbiter will wait until + a Master is found.
            +
            unit - the TimeUnit of the timeout value. May be null only + if timeout is zero.
            +
            Returns:
            +
            this
            +
            Throws:
            +
            java.lang.IllegalArgumentException - If the value of timeout is negative
            +
            +
          • +
          + + + +
            +
          • +

            getUnknownStateTimeout

            +
            public long getUnknownStateTimeout(java.util.concurrent.TimeUnit unit)
            +
            Returns the Unknown state timeout. + +

            A value of 0 means Unknown state timeouts are not configured.

            +
            +
            Parameters:
            +
            unit - the TimeUnit of the returned value. May not be null.
            +
            Returns:
            +
            The transaction timeout.
            +
            +
          • +
          + + + +
            +
          • +

            setHeartbeatInterval

            +
            public ArbiterConfig setHeartbeatInterval(int millis)
            +
            Sets the heartbeat interval.
            +
            +
            Parameters:
            +
            millis - Interval in milliseconds.
            +
            Returns:
            +
            this
            +
            +
          • +
          + + + +
            +
          • +

            getHeartbeatInterval

            +
            public int getHeartbeatInterval()
            +
            Gets the heartbeat interval in milliseconds.
            +
            +
            Returns:
            +
            Heartbeat interval.
            +
            +
          • +
          + + + +
            +
          • +

            setConfigParam

            +
            public ArbiterConfig setConfigParam(java.lang.String paramName,
            +                                    java.lang.String value)
            +                             throws java.lang.IllegalArgumentException
            +
            Documentation inherited from ArbiterMutableConfig.setConfigParam.
            +
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setLoggingHandler

            +
            public ArbiterConfig setLoggingHandler(java.util.logging.Handler handler)
            +
          • +
          + + + +
            +
          • +

            getLoggingHandler

            +
            public java.util.logging.Handler getLoggingHandler()
            +
            Returns the custom java.util.logging.Handler specified by the + application.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Display configuration values.
            +
            +
            Overrides:
            +
            toString in class ArbiterMutableConfig
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/ArbiterMutableConfig.html b/docs/java/com/sleepycat/je/rep/arbiter/ArbiterMutableConfig.html new file mode 100644 index 0000000..fd31683 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/ArbiterMutableConfig.html @@ -0,0 +1,473 @@ + + + + + +ArbiterMutableConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.arbiter
      +

      Class ArbiterMutableConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
        • +
        +
      • +
      +
      + +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setHelperHosts

            +
            public ArbiterMutableConfig setHelperHosts(java.lang.String helperHosts)
            +
            Identify one or more helpers nodes by their host and port pairs in this + format: +
            + hostname[:port][,hostname[:port]]*
            + 
            +
            +
            Parameters:
            +
            helperHosts - the string representing the host and port pairs.
            +
            +
          • +
          + + + +
            +
          • +

            getHelperHosts

            +
            public java.lang.String getHelperHosts()
            +
            Returns the string identifying one or more helper host and port pairs in + this format: +
            + hostname[:port][,hostname[:port]]*
            + 
            +
            +
            Returns:
            +
            the string representing the host port pairs.
            +
            +
          • +
          + + + +
            +
          • +

            setFileLoggingLevel

            +
            public ArbiterMutableConfig setFileLoggingLevel(java.lang.String val)
            +
            Trace messages equal and above this level will be logged to the je.info + file, which is in the Arbiter home directory. Value should + be one of the predefined java.util.logging.Level values. +

            + +

            + + + + + + + +
            NameTypeMutableDefault
            com.sleepycat.je.util.FileHandler.levelStringNo"INFO"

            +
            +
            Parameters:
            +
            val - value of the logging level.
            +
            Returns:
            +
            ArbiterConfig.
            +
            See Also:
            +
            Chapter 12. Logging
            +
            +
          • +
          + + + +
            +
          • +

            getFileLoggingLevel

            +
            public java.lang.String getFileLoggingLevel()
            +
            Gets the file logging level.
            +
            +
            Returns:
            +
            logging level
            +
            +
          • +
          + + + +
            +
          • +

            setConsoleLoggingLevel

            +
            public ArbiterMutableConfig setConsoleLoggingLevel(java.lang.String val)
            +
            Trace messages equal and above this level will be logged to the + console. Value should be one of the predefined + java.util.logging.Level values. + +

            + + + + + + + +
            NameTypeMutableDefault
            com.sleepycat.je.util.ConsoleHandler.levelStringNo"OFF"

            +
            +
            Parameters:
            +
            val - Logging level.
            +
            Returns:
            +
            this.
            +
            See Also:
            +
            Chapter 12. Logging
            +
            +
          • +
          + + + +
            +
          • +

            getConsoleLoggingLevel

            +
            public java.lang.String getConsoleLoggingLevel()
            +
            Gets the console logging level.
            +
            +
            Returns:
            +
            logging level
            +
            +
          • +
          + + + + + + + +
            +
          • +

            clone

            +
            public ArbiterMutableConfig clone()
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            getProps

            +
            public java.util.Properties getProps()
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Display configuration values.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/ArbiterStats.html b/docs/java/com/sleepycat/je/rep/arbiter/ArbiterStats.html new file mode 100644 index 0000000..b536c9e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/ArbiterStats.html @@ -0,0 +1,376 @@ + + + + + +ArbiterStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.arbiter
      +

      Class ArbiterStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.arbiter.ArbiterStats
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          longgetAcks() +
          The number of transactions that has been + acknowledged.
          +
          longgetDTVLSN() +
          The highest commit DTVLSN that has been + acknowledged.
          +
          longgetFSyncs() +
          The number of file fsyncs.
          +
          java.lang.StringgetMaster() +
          The current master node.
          +
          longgetReplayQueueOverflow() +
          The number of attempts to queue a response when + the queue was full.
          +
          java.lang.StringgetState() +
          The ReplicatedEnvironment.State of the node.
          +
          longgetVLSN() +
          The highest commit VLSN that has been + acknowledged.
          +
          longgetWrites() +
          The number of file writes.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getReplayQueueOverflow

            +
            public long getReplayQueueOverflow()
            +
            The number of attempts to queue a response when + the queue was full.
            +
          • +
          + + + +
            +
          • +

            getAcks

            +
            public long getAcks()
            +
            The number of transactions that has been + acknowledged.
            +
          • +
          + + + +
            +
          • +

            getMaster

            +
            public java.lang.String getMaster()
            +
            The current master node.
            +
          • +
          + + + +
            +
          • +

            getState

            +
            public java.lang.String getState()
            +
            The ReplicatedEnvironment.State of the node.
            +
          • +
          + + + +
            +
          • +

            getVLSN

            +
            public long getVLSN()
            +
            The highest commit VLSN that has been + acknowledged.
            +
          • +
          + + + +
            +
          • +

            getDTVLSN

            +
            public long getDTVLSN()
            +
            The highest commit DTVLSN that has been + acknowledged.
            +
          • +
          + + + +
            +
          • +

            getWrites

            +
            public long getWrites()
            +
            The number of file writes.
            +
          • +
          + + + +
            +
          • +

            getFSyncs

            +
            public long getFSyncs()
            +
            The number of file fsyncs.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/class-use/Arbiter.html b/docs/java/com/sleepycat/je/rep/arbiter/class-use/Arbiter.html new file mode 100644 index 0000000..9c500e7 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/class-use/Arbiter.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.arbiter.Arbiter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.arbiter.Arbiter

      +
      +
      No usage of com.sleepycat.je.rep.arbiter.Arbiter
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterConfig.html b/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterConfig.html new file mode 100644 index 0000000..a4e8ab1 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterConfig.html @@ -0,0 +1,228 @@ + + + + + +Uses of Class com.sleepycat.je.rep.arbiter.ArbiterConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.arbiter.ArbiterConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterMutableConfig.html b/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterMutableConfig.html new file mode 100644 index 0000000..5eb1851 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterMutableConfig.html @@ -0,0 +1,233 @@ + + + + + +Uses of Class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.arbiter.ArbiterMutableConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterStats.html b/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterStats.html new file mode 100644 index 0000000..2b814dc --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/class-use/ArbiterStats.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.je.rep.arbiter.ArbiterStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.arbiter.ArbiterStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/package-frame.html b/docs/java/com/sleepycat/je/rep/arbiter/package-frame.html new file mode 100644 index 0000000..0c09bc9 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/package-frame.html @@ -0,0 +1,23 @@ + + + + + +com.sleepycat.je.rep.arbiter (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.rep.arbiter

      + + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/package-summary.html b/docs/java/com/sleepycat/je/rep/arbiter/package-summary.html new file mode 100644 index 0000000..7f7c0b0 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/package-summary.html @@ -0,0 +1,179 @@ + + + + + +com.sleepycat.je.rep.arbiter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.rep.arbiter

      +
      +
      Provides a mechanism to allow write availability for the Replication +group even when the number of replication nodes is less than majority.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        Arbiter +
        Provides a mechanism to allow write availability for the Replication + group even when the number of replication nodes is less than majority.
        +
        ArbiterConfig +
        The configuration parameters for an Arbiter.
        +
        ArbiterMutableConfig +
        The mutable configuration parameters for an Arbiter.
        +
        ArbiterStats +
        Statistics for an Arbiter.
        +
        +
      • +
      + + + +

      Package com.sleepycat.je.rep.arbiter Description

      +
      Provides a mechanism to allow write availability for the Replication +group even when the number of replication nodes is less than majority.
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/package-tree.html b/docs/java/com/sleepycat/je/rep/arbiter/package-tree.html new file mode 100644 index 0000000..8f25005 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/package-tree.html @@ -0,0 +1,148 @@ + + + + + +com.sleepycat.je.rep.arbiter Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.rep.arbiter

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      +
        +
      • java.lang.Object +
          +
        • com.sleepycat.je.rep.arbiter.Arbiter
        • +
        • com.sleepycat.je.rep.arbiter.ArbiterMutableConfig (implements java.lang.Cloneable) +
            +
          • com.sleepycat.je.rep.arbiter.ArbiterConfig (implements java.lang.Cloneable)
          • +
          +
        • +
        • com.sleepycat.je.rep.arbiter.ArbiterStats (implements java.io.Serializable)
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/arbiter/package-use.html b/docs/java/com/sleepycat/je/rep/arbiter/package-use.html new file mode 100644 index 0000000..8b52bb9 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/arbiter/package-use.html @@ -0,0 +1,177 @@ + + + + + +Uses of Package com.sleepycat.je.rep.arbiter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.rep.arbiter

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/AppStateMonitor.html b/docs/java/com/sleepycat/je/rep/class-use/AppStateMonitor.html new file mode 100644 index 0000000..4f815e4 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/AppStateMonitor.html @@ -0,0 +1,176 @@ + + + + + +Uses of Interface com.sleepycat.je.rep.AppStateMonitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.rep.AppStateMonitor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/CommitPointConsistencyPolicy.html b/docs/java/com/sleepycat/je/rep/class-use/CommitPointConsistencyPolicy.html new file mode 100644 index 0000000..90265df --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/CommitPointConsistencyPolicy.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.CommitPointConsistencyPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.CommitPointConsistencyPolicy

      +
      +
      No usage of com.sleepycat.je.rep.CommitPointConsistencyPolicy
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/DatabasePreemptedException.html b/docs/java/com/sleepycat/je/rep/class-use/DatabasePreemptedException.html new file mode 100644 index 0000000..efe02ed --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/DatabasePreemptedException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.DatabasePreemptedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.DatabasePreemptedException

      +
      +
      No usage of com.sleepycat.je.rep.DatabasePreemptedException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/GroupShutdownException.html b/docs/java/com/sleepycat/je/rep/class-use/GroupShutdownException.html new file mode 100644 index 0000000..4c63e05 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/GroupShutdownException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.GroupShutdownException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.GroupShutdownException

      +
      +
      No usage of com.sleepycat.je.rep.GroupShutdownException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/InsufficientAcksException.html b/docs/java/com/sleepycat/je/rep/class-use/InsufficientAcksException.html new file mode 100644 index 0000000..5ab4d93 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/InsufficientAcksException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.InsufficientAcksException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.InsufficientAcksException

      +
      +
      No usage of com.sleepycat.je.rep.InsufficientAcksException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/InsufficientLogException.html b/docs/java/com/sleepycat/je/rep/class-use/InsufficientLogException.html new file mode 100644 index 0000000..0df603a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/InsufficientLogException.html @@ -0,0 +1,202 @@ + + + + + +Uses of Class com.sleepycat.je.rep.InsufficientLogException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.InsufficientLogException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/InsufficientReplicasException.html b/docs/java/com/sleepycat/je/rep/class-use/InsufficientReplicasException.html new file mode 100644 index 0000000..116f9e9 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/InsufficientReplicasException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.InsufficientReplicasException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.InsufficientReplicasException

      +
      +
      No usage of com.sleepycat.je.rep.InsufficientReplicasException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/LockPreemptedException.html b/docs/java/com/sleepycat/je/rep/class-use/LockPreemptedException.html new file mode 100644 index 0000000..fed2667 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/LockPreemptedException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.LockPreemptedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.LockPreemptedException

      +
      +
      No usage of com.sleepycat.je.rep.LockPreemptedException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/LogOverwriteException.html b/docs/java/com/sleepycat/je/rep/class-use/LogOverwriteException.html new file mode 100644 index 0000000..f8488b6 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/LogOverwriteException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.LogOverwriteException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.LogOverwriteException

      +
      +
      No usage of com.sleepycat.je.rep.LogOverwriteException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/MasterReplicaTransitionException.html b/docs/java/com/sleepycat/je/rep/class-use/MasterReplicaTransitionException.html new file mode 100644 index 0000000..a366565 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/MasterReplicaTransitionException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.MasterReplicaTransitionException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.MasterReplicaTransitionException

      +
      +
      No usage of com.sleepycat.je.rep.MasterReplicaTransitionException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/MasterStateException.html b/docs/java/com/sleepycat/je/rep/class-use/MasterStateException.html new file mode 100644 index 0000000..2851727 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/MasterStateException.html @@ -0,0 +1,183 @@ + + + + + +Uses of Class com.sleepycat.je.rep.MasterStateException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.MasterStateException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/MasterTransferFailureException.html b/docs/java/com/sleepycat/je/rep/class-use/MasterTransferFailureException.html new file mode 100644 index 0000000..65eb56d --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/MasterTransferFailureException.html @@ -0,0 +1,177 @@ + + + + + +Uses of Class com.sleepycat.je.rep.MasterTransferFailureException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.MasterTransferFailureException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/MemberNotFoundException.html b/docs/java/com/sleepycat/je/rep/class-use/MemberNotFoundException.html new file mode 100644 index 0000000..8c956d5 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/MemberNotFoundException.html @@ -0,0 +1,183 @@ + + + + + +Uses of Class com.sleepycat.je.rep.MemberNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.MemberNotFoundException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/NetworkRestore.html b/docs/java/com/sleepycat/je/rep/class-use/NetworkRestore.html new file mode 100644 index 0000000..4caad50 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/NetworkRestore.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.NetworkRestore (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.NetworkRestore

      +
      +
      No usage of com.sleepycat.je.rep.NetworkRestore
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/NetworkRestoreConfig.html b/docs/java/com/sleepycat/je/rep/class-use/NetworkRestoreConfig.html new file mode 100644 index 0000000..c7d82be --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/NetworkRestoreConfig.html @@ -0,0 +1,207 @@ + + + + + +Uses of Class com.sleepycat.je.rep.NetworkRestoreConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.NetworkRestoreConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/NoConsistencyRequiredPolicy.html b/docs/java/com/sleepycat/je/rep/class-use/NoConsistencyRequiredPolicy.html new file mode 100644 index 0000000..d88f9ab --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/NoConsistencyRequiredPolicy.html @@ -0,0 +1,175 @@ + + + + + +Uses of Class com.sleepycat.je.rep.NoConsistencyRequiredPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.NoConsistencyRequiredPolicy

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/NodeState.html b/docs/java/com/sleepycat/je/rep/class-use/NodeState.html new file mode 100644 index 0000000..21830b8 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/NodeState.html @@ -0,0 +1,180 @@ + + + + + +Uses of Class com.sleepycat.je.rep.NodeState (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.NodeState

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/NodeType.html b/docs/java/com/sleepycat/je/rep/class-use/NodeType.html new file mode 100644 index 0000000..c231aa6 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/NodeType.html @@ -0,0 +1,209 @@ + + + + + +Uses of Class com.sleepycat.je.rep.NodeType (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.NodeType

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/QuorumPolicy.html b/docs/java/com/sleepycat/je/rep/class-use/QuorumPolicy.html new file mode 100644 index 0000000..d60c374 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/QuorumPolicy.html @@ -0,0 +1,200 @@ + + + + + +Uses of Class com.sleepycat.je.rep.QuorumPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.QuorumPolicy

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicaConsistencyException.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicaConsistencyException.html new file mode 100644 index 0000000..916128e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicaConsistencyException.html @@ -0,0 +1,186 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicaConsistencyException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicaConsistencyException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicaStateException.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicaStateException.html new file mode 100644 index 0000000..38d7a40 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicaStateException.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicaStateException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicaStateException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicaWriteException.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicaWriteException.html new file mode 100644 index 0000000..8b1a016 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicaWriteException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicaWriteException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicaWriteException

      +
      +
      No usage of com.sleepycat.je.rep.ReplicaWriteException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.State.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.State.html new file mode 100644 index 0000000..1d27de0 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.State.html @@ -0,0 +1,229 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicatedEnvironment.State (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicatedEnvironment.State

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.html new file mode 100644 index 0000000..f8c78d6 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironment.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicatedEnvironment (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicatedEnvironment

      +
      +
      No usage of com.sleepycat.je.rep.ReplicatedEnvironment
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironmentStats.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironmentStats.html new file mode 100644 index 0000000..cbb6306 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicatedEnvironmentStats.html @@ -0,0 +1,175 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicatedEnvironmentStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicatedEnvironmentStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicationConfig.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicationConfig.html new file mode 100644 index 0000000..fcf68bf --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicationConfig.html @@ -0,0 +1,294 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicationConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicationConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicationGroup.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicationGroup.html new file mode 100644 index 0000000..07ae90a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicationGroup.html @@ -0,0 +1,235 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicationGroup (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicationGroup

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicationMutableConfig.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicationMutableConfig.html new file mode 100644 index 0000000..5fd04d1 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicationMutableConfig.html @@ -0,0 +1,233 @@ + + + + + +Uses of Class com.sleepycat.je.rep.ReplicationMutableConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.ReplicationMutableConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/ReplicationNode.html b/docs/java/com/sleepycat/je/rep/class-use/ReplicationNode.html new file mode 100644 index 0000000..9191c54 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/ReplicationNode.html @@ -0,0 +1,329 @@ + + + + + +Uses of Interface com.sleepycat.je.rep.ReplicationNode (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.rep.ReplicationNode

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/RestartRequiredException.html b/docs/java/com/sleepycat/je/rep/class-use/RestartRequiredException.html new file mode 100644 index 0000000..f3277fa --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/RestartRequiredException.html @@ -0,0 +1,217 @@ + + + + + +Uses of Class com.sleepycat.je.rep.RestartRequiredException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.RestartRequiredException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/RollbackException.html b/docs/java/com/sleepycat/je/rep/class-use/RollbackException.html new file mode 100644 index 0000000..35d958c --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/RollbackException.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.rep.RollbackException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.RollbackException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/RollbackProhibitedException.html b/docs/java/com/sleepycat/je/rep/class-use/RollbackProhibitedException.html new file mode 100644 index 0000000..17393b8 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/RollbackProhibitedException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.RollbackProhibitedException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.RollbackProhibitedException

      +
      +
      No usage of com.sleepycat.je.rep.RollbackProhibitedException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/StateChangeEvent.html b/docs/java/com/sleepycat/je/rep/class-use/StateChangeEvent.html new file mode 100644 index 0000000..1bdd638 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/StateChangeEvent.html @@ -0,0 +1,202 @@ + + + + + +Uses of Class com.sleepycat.je.rep.StateChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.StateChangeEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/StateChangeException.html b/docs/java/com/sleepycat/je/rep/class-use/StateChangeException.html new file mode 100644 index 0000000..a318924 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/StateChangeException.html @@ -0,0 +1,200 @@ + + + + + +Uses of Class com.sleepycat.je.rep.StateChangeException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.StateChangeException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/StateChangeListener.html b/docs/java/com/sleepycat/je/rep/class-use/StateChangeListener.html new file mode 100644 index 0000000..fa1a88f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/StateChangeListener.html @@ -0,0 +1,192 @@ + + + + + +Uses of Interface com.sleepycat.je.rep.StateChangeListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.rep.StateChangeListener

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/SyncupProgress.html b/docs/java/com/sleepycat/je/rep/class-use/SyncupProgress.html new file mode 100644 index 0000000..87bad2a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/SyncupProgress.html @@ -0,0 +1,212 @@ + + + + + +Uses of Class com.sleepycat.je.rep.SyncupProgress (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.SyncupProgress

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/TimeConsistencyPolicy.html b/docs/java/com/sleepycat/je/rep/class-use/TimeConsistencyPolicy.html new file mode 100644 index 0000000..1beef49 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/TimeConsistencyPolicy.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.TimeConsistencyPolicy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.TimeConsistencyPolicy

      +
      +
      No usage of com.sleepycat.je.rep.TimeConsistencyPolicy
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/class-use/UnknownMasterException.html b/docs/java/com/sleepycat/je/rep/class-use/UnknownMasterException.html new file mode 100644 index 0000000..13646cb --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/class-use/UnknownMasterException.html @@ -0,0 +1,240 @@ + + + + + +Uses of Class com.sleepycat.je.rep.UnknownMasterException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.UnknownMasterException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.GroupChangeType.html b/docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.GroupChangeType.html new file mode 100644 index 0000000..3fe12eb --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.GroupChangeType.html @@ -0,0 +1,357 @@ + + + + + +GroupChangeEvent.GroupChangeType (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Enum GroupChangeEvent.GroupChangeType

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ADD +
          A new node was added to the replication group.
          +
          REMOVE +
          A node was removed from the replication group.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static GroupChangeEvent.GroupChangeTypevalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static GroupChangeEvent.GroupChangeType[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static GroupChangeEvent.GroupChangeType[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (GroupChangeEvent.GroupChangeType c : GroupChangeEvent.GroupChangeType.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static GroupChangeEvent.GroupChangeType valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.html b/docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.html new file mode 100644 index 0000000..5574e93 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/GroupChangeEvent.html @@ -0,0 +1,322 @@ + + + + + +GroupChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class GroupChangeEvent

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class GroupChangeEvent
        +extends MonitorChangeEvent
        +
        The event generated when the group composition changes. A new instance of + this event is generated each time a node is added or removed from the + group. Note that SECONDARY nodes do not generate these events.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getRepGroup

            +
            public ReplicationGroup getRepGroup()
            +
            Returns the current description of the replication group.
            +
          • +
          + + + +
            +
          • +

            getChangeType

            +
            public GroupChangeEvent.GroupChangeType getChangeType()
            +
            Returns the type of the change (the addition of a new member or the + removal of an existing member) made to the group. The method + MonitorChangeEvent.getNodeName + can be used to identify the node that triggered the event.
            +
            +
            Returns:
            +
            the group change type.
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/JoinGroupEvent.html b/docs/java/com/sleepycat/je/rep/monitor/JoinGroupEvent.html new file mode 100644 index 0000000..2cd4124 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/JoinGroupEvent.html @@ -0,0 +1,293 @@ + + + + + +JoinGroupEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class JoinGroupEvent

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class JoinGroupEvent
        +extends MemberChangeEvent
        +
        The event generated when a node joins the group. A new instance of this + event is generated each time a node joins the group. + + The event is generated on a "best effort" basis. It may not be generated, + for example, if the joining node was unable to communicate with the monitor + due to a network problem. The application must be resilient in the face of + such missing events.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getJoinTime

            +
            public java.util.Date getJoinTime()
            +
            Returns the time at which the node joined the group.
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.LeaveReason.html b/docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.LeaveReason.html new file mode 100644 index 0000000..4b863cb --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.LeaveReason.html @@ -0,0 +1,372 @@ + + + + + +LeaveGroupEvent.LeaveReason (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Enum LeaveGroupEvent.LeaveReason

      +
      +
      +
        +
      • java.lang.Object
      • +
      • + +
      • +
      +
      + +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static LeaveGroupEvent.LeaveReasonvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static LeaveGroupEvent.LeaveReason[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static LeaveGroupEvent.LeaveReason[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (LeaveGroupEvent.LeaveReason c : LeaveGroupEvent.LeaveReason.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static LeaveGroupEvent.LeaveReason valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.html b/docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.html new file mode 100644 index 0000000..9305ce8 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/LeaveGroupEvent.html @@ -0,0 +1,348 @@ + + + + + +LeaveGroupEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class LeaveGroupEvent

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class LeaveGroupEvent
        +extends MemberChangeEvent
        +
        The event generated when a node leaves the group. A new instance of this + event is generated each time a node leaves the group. + + The events is generated on a "best effort" basis. It may not be generated if + the node leaving the group dies before it has a chance to generate the + event, for example, if the process was killed, or the node was unable to + communicate with the monitor due to a network problem. The application must + be resilient in the face of such missing events.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getJoinTime

            +
            public java.util.Date getJoinTime()
            +
            +
            Returns:
            +
            the time this node joins the group.
            +
            +
          • +
          + + + +
            +
          • +

            getLeaveTime

            +
            public java.util.Date getLeaveTime()
            +
            Returns the time at which the node left the group.
            +
          • +
          + + + + + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/MemberChangeEvent.html b/docs/java/com/sleepycat/je/rep/monitor/MemberChangeEvent.html new file mode 100644 index 0000000..594e99f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/MemberChangeEvent.html @@ -0,0 +1,264 @@ + + + + + +MemberChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class MemberChangeEvent

      +
      +
      + +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetMasterName() +
          Returns the name of the master at the time of this event.
          +
          + +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getMasterName

            +
            public java.lang.String getMasterName()
            +
            Returns the name of the master at the time of this event. The return + value may be null if there is no current master.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/Monitor.html b/docs/java/com/sleepycat/je/rep/monitor/Monitor.html new file mode 100644 index 0000000..426112e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/Monitor.html @@ -0,0 +1,594 @@ + + + + + +Monitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class Monitor

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.monitor.Monitor
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class Monitor
        +extends java.lang.Object
        +
        Provides a lightweight mechanism to track the current master node and the + members of the replication group. The information provided by the monitor + can be used to route update requests to the node that is currently the + master and distribute read requests across the other members of the group. +

        + The Monitor is typically run on a machine that participates in load + balancing, request routing or is simply serving as a basis for application + level monitoring and does not have a replicated environment. To avoid + creating a single point of failure, an application may need to create + multiple monitor instances, with each monitor running on a distinct machine. +

        + Applications with direct access to a ReplicatedEnvironment can use + its + synchronous and asynchronous mechanisms for determining the master node + and group composition changes. The Monitor class is not needed by such + applications. +

        + The Monitor generally learns about changes to group status through events + issued by replication group members. In addition, the Monitor maintains a + daemon thread which periodically pings members of the group so that the + Monitor can proactively discover group status changes that occur when it is + down or has lost network connectivity. +

        + The following code excerpt illustrates the typical code sequence used to + initiate a Monitor. Exception handling has been omitted to simplify the + example. + +

        + MonitorConfig monConfig = new MonitorConfig();
        + monConfig.setGroupName("PlanetaryRepGroup");
        + monConfig.setNodeName("mon1");
        + monConfig.setNodeHostPort("monhost1.acme.com:7000");
        + monConfig.setHelperHosts("mars.acme.com:5000,jupiter.acme.com:5000");
        +
        + Monitor monitor = new Monitor(monConfig);
        +
        + // If the monitor has not been registered as a member of the group,
        + // register it now. register() returns the current node that is the
        + // master.
        +
        + ReplicationNode currentMaster = monitor.register();
        +
        + // Start up the listener, so that it can be used to track changes
        + // in the master node, or group composition. It can also be used to help
        + // determine the electable nodes that are currently active and participating
        + // in the replication group.
        + monitor.startListener(new MyChangeListener());
        + 
        +
        +
        See Also:
        +
        MonitorChangeListener, +Writing Monitor + Nodes, +je.rep.quote + Examples
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          ReplicationGroupgetGroup() +
          Returns the current composition of the group.
          +
          java.lang.StringgetGroupName() +
          Returns the name of the group associated with the Monitor.
          +
          java.lang.StringgetMasterNodeName() +
          Identifies the master of the replication group, resulting from the last + successful election.
          +
          java.net.InetSocketAddressgetMonitorSocketAddress() +
          Returns the socket used by this monitor to listen for group changes
          +
          java.lang.StringgetNodeName() +
          Returns the group-wide unique name associated with the monitor
          +
          ReplicationNoderegister() +
          Registers the monitor with the group so that it can be kept informed + of the outcome of elections and group membership changes.
          +
          voidshutdown() +
          Release monitor resources and shut down the monitor.
          +
          voidstartListener(MonitorChangeListener newListener) +
          Starts the listener so it's actively listening for election results and + broadcasts of replication group changes.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Monitor

            +
            @Deprecated
            +public Monitor(ReplicationConfig monitorConfig)
            +
            Deprecated. As of JE 5, replaced by + Monitor(MonitorConfig)
            +
            Deprecated as of JE5. Creates a monitor instance using a ReplicationConfig. Monitor-specific properties that are not available + in ReplicationConfig use default settings.
            +
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          + + + +
            +
          • +

            Monitor

            +
            public Monitor(MonitorConfig monitorConfig)
            +
            Creates a monitor instance. +

            +
            +
            Parameters:
            +
            monitorConfig - configuration used by a Monitor
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getGroupName

            +
            public java.lang.String getGroupName()
            +
            Returns the name of the group associated with the Monitor.
            +
            +
            Returns:
            +
            the group name
            +
            +
          • +
          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the group-wide unique name associated with the monitor
            +
            +
            Returns:
            +
            the monitor name
            +
            +
          • +
          + + + +
            +
          • +

            getMonitorSocketAddress

            +
            public java.net.InetSocketAddress getMonitorSocketAddress()
            +
            Returns the socket used by this monitor to listen for group changes
            +
            +
            Returns:
            +
            the monitor socket address
            +
            +
          • +
          + + + +
            +
          • +

            register

            +
            public ReplicationNode register()
            +                         throws EnvironmentFailureException
            +
            Registers the monitor with the group so that it can be kept informed + of the outcome of elections and group membership changes. The + monitor, just like a replication node, is identified by its nodeName. + The Monitor uses the helper nodes to locate a master with which it can + register itself. If the helper nodes are not available the registration + will fail. +

            + A monitor must be registered at least once in order to be informed of + ongoing election results and group changes. Attempts to re-register the + same monitor are ignored. Registration, once it has been completed + successfully, persists beyond the lifetime of the Monitor instance and + does not need to be repeated. Repeated registrations are benign and + merely confirm that the current monitor configuration is consistent with + earlier registrations of this monitor.

            +
            +
            Returns:
            +
            the node that is the current master
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the monitor has been shutdown, or no + helper sockets were specified at Monitor initialization.
            +
            +
          • +
          + + + +
            +
          • +

            startListener

            +
            public void startListener(MonitorChangeListener newListener)
            +                   throws DatabaseException,
            +                          java.io.IOException
            +
            Starts the listener so it's actively listening for election results and + broadcasts of replication group changes. +

            + register() should be called before starting the listener. + If the monitor has not been registered, it will not be updated, and its + listener will not be invoked. +

            + Once the registration has been completed, the Monitor can start + listening even if none of the other nodes in the group are available. + It will be contacted automatically by the other nodes as they come up. +

            + If the group has a Master, invoking startListener results + in a synchronous callback to the application via the MonitorChangeListener.notify(NewMasterEvent) method. If there is no + Master at this time, the callback takes place asynchronously, after the + method returns, when a Master is eventually elected. +

            + Starting the listener will start the underlying ping thread, which + proactively checks group status for changes that might have been + missed when this Monitor instance has lost network connectivity or + is down.

            +
            +
            Parameters:
            +
            newListener - the listener used to monitor events of interest.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.io.IOException - if the monitor socket could not be set up
            +
            java.lang.IllegalArgumentException - if an invalid parameter is specified.
            +
            java.lang.IllegalStateException - if the monitor has been shutdown, or a + listener has already been established.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            getMasterNodeName

            +
            public java.lang.String getMasterNodeName()
            +                                   throws UnknownMasterException
            +
            Identifies the master of the replication group, resulting from the last + successful election. This method relies on the helper nodes supplied + to the monitor and queries them for the master. + + This method is useful when a Monitor first starts up and the Master + needs to be determined. Once a Monitor is registered and the Listener + has been started, it's kept up to date via events that are delivered + to the Listener.
            +
            +
            Returns:
            +
            the id associated with the master replication node.
            +
            Throws:
            +
            UnknownMasterException - if the master could not be determined + from the set of helpers made available to the Monitor.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the monitor has been shutdown.
            +
            +
          • +
          + + + +
            +
          • +

            getGroup

            +
            public ReplicationGroup getGroup()
            +                          throws UnknownMasterException,
            +                                 DatabaseException
            +
            Returns the current composition of the group. It does so by first + querying the helpers to determine the master and then obtaining the + group information from the master.
            +
            +
            Returns:
            +
            an instance of RepGroup denoting the current composition of the + group
            +
            Throws:
            +
            UnknownMasterException - if the master could not be determined + from the set of helpers made available to the Monitor.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if the monitor has been shutdown.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            shutdown

            +
            public void shutdown()
            +              throws java.lang.InterruptedException
            +
            Release monitor resources and shut down the monitor.
            +
            +
            Throws:
            +
            java.lang.InterruptedException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/MonitorChangeEvent.html b/docs/java/com/sleepycat/je/rep/monitor/MonitorChangeEvent.html new file mode 100644 index 0000000..c9961a8 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/MonitorChangeEvent.html @@ -0,0 +1,254 @@ + + + + + +MonitorChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class MonitorChangeEvent

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.monitor.MonitorChangeEvent
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetNodeName() +
          Returns the name of the node associated with the event.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the name of the node associated with the event.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/MonitorChangeListener.html b/docs/java/com/sleepycat/je/rep/monitor/MonitorChangeListener.html new file mode 100644 index 0000000..8540847 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/MonitorChangeListener.html @@ -0,0 +1,329 @@ + + + + + +MonitorChangeListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Interface MonitorChangeListener

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface MonitorChangeListener
        +
        Applications can register for Monitor event notification through + Monitor.startListener(com.sleepycat.je.rep.monitor.MonitorChangeListener). The interface defines an overloaded notify + event for each event supported by the Monitor. +

        + Changes in the composition of the replication group, or in the dynamic state + of a member, are communicated to the listener as events that are represented + as subclasses of MonitorChangeEvent. Classes + implementing this interface supply implementations for a notify + associated with each type of event, so they can respond with some + application-specific course of action. +

        + See Replication Guide, Writing Monitor Nodes

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            notify

            +
            void notify(NewMasterEvent newMasterEvent)
            +
            The method is invoked whenever there is new master associated with the + replication group. + + If the method throws an exception, JE will log the exception as a trace + message, which will be propagated through the usual channels.
            +
            +
            Parameters:
            +
            newMasterEvent - the event that resulted in the notify. It + identifies the new master.
            +
            +
          • +
          + + + +
            +
          • +

            notify

            +
            void notify(GroupChangeEvent groupChangeEvent)
            +
            The method is invoked whenever there is a change in the composition of + the replication group. That is, a new node has been added to the group + or an existing member has been removed from the group. Note that + SECONDARY nodes do not produce these events. + + If the method throws an exception, JE will log the exception as a trace + message, which will be propagated through the usual channels.
            +
            +
            Parameters:
            +
            groupChangeEvent - the event that resulted in the notify. It + describes the new group composition and identifies the node that + provoked the change.
            +
            +
          • +
          + + + +
            +
          • +

            notify

            +
            void notify(JoinGroupEvent joinGroupEvent)
            +
            The method is invoked whenever a node joins the group, by successfully + opening its first + ReplicatedEnvironment handle.
            +
            +
            Parameters:
            +
            joinGroupEvent - the event that resulted in the notify. It + identifies the node that joined the group.
            +
            +
          • +
          + + + +
            +
          • +

            notify

            +
            void notify(LeaveGroupEvent leaveGroupEvent)
            +
            The method is invoked whenever a node leaves the group by closing its + last ReplicatedEnvironment handle.
            +
            +
            Parameters:
            +
            leaveGroupEvent - the event that resulted in the notify. It + identifies the node that left the group.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/MonitorConfig.html b/docs/java/com/sleepycat/je/rep/monitor/MonitorConfig.html new file mode 100644 index 0000000..9f4e9d8 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/MonitorConfig.html @@ -0,0 +1,706 @@ + + + + + +MonitorConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class MonitorConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.monitor.MonitorConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class MonitorConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Specifies the attributes used by a replication Monitor. +

        + The following properties identify the target group. +

          +
        • groupName: the name of the replication group being monitored.
        • +
        • nodeName: the group-wide unique name associated with this + monitor node.
        • +
        • nodeHost: the hostname and port associated with this Monitor. Used + by group members to contact the Monitor.
        • +
        • helperHosts: the list of replication nodes which the Monitor uses to + register itself so it can receive notifications about group status + changes.
        • +
        + The following properties configure the daemon ping thread implemented + within the Monitor. This daemon thread lets the Monitor proactively find + status changes that occur when the Monitor is down or has lost network + connectivity. +
          +
        • numRetries: number of times the ping thread attempts to contact a + node before deeming is unreachable.
        • +
        • retryInterval: number of milliseconds between ping thread retries. +
        • +
        • timeout: socketConnection timeout, in milliseconds, specified + when the ping thread attempts to establish a connection with a replication + node.
        • +
        +
        +
        Since:
        +
        JE 5.0
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static MonitorConfigDEFAULT +
          An instance created using the default constructor is initialized with + the default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          MonitorConfig() +
          An instance created using the default constructor is initialized with + the default settings.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          MonitorConfigclone() +
          Returns a copy of this configuration object.
          +
          java.lang.StringgetGroupName() +
          Gets the name associated with the replication group.
          +
          java.lang.StringgetHelperHosts() +
          Returns the string identifying one or more helper host and port pairs in + this format:
          +
          java.lang.StringgetNodeHostname() +
          Returns the hostname component of the nodeHost property.
          +
          java.lang.StringgetNodeHostPort() +
          Returns the hostname and port associated with this node.
          +
          java.lang.StringgetNodeName() +
          Returns the unique name associated with this monitor.
          +
          intgetNodePort() +
          Returns the port component of the nodeHost property.
          +
          intgetNumRetries() +
          Returns the number of times a ping thread attempts to contact a node + before deeming it unreachable.
          +
          longgetRetryInterval() +
          Returns the number of milliseconds between ping thread retries.
          +
          intgetSocketConnectTimeout() +
          Returns the socketConnection timeout, in milliseconds, used + when the ping thread attempts to establish a connection with a + replication node.
          +
          MonitorConfigsetGroupName(java.lang.String groupName) +
          Sets the name for the replication group.
          +
          MonitorConfigsetHelperHosts(java.lang.String helperHosts) +
          Identify one or more helpers nodes by their host and port pairs in this + format:
          +
          MonitorConfigsetNodeHostPort(java.lang.String hostPort) +
          Sets the hostname and port associated with this monitor.
          +
          MonitorConfigsetNodeName(java.lang.String nodeName) +
          Sets the name to be associated with this monitor.
          +
          MonitorConfigsetNumRetries(int numRetries) +
          Sets the number of times a ping thread attempts to contact a node + before deeming it unreachable.
          +
          MonitorConfigsetRetryInterval(long retryInterval) +
          Sets the number of milliseconds between ping thread retries.
          +
          MonitorConfigsetSocketConnectTimeout(int socketConnectTimeout) +
          Sets the socketConnection timeout, in milliseconds, used + when the ping thread attempts to establish a connection with a + replication node.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final MonitorConfig DEFAULT
            +
            An instance created using the default constructor is initialized with + the default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            MonitorConfig

            +
            public MonitorConfig()
            +
            An instance created using the default constructor is initialized with + the default settings.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            setGroupName

            +
            public MonitorConfig setGroupName(java.lang.String groupName)
            +                           throws java.lang.IllegalArgumentException
            +
            Sets the name for the replication group. The name must be made up of + just alpha numeric characters and must not be zero length.
            +
            +
            Parameters:
            +
            groupName - the alpha numeric string representing the name.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the string name is not valid.
            +
            +
          • +
          + + + +
            +
          • +

            getGroupName

            +
            public java.lang.String getGroupName()
            +
            Gets the name associated with the replication group.
            +
            +
            Returns:
            +
            the name of this replication group.
            +
            +
          • +
          + + + +
            +
          • +

            setNodeName

            +
            public MonitorConfig setNodeName(java.lang.String nodeName)
            +                          throws java.lang.IllegalArgumentException
            +
            Sets the name to be associated with this monitor. It must + be unique within the group. When the monitor is + instantiated and joins the replication group, a check is done to ensure + that the name is unique, and a + RestartRequiredException is thrown if it is + not.
            +
            +
            Parameters:
            +
            nodeName - the name of this monitor.
            +
            Throws:
            +
            java.lang.IllegalArgumentException
            +
            +
          • +
          + + + +
            +
          • +

            getNodeName

            +
            public java.lang.String getNodeName()
            +
            Returns the unique name associated with this monitor.
            +
            +
            Returns:
            +
            the monitor name
            +
            +
          • +
          + + + +
            +
          • +

            setNodeHostPort

            +
            public MonitorConfig setNodeHostPort(java.lang.String hostPort)
            +
            Sets the hostname and port associated with this monitor. The hostname + and port combination are denoted by a string of the form: +
            +  hostname[:port]
            + 
            + The port must be outside the range of "Well Known Ports" + (zero through 1023).
            +
            +
            Parameters:
            +
            hostPort - the string containing the hostname and port as above.
            +
            +
          • +
          + + + +
            +
          • +

            getNodeHostPort

            +
            public java.lang.String getNodeHostPort()
            +
            Returns the hostname and port associated with this node. The hostname + and port combination are denoted by a string of the form: +
            +  hostname:port
            + 
            +
            +
            Returns:
            +
            the hostname and port string of this monitor.
            +
            +
          • +
          + + + +
            +
          • +

            setHelperHosts

            +
            public MonitorConfig setHelperHosts(java.lang.String helperHosts)
            +
            Identify one or more helpers nodes by their host and port pairs in this + format: +
            + hostname[:port][,hostname[:port]]*
            + 
            +
            +
            Parameters:
            +
            helperHosts - the string representing the host and port pairs.
            +
            +
          • +
          + + + +
            +
          • +

            getHelperHosts

            +
            public java.lang.String getHelperHosts()
            +
            Returns the string identifying one or more helper host and port pairs in + this format: +
            + hostname[:port][,hostname[:port]]*
            + 
            +
            +
            Returns:
            +
            the string representing the host port pairs.
            +
            +
          • +
          + + + +
            +
          • +

            getNodeHostname

            +
            public java.lang.String getNodeHostname()
            +
            Returns the hostname component of the nodeHost property.
            +
            +
            Returns:
            +
            the hostname string
            +
            +
          • +
          + + + +
            +
          • +

            getNodePort

            +
            public int getNodePort()
            +
            Returns the port component of the nodeHost property.
            +
            +
            Returns:
            +
            the port number
            +
            +
          • +
          + + + +
            +
          • +

            setNumRetries

            +
            public MonitorConfig setNumRetries(int numRetries)
            +
            Sets the number of times a ping thread attempts to contact a node + before deeming it unreachable. + The default value is 5.
            +
          • +
          + + + +
            +
          • +

            getNumRetries

            +
            public int getNumRetries()
            +
            Returns the number of times a ping thread attempts to contact a node + before deeming it unreachable.
            +
          • +
          + + + +
            +
          • +

            setRetryInterval

            +
            public MonitorConfig setRetryInterval(long retryInterval)
            +
            Sets the number of milliseconds between ping thread retries. The default + value is 1000.
            +
          • +
          + + + +
            +
          • +

            getRetryInterval

            +
            public long getRetryInterval()
            +
            Returns the number of milliseconds between ping thread retries.
            +
          • +
          + + + +
            +
          • +

            setSocketConnectTimeout

            +
            public MonitorConfig setSocketConnectTimeout(int socketConnectTimeout)
            +
            Sets the socketConnection timeout, in milliseconds, used + when the ping thread attempts to establish a connection with a + replication node. The default value is 10,000.
            +
          • +
          + + + +
            +
          • +

            getSocketConnectTimeout

            +
            public int getSocketConnectTimeout()
            +
            Returns the socketConnection timeout, in milliseconds, used + when the ping thread attempts to establish a connection with a + replication node.
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public MonitorConfig clone()
            +
            Returns a copy of this configuration object.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/MonitorConfigBeanInfo.html b/docs/java/com/sleepycat/je/rep/monitor/MonitorConfigBeanInfo.html new file mode 100644 index 0000000..bf55a96 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/MonitorConfigBeanInfo.html @@ -0,0 +1,351 @@ + + + + + +MonitorConfigBeanInfo (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class MonitorConfigBeanInfo

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.beans.BeanInfo
        +
        +
        +
        +
        public class MonitorConfigBeanInfo
        +extends ConfigBeanInfoBase
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            MonitorConfigBeanInfo

            +
            public MonitorConfigBeanInfo()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getBeanDescriptor

            +
            public java.beans.BeanDescriptor getBeanDescriptor()
            +
            +
            Specified by:
            +
            getBeanDescriptor in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getBeanDescriptor in class java.beans.SimpleBeanInfo
            +
            +
          • +
          + + + +
            +
          • +

            getPropertyDescriptors

            +
            public java.beans.PropertyDescriptor[] getPropertyDescriptors()
            +
            +
            Specified by:
            +
            getPropertyDescriptors in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getPropertyDescriptors in class java.beans.SimpleBeanInfo
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/NewMasterEvent.html b/docs/java/com/sleepycat/je/rep/monitor/NewMasterEvent.html new file mode 100644 index 0000000..549470a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/NewMasterEvent.html @@ -0,0 +1,288 @@ + + + + + +NewMasterEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.monitor
      +

      Class NewMasterEvent

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class NewMasterEvent
        +extends MemberChangeEvent
        +
        The event generated upon detecting a new Master. A new instance of this + event is generated each time a new master is elected for the group.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getSocketAddress

            +
            public java.net.InetSocketAddress getSocketAddress()
            +
            Returns the socket address associated with the new master
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.GroupChangeType.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.GroupChangeType.html new file mode 100644 index 0000000..2891d39 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.GroupChangeType.html @@ -0,0 +1,189 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.GroupChangeEvent.GroupChangeType (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.GroupChangeEvent.GroupChangeType

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.html new file mode 100644 index 0000000..c6cbbe1 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/GroupChangeEvent.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.GroupChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.GroupChangeEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/JoinGroupEvent.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/JoinGroupEvent.html new file mode 100644 index 0000000..c382da6 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/JoinGroupEvent.html @@ -0,0 +1,177 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.JoinGroupEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.JoinGroupEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.LeaveReason.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.LeaveReason.html new file mode 100644 index 0000000..a5ebb34 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.LeaveReason.html @@ -0,0 +1,188 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.LeaveGroupEvent.LeaveReason (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.LeaveGroupEvent.LeaveReason

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.html new file mode 100644 index 0000000..e4b43bd --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/LeaveGroupEvent.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.LeaveGroupEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.LeaveGroupEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/MemberChangeEvent.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/MemberChangeEvent.html new file mode 100644 index 0000000..b157c1e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/MemberChangeEvent.html @@ -0,0 +1,187 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.MemberChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.MemberChangeEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/Monitor.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/Monitor.html new file mode 100644 index 0000000..aab7923 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/Monitor.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.Monitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.Monitor

      +
      +
      No usage of com.sleepycat.je.rep.monitor.Monitor
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeEvent.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeEvent.html new file mode 100644 index 0000000..a1be27f --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeEvent.html @@ -0,0 +1,199 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.MonitorChangeEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.MonitorChangeEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeListener.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeListener.html new file mode 100644 index 0000000..c54a68a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorChangeListener.html @@ -0,0 +1,176 @@ + + + + + +Uses of Interface com.sleepycat.je.rep.monitor.MonitorChangeListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.je.rep.monitor.MonitorChangeListener

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfig.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfig.html new file mode 100644 index 0000000..e97b257 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfig.html @@ -0,0 +1,250 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.MonitorConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.MonitorConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfigBeanInfo.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfigBeanInfo.html new file mode 100644 index 0000000..066bea1 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/MonitorConfigBeanInfo.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.MonitorConfigBeanInfo (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.MonitorConfigBeanInfo

      +
      +
      No usage of com.sleepycat.je.rep.monitor.MonitorConfigBeanInfo
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/class-use/NewMasterEvent.html b/docs/java/com/sleepycat/je/rep/monitor/class-use/NewMasterEvent.html new file mode 100644 index 0000000..9334342 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/class-use/NewMasterEvent.html @@ -0,0 +1,176 @@ + + + + + +Uses of Class com.sleepycat.je.rep.monitor.NewMasterEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.monitor.NewMasterEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/package-frame.html b/docs/java/com/sleepycat/je/rep/monitor/package-frame.html new file mode 100644 index 0000000..450602c --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/package-frame.html @@ -0,0 +1,37 @@ + + + + + +com.sleepycat.je.rep.monitor (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.rep.monitor

      + + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/package-summary.html b/docs/java/com/sleepycat/je/rep/monitor/package-summary.html new file mode 100644 index 0000000..169a28d --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/package-summary.html @@ -0,0 +1,261 @@ + + + + + +com.sleepycat.je.rep.monitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.rep.monitor

      +
      +
      BDB JE HA support for applications that need to track the composition of a +replication group, in order to do tasks such as load balancing and +request routing.
      +
      +

      See: Description

      +
      +
      + + + + +

      Package com.sleepycat.je.rep.monitor Description

      +
      BDB JE HA support for applications that need to track the composition of a +replication group, in order to do tasks such as load balancing and +request routing. + +

      Package Specification

      +The Monitor is intended for applications that do not directly +reference ReplicatedEnvironment, but need to track the composition of +a replication group and the current Master. A Monitor tracks changes +in replication group membership and roles.
      +
      +
      See Also:
      +
      Replication Guide, Writing Monitor Nodes
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/package-tree.html b/docs/java/com/sleepycat/je/rep/monitor/package-tree.html new file mode 100644 index 0000000..d79e8e2 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/package-tree.html @@ -0,0 +1,181 @@ + + + + + +com.sleepycat.je.rep.monitor Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.rep.monitor

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      + +

      Enum Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/monitor/package-use.html b/docs/java/com/sleepycat/je/rep/monitor/package-use.html new file mode 100644 index 0000000..c393894 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/monitor/package-use.html @@ -0,0 +1,214 @@ + + + + + +Uses of Package com.sleepycat.je.rep.monitor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.rep.monitor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/package-frame.html b/docs/java/com/sleepycat/je/rep/package-frame.html new file mode 100644 index 0000000..6099f72 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/package-frame.html @@ -0,0 +1,66 @@ + + + + + +com.sleepycat.je.rep (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.rep

      + + + diff --git a/docs/java/com/sleepycat/je/rep/package-summary.html b/docs/java/com/sleepycat/je/rep/package-summary.html new file mode 100644 index 0000000..466317a --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/package-summary.html @@ -0,0 +1,553 @@ + + + + + +com.sleepycat.je.rep (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.rep

      +
      +
      +Berkeley DB Java Edition High Availability (JE HA) enables replication of JE +environments.
      +
      +

      See: Description

      +
      +
      + + + + +

      Package com.sleepycat.je.rep Description

      +
      +Berkeley DB Java Edition High Availability (JE HA) enables replication of JE +environments. JE HA is an embedded database management +system designed to provide fast, reliable, and scalable data +management. A JE environment is replicated across the nodes of a +single read/write Master, multiple read only Replica Replication +Group. JE HA is used to improve application availability, provide +improved read performance, and increase data durability. +

      Getting Started

      +The +Replication +Guide is invaluable for understanding the capabilities of JE HA +and how best to design your replicated application. +
      +

      +The +Introduction +covers terminology, the replication group +lifecycle, and the concepts of durability and consistency. Much of the +javadoc refers to the topics covered there. +

      +Replication +API First Steps explains how to configure and start a replication +group. +

      +Transaction Management + highlights the tradeoffs that must be considered in a replicated +application and provides some use cases. +

      +In addition, the +je.rep.quote example +package provides three example replication applications. + +

      What the com.sleepycat.je.rep package contains

      +
      Replication control
      +
        +
      • ReplicatedEnvironment is the main access point to + replication.
      • +
      • ReplicationConfig and + ReplicationMutableConfig specify attributes of the + replication system.
      • +
      +
      Administration
      +
        +
      • + ReplicationNode and ReplicationGroup supply + administrative views of the replication system. +
      • +
      +
      Support
      +
        +
      • + StateChangeListener and StateChangeEvent + implement a Listener pattern for tracking changes in the replication system. +
      • +
      • + CommitPointConsistencyPolicy, + TimeConsistencyPolicy and + NoConsistencyPolicy let the user control the read only + replica's view of the the replicated data. +
      • +
      • + ReplicatedEnviromentStats provide feedback on system execution. +
      • +
      + +

      Related Packages

      +
        +
      • +com.sleepycat.je.rep.monitor lets the application track +the replication system in order to do tasks such as load balancing and +write request routing. +
      • +
      • +com.sleepycat.je.rep.util provides command line and +programmatic APIs for administering and starting up a replication +system. +
      • +
      +

      Related Documentation

      +
      +
      See Also:
      +
      Replication Guide, + + JE HA Examples
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/package-tree.html b/docs/java/com/sleepycat/je/rep/package-tree.html new file mode 100644 index 0000000..e68f547 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/package-tree.html @@ -0,0 +1,238 @@ + + + + + +com.sleepycat.je.rep Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.rep

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      + +

      Enum Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/package-use.html b/docs/java/com/sleepycat/je/rep/package-use.html new file mode 100644 index 0000000..0068af0 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/package-use.html @@ -0,0 +1,412 @@ + + + + + +Uses of Package com.sleepycat.je.rep (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.rep

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + + + + + +
        Packages that use com.sleepycat.je.rep 
        PackageDescription
        com.sleepycat.je.rep +
        +Berkeley DB Java Edition High Availability (JE HA) enables replication of JE +environments.
        +
        com.sleepycat.je.rep.arbiter +
        Provides a mechanism to allow write availability for the Replication +group even when the number of replication nodes is less than majority.
        +
        com.sleepycat.je.rep.monitor +
        BDB JE HA support for applications that need to track the composition of a +replication group, in order to do tasks such as load balancing and +request routing.
        +
        com.sleepycat.je.rep.util +
        BDB JE High Availability command line utilities and helper classes.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Classes in com.sleepycat.je.rep used by com.sleepycat.je.rep 
        Class and Description
        AppStateMonitor +
        A mechanism for adding application specific information when asynchronously + tracking the state of a running JE HA application.
        +
        InsufficientLogException +
        This exception indicates that the log files constituting the Environment are + insufficient and cannot be used as the basis for continuing with the + replication stream provided by the current master.
        +
        NetworkRestoreConfig +
        NetworkRestoreConfig defines the configuration parameters used to configure + a NetworkRestore operation.
        +
        NoConsistencyRequiredPolicy +
        A consistency policy that lets a transaction on a replica using this policy + proceed regardless of the state of the Replica relative to the Master.
        +
        NodeType +
        The different types of nodes that can be in a replication group.
        +
        QuorumPolicy +
        The quorum policy determine the number of nodes that must participate to + pick the winner of an election, and therefore the master of the group.
        +
        ReplicaConsistencyException +
        This exception is thrown by a Replica to indicate it could not meet the + consistency requirements as defined by the + ReplicaConsistencyPolicy in effect for the transaction, within + the allowed timeout period.
        +
        ReplicatedEnvironment.State +
        The replication node state determines the operations that the + application can perform against its replicated environment.
        +
        ReplicatedEnvironmentStats +
        Statistics for a replicated environment.
        +
        ReplicationConfig +
        Specifies the immutable attributes of a replicated environment.
        +
        ReplicationGroup +
        An administrative view of the collection of nodes that form the replication + group.
        +
        ReplicationMutableConfig +
        Specifies the attributes that may be changed after a ReplicatedEnvironment has been created.
        +
        ReplicationNode +
        An administrative view of a node in a replication group.
        +
        RestartRequiredException +
        RestartRequiredException serves as the base class for all exceptions which + makes it impossible for HA to proceed without some form of corrective action + on the part of the user, followed by a restart of the application.
        +
        RollbackException +
        This asynchronous exception indicates that a new master has been selected, + this Replica's log is ahead of the current Master, + and in this case, the Replica was unable to rollback without a + recovery.
        +
        StateChangeEvent +
        Communicates the state change at a node + to the StateChangeListener.
        +
        StateChangeException +
        Provides a synchronous mechanism for informing an application about a change + in the state of the replication node.
        +
        StateChangeListener +
        An asynchronous mechanism for tracking the State of the replicated environment and + choosing how to route database operations.
        +
        SyncupProgress +
        Describes the different phases of replication stream syncup that are + executed when a replica starts working with a new replication group master.
        +
        +
      • +
      • + + + + + + + + + + + + +
        Classes in com.sleepycat.je.rep used by com.sleepycat.je.rep.arbiter 
        Class and Description
        ReplicatedEnvironment.State +
        The replication node state determines the operations that the + application can perform against its replicated environment.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + +
        Classes in com.sleepycat.je.rep used by com.sleepycat.je.rep.monitor 
        Class and Description
        ReplicationConfig +
        Specifies the immutable attributes of a replicated environment.
        +
        ReplicationGroup +
        An administrative view of the collection of nodes that form the replication + group.
        +
        ReplicationNode +
        An administrative view of a node in a replication group.
        +
        UnknownMasterException +
        Indicates that the underlying operation requires communication with a + Master, but that a Master was not available.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Classes in com.sleepycat.je.rep used by com.sleepycat.je.rep.util 
        Class and Description
        MasterStateException +
        This exception indicates that the application attempted an operation that is + not permitted when it is in the ReplicatedEnvironment.State.MASTER + state.
        +
        MasterTransferFailureException +
        Thrown by ReplicatedEnvironment.transferMaster(java.util.Set<java.lang.String>, int, java.util.concurrent.TimeUnit) if a Master Transfer + operation cannot be completed within the allotted time.
        +
        MemberNotFoundException +
        Thrown when an operation requires a replication group member and that member + is not present in the replication group.
        +
        NodeState +
        The current state of a replication node and the application this node is + running in.
        +
        ReplicaStateException +
        This exception indicates that the application attempted an operation that is + not permitted when it is in the ReplicatedEnvironment.State.REPLICA + state.
        +
        ReplicationGroup +
        An administrative view of the collection of nodes that form the replication + group.
        +
        ReplicationNode +
        An administrative view of a node in a replication group.
        +
        UnknownMasterException +
        Indicates that the underlying operation requires communication with a + Master, but that a Master was not available.
        +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/AtomicLongMax.html b/docs/java/com/sleepycat/je/rep/util/AtomicLongMax.html new file mode 100644 index 0000000..22f3eaf --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/AtomicLongMax.html @@ -0,0 +1,316 @@ + + + + + +AtomicLongMax (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.util
      +

      Class AtomicLongMax

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.util.AtomicLongMax
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class AtomicLongMax
        +extends java.lang.Object
        +
        An Atomic long that maintains a max value
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          AtomicLongMax(long initialValue) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          longget() +
          Gets the current value.
          +
          longset(long newValue) +
          Set the value to newValue and returns the old value.
          +
          longupdateMax(long newMax) +
          Updates the max value if the argument is greater than the current max.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            AtomicLongMax

            +
            public AtomicLongMax(long initialValue)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            updateMax

            +
            public long updateMax(long newMax)
            +
            Updates the max value if the argument is greater than the current max.
            +
          • +
          + + + +
            +
          • +

            get

            +
            public long get()
            +
            Gets the current value.
            +
            +
            Returns:
            +
            the current value
            +
            +
          • +
          + + + +
            +
          • +

            set

            +
            public long set(long newValue)
            +
            Set the value to newValue and returns the old value.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/DbEnableReplication.html b/docs/java/com/sleepycat/je/rep/util/DbEnableReplication.html new file mode 100644 index 0000000..ff13850 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/DbEnableReplication.html @@ -0,0 +1,394 @@ + + + + + +DbEnableReplication (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.util
      +

      Class DbEnableReplication

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.util.DbEnableReplication
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbEnableReplication
        +extends java.lang.Object
        +
        A utility to convert an existing, non replicated JE environment for + replication. This is useful when the user wants to initially prototype and + develop a standalone transactional application, and then add replication as + a second stage. +

        + JE HA environment log files contain types of log records and metadata used + only by replication. Non replicated environments are lacking that + information and must undergo a one time conversion process to add that + metadata and enable replication. The conversion process is one way. Once an + environment directory is converted, the rules that govern ReplicatedEnvironment apply; namely, the directory cannot be opened by a + read/write standalone Environment. Only a minimum + amount of replication metadata is added, and the conversion process is not + dependent on the size of the existing directory. +

        + The conversion process takes these steps: +

          +
        1. Use DbEnableReplication to convert an existing environment + directory. DbEnableReplication can be used as a command line + utility, and must be executed locally on the host which houses the + environment directory. Alternatively, DbEnableReplication may be + used programmatically through the provided APIs. +
        2. +
        3. Once converted, the environment directory may be treated as an existing + master node, and can be opened with a ReplicatedEnvironment. No + helper host configuration is needed. +
        4. Additional nodes may be created and can join the group as newly created + replicas, as described in ReplicatedEnvironment. Since these new + nodes are empty, they should be configured to use the converted master as + their helper node, and will go through the + replication node lifecycle to populate their environment + directories. In this case, there will be data in the converted master that + can only be transferred to the replica through a file copy executed with the + help of a NetworkRestore +
        5. +
        +

        + For example: +

        + // Create the first node using an existing environment 
        + DbEnableReplication converter = 
        +     new DbEnableReplication(envDirMars,          // env home dir
        +                             "UniversalRepGroup", // group name
        +                             "nodeMars",          // node name
        +                             "mars:5001");        // node host,port
        + converter.convert();
        +
        + ReplicatedEnvironment nodeMars = new ReplicatedEnvironment(envDirMars, ...);
        + 
        + // Bring up additional nodes, which will be initialized from 
        + // nodeMars.
        + ReplicationConfig repConfig = null;
        + try {
        +     repConfig = new ReplicationConfig("UniversalRepGroup", // groupName
        +                                       "nodeVenus",         // nodeName
        +                                       "venus:5008");       // nodeHostPort
        +     repConfig.setHelperHosts("mars:5001");
        + 
        +     nodeVenus = new ReplicatedEnvironment(envDirB, repConfig, envConfig);
        + } catch (InsufficientLogException insufficientLogEx) {
        + 
        +     // log files will be copied from another node in the group
        +     NetworkRestore restore = new NetworkRestore();
        +     restore.execute(insufficientLogEx, new NetworkRestoreConfig());
        +     
        +     // try opening the node now
        +     nodeVenus = new ReplicatedEnvironment(envDirVenus, 
        +                                           repConfig,
        +                                           envConfig);
        + }
        + ...
        + 
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbEnableReplication(java.io.File envHome, + java.lang.String groupName, + java.lang.String nodeName, + java.lang.String nodeHostPort) +
          Create a DbEnableReplication object for this node.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidconvert() +
          Modify the log files in the environment directory to add a modicum of + replication required metadata.
          +
          static voidmain(java.lang.String[] args) +
          Usage:
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbEnableReplication

            +
            public DbEnableReplication(java.io.File envHome,
            +                           java.lang.String groupName,
            +                           java.lang.String nodeName,
            +                           java.lang.String nodeHostPort)
            +
            Create a DbEnableReplication object for this node.
            +
            +
            Parameters:
            +
            envHome - The node's environment directory
            +
            groupName - The name of the new replication group
            +
            nodeName - The node's name
            +
            nodeHostPort - The host and port for this node
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] args)
            +
            Usage: +
            + java -cp je.jar com.sleepycat.je.rep.util.DbEnableReplication
            +   -h <dir>                          # environment home directory
            +   -groupName <group name>           # replication group name
            +   -nodeName <node name>             # replicated node name
            +   -nodeHostPort <host name:port number> # host name or IP address
            +                                             and port number to use
            +                                             for this node
            + 
            +
          • +
          + + + +
            +
          • +

            convert

            +
            public void convert()
            +
            Modify the log files in the environment directory to add a modicum of + replication required metadata.
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/DbGroupAdmin.html b/docs/java/com/sleepycat/je/rep/util/DbGroupAdmin.html new file mode 100644 index 0000000..4b936e0 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/DbGroupAdmin.html @@ -0,0 +1,429 @@ + + + + + +DbGroupAdmin (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.util
      +

      Class DbGroupAdmin

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.util.DbGroupAdmin
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbGroupAdmin
        +extends java.lang.Object
        +
        DbGroupAdmin supplies the functionality of the administrative class ReplicationGroupAdmin in a convenient command line utility. For example, it + can be used to display replication group information, or to remove a node + from the replication group. +

        + Note: This utility does not handle security and authorization. It is left + to the user to ensure that the utility is invoked with proper authorization. +

        + See main(java.lang.String...) for a full description of the command line + arguments.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbGroupAdmin(java.lang.String groupName, + java.util.Set<java.net.InetSocketAddress> helperSockets) +
          Create a DbGroupAdmin instance for programmatic use.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voiddumpGroup() +
          Display group information.
          +
          static voidmain(java.lang.String... args) +
          Usage:
          +
          voidremoveMember(java.lang.String name) +
          Remove a node from the replication group.
          +
          voidtransferMaster(java.lang.String nodeList, + java.lang.String timeout) +
          Transfers the master role from the current master to one of the + electable replicas specified in the argument list.
          +
          voidupdateAddress(java.lang.String nodeName, + java.lang.String newHostName, + int newPort) +
          Update the network address for a specified node.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbGroupAdmin

            +
            public DbGroupAdmin(java.lang.String groupName,
            +                    java.util.Set<java.net.InetSocketAddress> helperSockets)
            +
            Create a DbGroupAdmin instance for programmatic use.
            +
            +
            Parameters:
            +
            groupName - replication group name
            +
            helperSockets - set of host and port pairs for group members which + can be queried to obtain group information.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String... args)
            +                 throws java.lang.Exception
            +
            Usage: +
            + java {com.sleepycat.je.rep.util.DbGroupAdmin |
            +       -jar je-<version>.jar DbGroupAdmin}
            +   -groupName <group name>  # name of replication group
            +   -helperHosts <host:port> # identifier for one or more members
            +                            # of the replication group which can be
            +                            # contacted for group information, in
            +                            # this format:
            +                            # hostname[:port][,hostname[:port]]*
            +   -dumpGroup               # dump group information
            +   -removeMember <node name># node to be removed
            +   -updateAddress <node name> <new host:port>
            +                            # update the network address for a specified
            +                            # node. The node should not be alive when
            +                            # updating address
            +   -transferMaster [-force] <node1,node2,...> <timeout>
            +                            # transfer master role to one of the
            +                            # specified nodes.
            + 
            +
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            dumpGroup

            +
            public void dumpGroup()
            +
            Display group information. Lists all members and the group master. Can + be used when reviewing the group configuration.
            +
          • +
          + + + +
            +
          • +

            removeMember

            +
            public void removeMember(java.lang.String name)
            +
            Remove a node from the replication group. Once removed, a + node cannot be added again to the group under the same node name. + +

            Secondary nodes cannot be removed; they + automatically leave the group when they are shut down or become + disconnected from the master.

            +
            +
            Parameters:
            +
            name - name of the node to be removed
            +
            See Also:
            +
            ReplicationGroupAdmin.removeMember(java.lang.String)
            +
            +
          • +
          + + + +
            +
          • +

            updateAddress

            +
            public void updateAddress(java.lang.String nodeName,
            +                          java.lang.String newHostName,
            +                          int newPort)
            +
            Update the network address for a specified node. When updating the + address of a node, the node cannot be alive. See ReplicationGroupAdmin.updateAddress(java.lang.String, java.lang.String, int) for more information. + +

            The address of a NodeType.SECONDARY node cannot be updated + with this method, since nodes must be members but not alive to be + updated, and secondary nodes are not members when they are not alive. + To change the address of a secondary node, restart the node with the + updated address.

            +
            +
            Parameters:
            +
            nodeName - the name of the node whose address will be updated
            +
            newHostName - the new host name of the node
            +
            newPort - the new port number of the node
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/DbPing.html b/docs/java/com/sleepycat/je/rep/util/DbPing.html new file mode 100644 index 0000000..9fcd600 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/DbPing.html @@ -0,0 +1,334 @@ + + + + + +DbPing (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.util
      +

      Class DbPing

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.util.DbPing
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbPing
        +extends java.lang.Object
        +
        This class provides the utility to request the current state of a replica in + a JE replication group, see more details in + NodeState.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbPing(ReplicationNode repNode, + java.lang.String groupName, + int socketTimeout) +
          Create a DbPing instance for programmatic use.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbPing

            +
            public DbPing(ReplicationNode repNode,
            +              java.lang.String groupName,
            +              int socketTimeout)
            +
            Create a DbPing instance for programmatic use.
            +
            +
            Parameters:
            +
            repNode - a class that implements + ReplicationNode
            +
            groupName - name of the group which the node joins
            +
            socketTimeout - timeout value for creating a socket connection + with the node
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] args)
            +                 throws java.lang.Exception
            +
            Usage: +
            + java {com.sleepycat.je.rep.util.DbPing |
            +       -jar je-<version>.jar DbPing}
            +   -nodeName <node name> # name of the node whose state is
            +                               # requested
            +   -groupName <group name> # name of the group which the node joins
            +   -nodeHost <host:port> # the host name and port pair the node
            +                               # used to join the group
            +   -socketTimeout              # the timeout value for creating a
            +                               # socket connection with the node,
            +                               # default is 10 seconds if not set
            + 
            +
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            getNodeState

            +
            public NodeState getNodeState()
            +                       throws java.io.IOException,
            +                              com.sleepycat.je.rep.utilint.ServiceDispatcher.ServiceConnectFailedException
            +
            +
            Throws:
            +
            java.io.IOException
            +
            com.sleepycat.je.rep.utilint.ServiceDispatcher.ServiceConnectFailedException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/DbResetRepGroup.html b/docs/java/com/sleepycat/je/rep/util/DbResetRepGroup.html new file mode 100644 index 0000000..c713a81 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/DbResetRepGroup.html @@ -0,0 +1,416 @@ + + + + + +DbResetRepGroup (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.util
      +

      Class DbResetRepGroup

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.util.DbResetRepGroup
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbResetRepGroup
        +extends java.lang.Object
        +
        A utility to reset the members of a replication group, replacing the group + with a new group consisting of a single new member as described by the + arguments supplied to the utility. +

        + This utility is useful when a copy of an existing replicated environment + needs to be used at a different site, with the same data, but with a + different initial node that can be used to grow the replication group as + usual. The utility can also be used to change the group name associated with + the environment. +

        + The reset environment has a different identity from the environment before + the reset operation although it contains the same application data. To avoid + confusion, the reset environment is assigned a new internal unique id. The + unique id is checked whenever nodes attempt to communicate with each other + and ensure that all nodes in a group are dealing with the same data. +

        + The reset process is typically accomplished using the steps outlined below. + It's good practice to back up your environment before running any utilities + that modify an environment. +

          +
        1. Use DbResetRepGroup to reset an existing environment. + DbResetRepGroup can be used as a command line utility, and must be + executed locally on the host specified in the -nodeHostPort argument. The + host must also contain the environment directory. + Alternatively, DbResetRepGroup may be used programmatically through + the provided APIs.
        2. +
        3. Once reset, the environment can be opened with a + ReplicatedEnvironment, using the same node configuration as the one + that was passed in to the utility. No helper host configuration is needed. + Since the group consists of a single node, it will assume the role of a + Master, so long as it is created as an electable node. +
        4. Additional nodes may now be created and can join the group as newly + created replicas, as described in ReplicatedEnvironment. Since these + new nodes are empty, they should be configured to use the new master as + their helper node, and will go through the + replication node lifecycle + to populate their environment directories. In this case, there will be data + in the converted master that can only be transferred to the replica through + a file copy executed with the help of a + NetworkRestore
        5. +
        +

        + For example: + +

        + // Run the utility on a copy of an existing replicated environment. Usually
        + // this environment will have originated on a different node and its
        + // replication group information will contain meta data referring to its
        + // previous host. The utility will reset this metadata so that it has a
        + // rep group (UniversalRepGroup) with a single node named nodeMars. The node
        + // is associated with the machine mars and will communicate on port 5001.
        +
        + DbResetRepGroup resetUtility =
        +     new DbResetRepGroup(envDirMars,          // env home dir
        +                         "UniversalRepGroup", // group name
        +                         "nodeMars",          // node name
        +                         "mars:5001");        // node host,port
        + resetUtility.reset();
        +
        + // Open the reset environment; it will take on the role of master.
        + ReplicatedEnvironment nodeMars = new ReplicatedEnvironment(envDirMars, ...);
        + ...
        + // Bring up additional nodes, which will be initialized from
        + // nodeMars. For example, from the machine venus you can now add a new
        + // member to the group(UniversalRepGroup) as below.
        +
        + ReplicationConfig repConfig = null;
        + try {
        +     repConfig = new ReplicationConfig("UniversalRepGroup", // groupName
        +                                       "nodeVenus",         // nodeName
        +                                       "venus:5008");       // nodeHostPort
        +     repConfig.setHelperHosts("mars:5001");
        +
        +     nodeVenus = new ReplicatedEnvironment(envDirB, repConfig, envConfig);
        + } catch (InsufficientLogException insufficientLogEx) {
        +
        +     // log files will be copied from another node in the group
        +     NetworkRestore restore = new NetworkRestore();
        +     restore.execute(insufficientLogEx, new NetworkRestoreConfig());
        +
        +     // try opening the node now that the environment files have been
        +     // restored on this machine.
        +     nodeVenus = new ReplicatedEnvironment(envDirVenus,
        +                                           repConfig,
        +                                           envConfig);
        + }
        + ...
        + 
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbResetRepGroup(java.io.File envHome, + java.lang.String groupName, + java.lang.String nodeName, + java.lang.String nodeHostPort) +
          Create a DbResetRepGroup object for this node.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] args) +
          Usage:
          +
          voidreset() +
          Replaces the existing group with the new group having a single new node + as described by the constructor arguments.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbResetRepGroup

            +
            public DbResetRepGroup(java.io.File envHome,
            +                       java.lang.String groupName,
            +                       java.lang.String nodeName,
            +                       java.lang.String nodeHostPort)
            +
            Create a DbResetRepGroup object for this node.
            +
            +
            Parameters:
            +
            envHome - The node's replicated environment directory. The + directory must be accessible on this host.
            +
            groupName - The name of the new replication group
            +
            nodeName - The node's name
            +
            nodeHostPort - The host and port for this node. The utility + must be executed on this host.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] args)
            +
            Usage: +
            + java -cp je.jar com.sleepycat.je.rep.util.DbResetRepGroup
            +   -h <dir>                          # environment home directory
            +   -groupName <group name>           # replication group name
            +   -nodeName <node name>             # replicated node name
            +   -nodeHostPort <host name:port number> # host name or IP address
            +                                             and port number to use
            +                                             for this node
            + 
            +
          • +
          + + + +
            +
          • +

            reset

            +
            public void reset()
            +
            Replaces the existing group with the new group having a single new node + as described by the constructor arguments.
            +
            +
            See Also:
            +
            DbResetRepGroup
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/ReplicationGroupAdmin.html b/docs/java/com/sleepycat/je/rep/util/ReplicationGroupAdmin.html new file mode 100644 index 0000000..623c974 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/ReplicationGroupAdmin.html @@ -0,0 +1,596 @@ + + + + + +ReplicationGroupAdmin (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.rep.util
      +

      Class ReplicationGroupAdmin

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.rep.util.ReplicationGroupAdmin
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class ReplicationGroupAdmin
        +extends java.lang.Object
        +
        Administrative APIs for use by applications which do not have direct access + to a replicated environment. The class supplies methods that can be + used to list group members, remove members, update network addresses, and + find the current master. + + Information is found and updated by querying nodes in the group. Because of + that, ReplicationGroupAdmin can only obtain information when there is at + least one node alive in the replication group.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ReplicationGroupAdmin(java.lang.String groupName, + java.util.Set<java.net.InetSocketAddress> helperSockets) +
          Constructs a group admin object.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          ReplicationGroupgetGroup() +
          Returns the current composition of the group from the Master.
          +
          java.lang.StringgetGroupName() +
          Returns the name of the replication group.
          +
          java.util.Set<java.net.InetSocketAddress>getHelperSockets() +
          Returns the helper sockets being used to contact a replication group + member, in order to query for the information.
          +
          java.lang.StringgetMasterNodeName() +
          Returns the node name associated with the master
          +
          NodeStategetNodeState(ReplicationNode repNode, + int socketConnectTimeout) +
          Returns the state of a replicated + node and state of the application where the node is + running in.
          +
          voidremoveMember(java.lang.String nodeName) +
          Removes this node from the group, so that it is no longer a member of + the group.
          +
          voidsetHelperSockets(java.util.Set<java.net.InetSocketAddress> helperSockets) +
          Sets the helper sockets being used to contact a replication group + member, in order to query for the information.
          +
          java.lang.StringtransferMaster(java.util.Set<java.lang.String> nodeNames, + int timeout, + java.util.concurrent.TimeUnit timeUnit, + boolean force) +
          Transfers the master state from the current master to one of the + electable replicas supplied in the argument list.
          +
          voidupdateAddress(java.lang.String nodeName, + java.lang.String newHostName, + int newPort) +
          Update the network address for a specified member of the replication + group.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ReplicationGroupAdmin

            +
            public ReplicationGroupAdmin(java.lang.String groupName,
            +                             java.util.Set<java.net.InetSocketAddress> helperSockets)
            +
            Constructs a group admin object.
            +
            +
            Parameters:
            +
            groupName - the name of the group to be administered
            +
            helperSockets - the sockets on which it can contact helper nodes + in the replication group to carry out admin services.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getHelperSockets

            +
            public java.util.Set<java.net.InetSocketAddress> getHelperSockets()
            +
            Returns the helper sockets being used to contact a replication group + member, in order to query for the information.
            +
            +
            Returns:
            +
            the set of helper sockets.
            +
            +
          • +
          + + + +
            +
          • +

            setHelperSockets

            +
            public void setHelperSockets(java.util.Set<java.net.InetSocketAddress> helperSockets)
            +
            Sets the helper sockets being used to contact a replication group + member, in order to query for the information.
            +
            +
            Parameters:
            +
            helperSockets - the sockets on which it can contact helper nodes + in the replication group to carry out admin services.
            +
            +
          • +
          + + + +
            +
          • +

            getGroupName

            +
            public java.lang.String getGroupName()
            +
            Returns the name of the replication group.
            +
            +
            Returns:
            +
            the group name.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            removeMember

            +
            public void removeMember(java.lang.String nodeName)
            +                  throws UnknownMasterException,
            +                         MemberNotFoundException,
            +                         MasterStateException,
            +                         EnvironmentFailureException
            +
            Removes this node from the group, so that it is no longer a member of + the group. When removed, it will no longer be able to connect to a + master, nor can it participate in elections. If the node is a Monitor it will no longer be informed of + election results. Once removed, a node cannot be added again to the + group under the same node name. +

            + Ideally, the node being removed should be shut down before this call is + issued. +

            + If the node is an active Replica the master will terminate + its connection with the node and will not allow the replica to reconnect + with the group, since it's no longer a member of the group. If the node + wishes to re-join it should do so with a different node name. +

            + An active Master cannot be removed. It must first be shutdown, or + transition to the Replica state before it can be removed + from the group. +

            + Secondary nodes cannot be removed; they + automatically leave the group when they are shut down or become + disconnected from the master.

            +
            +
            Parameters:
            +
            nodeName - identifies the node being removed from the group
            +
            Throws:
            +
            UnknownMasterException - if the master was not found
            +
            java.lang.IllegalArgumentException - if the type of the node is SECONDARY
            +
            MemberNotFoundException - if the node denoted by + nodeName is not a member of the replication group
            +
            MasterStateException - if the member being removed is currently + the Master
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            See Also:
            +
            Adding and Removing Nodes From the Group
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getNodeState

            +
            public NodeState getNodeState(ReplicationNode repNode,
            +                              int socketConnectTimeout)
            +                       throws java.io.IOException,
            +                              com.sleepycat.je.rep.utilint.ServiceDispatcher.ServiceConnectFailedException
            +
            Returns the state of a replicated + node and state of the application where the node is + running in.
            +
            +
            Parameters:
            +
            repNode - a ReplicationNode includes those information which are + needed to connect to the node
            +
            socketConnectTimeout - the timeout value for creating a socket + connection with the replicated node
            +
            Returns:
            +
            the state of the replicated node
            +
            Throws:
            +
            java.io.IOException - if the machine is down or no response is returned
            +
            com.sleepycat.je.rep.utilint.ServiceDispatcher.ServiceConnectFailedException - if can't connect to the service + running on the replicated node
            +
            +
          • +
          + + + +
            +
          • +

            updateAddress

            +
            public void updateAddress(java.lang.String nodeName,
            +                          java.lang.String newHostName,
            +                          int newPort)
            +                   throws EnvironmentFailureException,
            +                          MasterStateException,
            +                          MemberNotFoundException,
            +                          ReplicaStateException,
            +                          UnknownMasterException
            +
            Update the network address for a specified member of the replication + group. When updating the address of this target replication node, the + node cannot be alive. One common use case is when the replication member + must be moved to a new host, possibly because of machine failure. +

            + To make a network address change, take these steps: +

              +
            1. Shutdown the node that is being updated. +
            2. Use this method to change the hostname and port of the node. +
            3. Start the node on the new machine, or at its new port, using the new + hostname/port. If the log files are available at the node, they will + be reused. A network restore operation may need to be initiated by + the application to copy over any needed log files if no log files are + available, or if they have become obsolete. +
            +

            + The address of a NodeType.SECONDARY node cannot be updated with + this method, since nodes must be members but not alive to be updated, + and secondary nodes are not members when they are not alive. To change + the address of a secondary node, restart the node with the updated + address.

            +
            +
            Parameters:
            +
            nodeName - the name of the node whose address will be updated.
            +
            newHostName - the new host name of the node
            +
            newPort - the new port number of the node
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs
            +
            MasterStateException - if the member being updated is currently + the master
            +
            MemberNotFoundException - if the node denoted by + nodeName is not a member of the replication group
            +
            ReplicaStateException - if the member being updated is currently + alive
            +
            UnknownMasterException - if the master was not found
            +
            See Also:
            +
            DbResetRepGroup, which can be used in a + related but different use case to copy and move a group.
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/class-use/AtomicLongMax.html b/docs/java/com/sleepycat/je/rep/util/class-use/AtomicLongMax.html new file mode 100644 index 0000000..b770374 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/class-use/AtomicLongMax.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.util.AtomicLongMax (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.util.AtomicLongMax

      +
      +
      No usage of com.sleepycat.je.rep.util.AtomicLongMax
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/class-use/DbEnableReplication.html b/docs/java/com/sleepycat/je/rep/util/class-use/DbEnableReplication.html new file mode 100644 index 0000000..93ce74e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/class-use/DbEnableReplication.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.util.DbEnableReplication (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.util.DbEnableReplication

      +
      +
      No usage of com.sleepycat.je.rep.util.DbEnableReplication
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/class-use/DbGroupAdmin.html b/docs/java/com/sleepycat/je/rep/util/class-use/DbGroupAdmin.html new file mode 100644 index 0000000..2de0823 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/class-use/DbGroupAdmin.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.util.DbGroupAdmin (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.util.DbGroupAdmin

      +
      +
      No usage of com.sleepycat.je.rep.util.DbGroupAdmin
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/class-use/DbPing.html b/docs/java/com/sleepycat/je/rep/util/class-use/DbPing.html new file mode 100644 index 0000000..e179095 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/class-use/DbPing.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.util.DbPing (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.util.DbPing

      +
      +
      No usage of com.sleepycat.je.rep.util.DbPing
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/class-use/DbResetRepGroup.html b/docs/java/com/sleepycat/je/rep/util/class-use/DbResetRepGroup.html new file mode 100644 index 0000000..b0fbc78 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/class-use/DbResetRepGroup.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.util.DbResetRepGroup (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.util.DbResetRepGroup

      +
      +
      No usage of com.sleepycat.je.rep.util.DbResetRepGroup
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/class-use/ReplicationGroupAdmin.html b/docs/java/com/sleepycat/je/rep/util/class-use/ReplicationGroupAdmin.html new file mode 100644 index 0000000..3440cd1 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/class-use/ReplicationGroupAdmin.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.rep.util.ReplicationGroupAdmin (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.rep.util.ReplicationGroupAdmin

      +
      +
      No usage of com.sleepycat.je.rep.util.ReplicationGroupAdmin
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/package-frame.html b/docs/java/com/sleepycat/je/rep/util/package-frame.html new file mode 100644 index 0000000..ce5ba50 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/package-frame.html @@ -0,0 +1,25 @@ + + + + + +com.sleepycat.je.rep.util (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.rep.util

      + + + diff --git a/docs/java/com/sleepycat/je/rep/util/package-summary.html b/docs/java/com/sleepycat/je/rep/util/package-summary.html new file mode 100644 index 0000000..ae06a19 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/package-summary.html @@ -0,0 +1,203 @@ + + + + + +com.sleepycat.je.rep.util (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.rep.util

      +
      +
      BDB JE High Availability command line utilities and helper classes.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        AtomicLongMax +
        An Atomic long that maintains a max value
        +
        DbEnableReplication +
        A utility to convert an existing, non replicated JE environment for + replication.
        +
        DbGroupAdmin +
        DbGroupAdmin supplies the functionality of the administrative class ReplicationGroupAdmin in a convenient command line utility.
        +
        DbPing +
        This class provides the utility to request the current state of a replica in + a JE replication group, see more details in + NodeState.
        +
        DbResetRepGroup +
        A utility to reset the members of a replication group, replacing the group + with a new group consisting of a single new member as described by the + arguments supplied to the utility.
        +
        ReplicationGroupAdmin +
        Administrative APIs for use by applications which do not have direct access + to a replicated environment.
        +
        +
      • +
      + + + +

      Package com.sleepycat.je.rep.util Description

      +
      BDB JE High Availability command line utilities and helper classes. + +

      Package Specification

      +This package provides support for activities like administering and +starting up replication groups.
      +
      +
      See Also:
      +
      Replication +Guide, Chapter 4: Utilities
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/package-tree.html b/docs/java/com/sleepycat/je/rep/util/package-tree.html new file mode 100644 index 0000000..c581d52 --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/package-tree.html @@ -0,0 +1,147 @@ + + + + + +com.sleepycat.je.rep.util Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.rep.util

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/rep/util/package-use.html b/docs/java/com/sleepycat/je/rep/util/package-use.html new file mode 100644 index 0000000..2886f3e --- /dev/null +++ b/docs/java/com/sleepycat/je/rep/util/package-use.html @@ -0,0 +1,129 @@ + + + + + +Uses of Package com.sleepycat.je.rep.util (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.rep.util

      +
      +
      No usage of com.sleepycat.je.rep.util
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/ConsoleHandler.html b/docs/java/com/sleepycat/je/util/ConsoleHandler.html new file mode 100644 index 0000000..dd958d0 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/ConsoleHandler.html @@ -0,0 +1,298 @@ + + + + + +ConsoleHandler (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class ConsoleHandler

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.util.logging.Handler
        • +
        • +
            +
          • java.util.logging.StreamHandler
          • +
          • +
              +
            • java.util.logging.ConsoleHandler
            • +
            • +
                +
              • com.sleepycat.je.util.ConsoleHandler
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class ConsoleHandler
        +extends java.util.logging.ConsoleHandler
        +
        JE instances of java.util.logging.Logger are configured to use this + implementation of java.util.logging.ConsoleHandler. By default, the + handler's level is Level.OFF. To enable the console output, use the + standard java.util.logging.LogManager configuration to set the desired + level: +
        + com.sleepycat.je.util.ConsoleHandler.level=ALL
        + 
        + JE augments the java.util.logging API with a JE environment parameter for + setting handler levels. This is described in greater detail in + + Chapter 12.Administering Berkeley DB Java Edition Applications
        +
        +
        See Also:
        +
        + Chapter 12. Logging, +Using JE Trace Logging
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ConsoleHandler(java.util.logging.Formatter formatter, + com.sleepycat.je.dbi.EnvironmentImpl envImpl) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          +
            +
          • + + +

            Methods inherited from class java.util.logging.ConsoleHandler

            +close, publish
          • +
          +
            +
          • + + +

            Methods inherited from class java.util.logging.StreamHandler

            +flush, isLoggable, setEncoding, setOutputStream
          • +
          +
            +
          • + + +

            Methods inherited from class java.util.logging.Handler

            +getEncoding, getErrorManager, getFilter, getFormatter, getLevel, reportError, setErrorManager, setFilter, setFormatter, setLevel
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ConsoleHandler

            +
            public ConsoleHandler(java.util.logging.Formatter formatter,
            +                      com.sleepycat.je.dbi.EnvironmentImpl envImpl)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbBackup.html b/docs/java/com/sleepycat/je/util/DbBackup.html new file mode 100644 index 0000000..5f83c93 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbBackup.html @@ -0,0 +1,868 @@ + + + + + +DbBackup (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbBackup

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbBackup
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbBackup
        +extends java.lang.Object
        +
        DbBackup is a helper class for stopping and restarting JE background + activity in an open environment in order to simplify backup operations. It + also lets the application create a backup which can support restoring the + environment to a specific point in time. +

        + Backing up without DbBackup +

        + Because JE has an append only log file architecture, it is always possible + to do a hot backup without the use of DbBackup by copying all log files + (.jdb files) to your archival location. As long as the log files are copied + in alphabetical order, (numerical in effect) and all log files are + copied, the environment can be successfully backed up without any need to + stop database operations or background activity. This means that your + backup operation must do a loop to check for the creation of new log files + before deciding that the backup is finished. For example: +

        + time    files in                    activity
        +         environment
        +
        +  t0     000000001.jdb     Backup starts copying file 1
        +         000000003.jdb
        +         000000004.jdb
        +
        +  t1     000000001.jdb     JE log cleaner migrates portion of file 3 to newly
        +         000000004.jdb     created file 5 and deletes file 3. Backup finishes
        +         000000005.jdb     file 1, starts copying file 4. Backup MUST include
        +                           file 5 for a consistent backup!
        +
        +  t2     000000001.jdb     Backup finishes copying file 4, starts and
        +         000000004.jdb     finishes file 5, has caught up. Backup ends.
        +         000000005.jdb
        +
        +

        + In the example above, the backup operation must be sure to copy file 5, + which came into existence after the backup had started. If the backup + stopped operations at file 4, the backup set would include only file 1 and + 4, omitting file 3, which would be an inconsistent set. +

        + Also note that log file 5 may not have filled up before it was copied to + archival storage. On the next backup, there might be a newer, larger version + of file 5, and that newer version should replace the older file 5 in archive + storage. +

        + Using the approach above, as opposed to using DbBackup, will copy all files + including reserved files as well + as active files. A large number of + reserved files may be present in an HA Environment, and they are essentially + wasted space in a backup. Using DbBackup is strongly recommended for this + reason, as well as to reduce the complexity of file copying. +

        + Backing up with DbBackup +

        + DbBackup helps simplify application backup by defining the set of active files that must be copied for each + backup operation. If the environment directory has read/write protection, + the application must pass DbBackup an open, read/write environment handle. +

        + When entering backup mode, JE determines the set of active files needed for + a consistent backup, and freezes all changes to those files. The application + can copy that defined set of files and finish operation without checking for + the ongoing creation of new files. Also, there will be no need to check for + a newer version of the last file on the next backup. +

        + In the example above, if DbBackup was used at t0, the application would only + have to copy files 1, 3 and 4 to back up. On a subsequent backup, the + application could start its copying at file 5. There would be no need to + check for a newer version of file 4. +

        + When it is important to minimize the time that it takes to recover using a + backup, a checkpoint should be performed immediately before calling startBackup(). This will reduce recovery time when opening the environment + with the restored log files. A checkpoint is performed explicitly by + calling Environment.checkpoint(com.sleepycat.je.CheckpointConfig) using a config object for which + setForce(true) has been called. +

        + Performing simple/full backups +

        + The following examples shows how to perform a full backup. A checkpoint is + performed to minimize recovery time. +

        + void myBackup(Environment env, File destDir) {
        +     DbBackup backupHelper = new DbBackup(env);
        +
        +     // Optional: Do a checkpoint to reduce recovery time after a restore.
        +     env.checkpoint(new CheckpointConfig().setForce(true));
        +
        +     // Start backup, find out what needs to be copied.
        +     backupHelper.startBackup();
        +     try {
        +         // Copy the necessary files to archival storage.
        +         String[] filesToCopy = backupHelper.getLogFilesInBackupSet();
        +         myCopyFiles(env, backupHelper, filesToCopy, destDir);
        +     } finally {
        +         // Remember to exit backup mode, or the JE cleaner cannot delete
        +         // log files and disk usage will grow without bounds.
        +        backupHelper.endBackup();
        +     }
        + }
        +
        + void myCopyFiles(
        +     Environment env,
        +     DbBackup backupHelper,
        +     String[] filesToCopy,
        +     File destDir) {
        +
        +     for (String fileName : filesToCopy) {
        +         // Copy fileName to destDir.
        +         // See LogVerificationReadableByteChannel and
        +         // LogVerificationInputStream.
        +         ....
        +
        +         // Remove protection to allow file to be deleted in order to reclaim
        +         // disk space.
        +         backupHelper.removeFileProtection(fileName);
        +     }
        + }
        + 
        + When copying files to the backup directory, it is critical that each file is + verified before or during the copy. If a file is copied that is corrupt + (due to an earlier disk failure that went unnoticed, for example), the + backup will be invalid and provide a false sense of security. +

        + The example here shows how to implement + the myCopyFiles method using LogVerificationInputStream. A LogVerificationReadableByteChannel + could also be used for higher performance copying. A filter input stream is + used to verify the file efficiently as it is being read. If you choose to + use a script for copying files, the DbVerifyLog command line tool + can be used instead. +

        + Assuming that the full backup copied files into an empty directory, to + restore you can simply copy these files back into another empty directory. +

        + Always start with an empty directory as the destination for a full backup or + a restore, to ensure that no unused files are present. Unused files -- + perhaps the residual of an earlier environment or an earlier backup -- will + take up space, and they will never be deleted by the JE log cleaner. Also + note that such files will not be used by JE for calculating utilization and + will not appear in the DbSpace output. +

        + Performing incremental backups +

        + Incremental backups are used to reduce the number of files copied during + each backup. Compared to a full backup, there are two additional pieces of + information needed for an incremental backup: the number of the last file in + the previous backup, and a list of the active files in the environment + directory at the time of the current backup, i.e., the current snapshot. + Their purpose is explained below. +

        + The number of the last file in the previous backup is used to avoid copying + files that are already present in the backup set. This file number must be + obtained before beginning the backup, either by checking the backup archive, + or getting this value from a stored location. For example, the last file + number could be written to a special file in the backup set at the time of a + backup, and then read from the special file before starting the next backup. +

        + The list of files in the current snapshot, which should be obtained by + calling getLogFilesInSnapshot() (after calling startBackup()), + is used to avoid unused files after a restore, and may also be used to + reduce the size of the backup set. How to use this list is described below. +

        + Some applications need the ability to restore to the point in time of any of + the incremental backups that were made in the past, and other applications + only need to restore to the point in time of the most recent backup. + Accordingly, the list of current files (that is made at the time of the + backup), should be used in one of two ways. +

          +
        1. If you only need to restore to the point in time of the most recent + backup, then the list should be used to delete unused files from the + backup set. After copying all files during the backup, any file that is + not present in the list may then be deleted from the backup set. + This both reduces the size of the backup set, and ensures that unused + files will not be present in the backup set and therefore will not be + restored.
        2. +
        3. If you need to keep all log files from each backup so you can restore + to more than one point in time, then the list for each backup should be + saved with the backup file set so it can be used during a restore. During + the restore, only the files in the list should be copied, starting with an + empty destination directory. This ensures that unused files will not be + restored.
        4. +
        +

        + The following two examples shows how to perform an incremental backup. In + the first example, the list of current files is used to delete files from + the backup set that are no longer needed. +

        + void myBackup(Environment env, File destDir) {
        +
        +     // Get the file number of the last file in the previous backup.
        +     long lastFileInPrevBackup =  ...
        +
        +     DbBackup backupHelper = new DbBackup(env, lastFileInPrevBackup);
        +
        +     // Optional: Do a checkpoint to reduce recovery time after a restore.
        +     env.checkpoint(new CheckpointConfig().setForce(true));
        +
        +     // Start backup, find out what needs to be copied.
        +     backupHelper.startBackup();
        +     try {
        +         // Copy the necessary files to archival storage.
        +         String[] filesToCopy = backupHelper.getLogFilesInBackupSet();
        +         myCopyFiles(env, backupHelper, filesToCopy, destDir);
        +
        +         // Delete files that are no longer needed.
        +         // WARNING: This should only be done after copying all new files.
        +         String[] filesInSnapshot = backupHelper.getLogFilesInSnapshot();
        +         myDeleteUnusedFiles(destDir, filesInSnapshot);
        +
        +         // Update knowledge of last file saved in the backup set.
        +         lastFileInPrevBackup = backupHelper.getLastFileInBackupSet();
        +         // Save lastFileInPrevBackup persistently here ...
        +     } finally {
        +         // Remember to exit backup mode, or the JE cleaner cannot delete
        +         // log files and disk usage will grow without bounds.
        +        backupHelper.endBackup();
        +     }
        + }
        +
        + void myDeleteUnusedFiles(File destDir, String[] filesInSnapshot) {
        +     // For each file in destDir that is NOT in filesInSnapshot, it should
        +     // be deleted from destDir to save disk space in the backup set, and to
        +     // ensure that unused files will not be restored.
        + }
        +
        + See myCopyFiles further above.
        + 
        +

        + When performing backups as shown in the first example above, to restore you + can simply copy all files from the backup set into an empty directory. +

        + In the second example below, the list of current files is saved with the + backup set so it can be used during a restore. The backup set will + effectively hold multiple backups that can be used to restore to different + points in time. +

        + void myBackup(Environment env, File destDir) {
        +
        +     // Get the file number of the last file in the previous backup.
        +     long lastFileInPrevBackup =  ...
        +
        +     DbBackup backupHelper = new DbBackup(env, lastFileInPrevBackup);
        +
        +     // Optional: Do a checkpoint to reduce recovery time after a restore.
        +     env.checkpoint(new CheckpointConfig().setForce(true));
        +
        +     // Start backup, find out what needs to be copied.
        +     backupHelper.startBackup();
        +     try {
        +         // Copy the necessary files to archival storage.
        +         String[] filesToCopy = backupHelper.getLogFilesInBackupSet();
        +         myCopyFiles(env, backupHelper, filesToCopy, destDir);
        +
        +         // Save current list of files with backup data set.
        +         String[] filesInSnapshot = backupHelper.getLogFilesInSnapshot();
        +         // Save filesInSnapshot persistently here ...
        +
        +         // Update knowledge of last file saved in the backup set.
        +         lastFileInPrevBackup = backupHelper.getLastFileInBackupSet();
        +         // Save lastFileInPrevBackup persistently here ...
        +     } finally {
        +         // Remember to exit backup mode, or the JE cleaner cannot delete
        +         // log files and disk usage will grow without bounds.
        +        backupHelper.endBackup();
        +     }
        + }
        +
        + See myCopyFiles further above.
        + 
        +

        + When performing backups as shown in the second example above, to restore you + must choose one of the file lists that was saved. You may choose the list + written by the most recent backup, or a list written by an earlier backup. + To restore, the files in the list should be copied into an empty destination + directory. +

        + Restoring from a backup +

        + As described in the sections above, the restore procedure is to copy the + files from a backup set into an empty directory. Depending on the type of + backup that was performed (see above), either all files from the backup set + are copied, or only the files on a list that was created during the backup. +

        + There is one additional consideration when performing a restore, under the + following condition: +

          +
        • Incremental backups are used, AND +
            +
          • the backup was created using DbBackup with JE 6.2 or earlier, + OR
          • +
          • the backup was created in a read-only JE environment.
          • +
          +
        • +
        +

        + If the above condition holds, after copying the files an additional step is + needed. To enable the creation of future incremental backups using the + restored files, the EnvironmentConfig.ENV_RECOVERY_FORCE_NEW_FILE parameter + should be set to true when opening the JE Environment for the first time + after the restore. When this parameter is set to true, the last .jdb file + restored will not be modified when opening the Environment, and the next + .jdb file will be created and will become the end-of-log file. +

        + WARNING: When the above special condition is true and this property is + not set to true when opening the environment for the first time + after a restore, then the backup set that was restored may not be used as + the basis for future incremental backups. If a future incremental backup + were performed based on this backup set, it would be incomplete and data + would be lost if that incremental backup were restored. +

        + When JE 6.3 or later is used to create the backup, and the backup is created + in a read-write environment (the usual case), this extra step is + unnecessary. In this case, startBackup() will have added an + "immutable file" marker to the last file in the backup and this will prevent + that file from being modified, just as if the + ENV_RECOVERY_FORCE_NEW_FILE parameter were set to true.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          DbBackup(Environment env) +
          Creates a DbBackup helper for a full backup.
          +
          DbBackup(Environment env, + long lastFileInPrevBackup) +
          Creates a DbBackup helper for an incremental backup.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          voidendBackup() +
          End backup mode, thereby re-enabling normal deletion of log files by the + JE log cleaner.
          +
          longgetLastFileInBackupSet() +
          Can only be called in backup mode, after startBackup() has been called.
          +
          java.lang.String[]getLogFilesInBackupSet() +
          Get the minimum list of files that must be copied for this backup.
          +
          java.lang.String[]getLogFilesInBackupSet(long lastFileInPrevBackup) +
          Deprecated.  +
          replaced by getLogFilesInBackupSet(); pass + lastFileInPrevBackup to the DbBackup(Environment,long) + constructor.
          +
          +
          java.lang.String[]getLogFilesInSnapshot() +
          Get the list of all active files that are needed for the environment at + the point of time when backup mode started, i.e., the current snapshot.
          +
          voidremoveFileProtection(java.lang.String fileName) +
          Removes protection for a file in the backup set.
          +
          voidstartBackup() +
          Start backup mode in order to determine the definitive backup set needed + at this point in time.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbBackup

            +
            public DbBackup(Environment env)
            +         throws DatabaseException
            +
            Creates a DbBackup helper for a full backup. + +

            This is equivalent to using DbBackup(Environment,long) and + passing -1 for the lastFileInPrevBackup parameter.

            +
            +
            Parameters:
            +
            env - with an open, valid environment handle. If the environment + directory has read/write permissions, the environment handle must be + configured for read/write.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the environment directory has + read/write permissions, but the environment handle is not configured for + read/write.
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            DbBackup

            +
            public DbBackup(Environment env,
            +                long lastFileInPrevBackup)
            +
            Creates a DbBackup helper for an incremental backup.
            +
            +
            Parameters:
            +
            env - with an open, valid environment handle. If the environment + directory has read/write permissions, the environment handle must be + configured for read/write.
            +
            lastFileInPrevBackup - the last file in the previous backup set + when performing an incremental backup, or -1 to perform a full + backup. The first file in this backup set will be the file following + lastFileInPrevBackup.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalArgumentException - if the environment directory has + read/write permissions, but the environment handle is not configured for + read/write.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            startBackup

            +
            public void startBackup()
            +                 throws DatabaseException
            +
            Start backup mode in order to determine the definitive backup set needed + at this point in time. + +

            This method determines the last file in the backup set, which is the + last log file in the environment at this point in time. Following this + method call, all new data will be written to other, new log files. In + other words, the last file in the backup set will not be modified after + this method returns.

            + +

            WARNING: After calling this method, deletion of log files in + the backup set by the JE log cleaner will be disabled until endBackup() is called. To prevent unbounded growth of disk usage, be + sure to call endBackup() to re-enable log file deletion. + Additionally, the Environment can't be closed until endBackup() is + called. +

            +
            +
            Throws:
            +
            LogOverwriteException - if a replication + operation is overwriting log files. The backup can not proceed because + files may be invalid. The backup may be attempted at a later time.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if a backup is already in progress
            +
            DatabaseException
            +
            +
          • +
          + + + +
            +
          • +

            endBackup

            +
            public void endBackup()
            +
            End backup mode, thereby re-enabling normal deletion of log files by the + JE log cleaner.
            +
            +
            Throws:
            +
            LogOverwriteException - if a replication + operation has overwritten log files. Any copied files should be + considered invalid and discarded. The backup may be attempted at a + later time.
            +
            EnvironmentFailureException - if an unexpected, + internal or environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if a backup has not been started.
            +
            +
          • +
          + + + +
            +
          • +

            getLastFileInBackupSet

            +
            public long getLastFileInBackupSet()
            +
            Can only be called in backup mode, after startBackup() has been called.
            +
            +
            Returns:
            +
            the file number of the last file in the current backup set. + Save this value to reduce the number of files that must be copied at + the next backup session.
            +
            Throws:
            +
            java.lang.IllegalStateException - if a backup has not been started.
            +
            +
          • +
          + + + +
            +
          • +

            getLogFilesInBackupSet

            +
            public java.lang.String[] getLogFilesInBackupSet()
            +
            Get the minimum list of files that must be copied for this backup. When + performing an incremental backup, this consists of the set of active + files that are greater than the last file copied in the previous backup + session. When performing a full backup, this consists of the set of all + active files. Can only be called in backup mode, after startBackup() has + been called. + +

            The file numbers returned are in the range from the constructor + parameter lastFileInPrevBackup + 1 to the last log file at the + time that startBackup() was called.

            +
            +
            Returns:
            +
            the names of all files to be copied, sorted in alphabetical + order. The return values are generally simple file names, not full + paths. However, if multiple data directories are being used (i.e. the + + je.log.nDataDirectories parameter is non-0), then the file names are + prepended with the associated "dataNNN/" prefix, where "dataNNN/" is + the data directory name within the environment home directory and "/" + is the relevant file separator for the platform.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if a backup has not been started.
            +
            +
          • +
          + + + +
            +
          • +

            getLogFilesInBackupSet

            +
            @Deprecated
            +public java.lang.String[] getLogFilesInBackupSet(long lastFileInPrevBackup)
            +
            Deprecated. replaced by getLogFilesInBackupSet(); pass + lastFileInPrevBackup to the DbBackup(Environment,long) + constructor.
            +
            Get the minimum list of files that must be copied for this backup. This + consists of the set of active files that are greater than the last file + copied in the previous backup session. Can only be called in backup + mode, after startBackup() has been called.
            +
            +
            Parameters:
            +
            lastFileInPrevBackup - file number of last file copied in the last + backup session, obtained from getLastFileInBackupSet().
            +
            Returns:
            +
            the names of all the files to be copied that come after + lastFileInPrevBackup.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if a backup has not been started.
            +
            +
          • +
          + + + +
            +
          • +

            getLogFilesInSnapshot

            +
            public java.lang.String[] getLogFilesInSnapshot()
            +
            Get the list of all active files that are needed for the environment at + the point of time when backup mode started, i.e., the current snapshot. + Can only be called in backup mode, after startBackup() has been called. + +

            When performing an incremental backup, this method is called to + determine the files that would needed for a restore. As described in + the examples at the top of this class, this list can be used to avoid + unused files after a restore, and may also be used to reduce the size of + the backup set.

            + +

            When performing a full backup this method is normally not needed, + since in that case it returns the same set of files that is returned by + getLogFilesInBackupSet().

            +
            +
            Returns:
            +
            the names of all files in the snapshot, sorted in alphabetical + order. The return values are generally simple file names, not full + paths. However, if multiple data directories are being used (i.e. the + + je.log.nDataDirectories parameter is non-0), then the file names are + prepended with the associated "dataNNN/" prefix, where "dataNNN/" is + the data directory name within the environment home directory and "/" + is the relevant file separator for the platform.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.IllegalStateException - if a backup has not been started.
            +
            +
          • +
          + + + +
            +
          • +

            removeFileProtection

            +
            public void removeFileProtection(java.lang.String fileName)
            +
            Removes protection for a file in the backup set. This method should be + called after copying a file, so that it may be deleted to avoid + exceeding disk usage limits.
            +
            +
            Parameters:
            +
            fileName - a file name that has already been copied, in the format + returned by getLogFilesInBackupSet() .
            +
            Since:
            +
            7.5
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbCacheSize.html b/docs/java/com/sleepycat/je/util/DbCacheSize.html new file mode 100644 index 0000000..6b62375 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbCacheSize.html @@ -0,0 +1,674 @@ + + + + + +DbCacheSize (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbCacheSize

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbCacheSize
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbCacheSize
        +extends java.lang.Object
        +
        Estimates the in-memory cache size needed to hold a specified data set. + + To get an estimate of the in-memory footprint for a given database, + specify the number of records and database characteristics and DbCacheSize + will return an estimate of the cache size required for holding the + database in memory. Based on this information a JE main cache size can be + chosen and then configured using EnvironmentMutableConfig.setCacheSize(long) or + using the EnvironmentConfig.MAX_MEMORY property. An off-heap cache + may also be optionally configured using EnvironmentMutableConfig.setOffHeapCacheSize(long) or using the EnvironmentConfig.MAX_OFF_HEAP_MEMORY property. + +

        Importance of the JE Cache

        + + The JE cache is not an optional cache. It is used to hold the metadata for + accessing JE data. In fact the JE cache size is probably the most critical + factor to JE performance, since Btree nodes will have to be fetched during a + database read or write operation if they are not in cache. During a single + read or write operation, at each level of the Btree that a fetch is + necessary, an IO may be necessary at a different disk location for each + fetch. In addition, if internal nodes (INs) are not in cache, then write + operations will cause additional copies of the INs to be written to storage, + as modified INs are moved out of the cache to make room for other parts of + the Btree during subsequent operations. This additional fetching and + writing means that sizing the cache too small to hold the INs will result in + lower operation performance. +

        + For best performance, all Btree nodes should fit in the JE cache, including + leaf nodes (LNs), which hold the record data, and INs, which hold record + keys and other metadata. However, because system memory is limited, it is + sometimes necessary to size the cache to hold all or at least most INs, but + not the LNs. This utility estimates the size necessary to hold only INs, + and the size to hold INs and LNs. +

        + In addition, a common problem with large caches is that Java GC overhead + can become significant. When a Btree node is evicted from the JE main + cache based on JE's LRU algorithm, typically the node will have been + resident in the JVM heap for an extended period of time, and will be + expensive to GC. Therefore, when most or all LNs do not fit in + the main cache, using CacheMode.EVICT_LN can be beneficial to + reduce the Java GC cost of collecting the LNs as they are moved out of the + main cache. With EVICT_LN, the LNs only reside in the JVM heap for a short + period and are cheap to collect. A recommended approach is to size the JE + main cache to hold only INs, and size the Java heap to hold that amount plus + the amount needed for GC working space and application objects, leaving + any additional memory for use by the file system cache or the off-heap + cache. Tests show this approach results in lower GC overhead and more + predictable latency. +

        + Another issue is that 64-bit JVMs store object references using less space + when the heap size is slightly less than 32GiB. When the heap size is 32GiB + or more, object references are larger and less data can be cached per GiB of + memory. This JVM feature is enabled with the + Compressed Oops + (-XX:+UseCompressedOops) option, although in modern JVMs it is + on by default. Because of this factor, and because Java GC overhead is + usually higher with larger heaps, a maximum heap size slightly less than + 32GiB is recommended, along with Compressed Oops option. +

        + Of course, the JE main cache size must be less than the heap size since the + main cache is stored in the heap. In fact, around 30% of free space should + normally be reserved in the heap for use by Java GC, to avoid high GC + overheads. For example, if the application uses roughly 2GiB of the heap, + then with a 32GiB heap the JE main cache should normally be no more than + 20GiB. +

        + As of JE 6.4, an optional off-heap cache may be configured in addition to + the main JE cache. See EnvironmentMutableConfig.setOffHeapCacheSize(long) for + information about the trade-offs in using an off-heap cache. When the + -offheap argument is specified, this utility displays sizing + information for both the main and off-heap caches. The portion of the data + set that fits in the main cache, and the off-heap size needed to hold the + rest of the data set, will be shown. The main cache size can be specified + with the -maincache argument, or is implied to be the amount needed + to hold all internal nodes if this argument is omitted. Omitting this + argument is appropriate when CacheMode.EVICT_LN is used, since only + internal nodes will be stored in the main cache. +

        + To reduce Java GC overhead, sometimes a small main cache is used along + with an off-heap cache. Note that it is important that the size the main + cache is at least large enough to hold all the upper INs (the INs at level + 2 and above). This is because the off-heap cache does not contain upper + INs, it only contains LNs and bottom internal nodes (BINs). When a level 2 + IN is evicted from the main cache, its children (BINs and LNs) in the + off-heap cache, if any, must also be evicted, which can be undesirable, + especially if the off-heap cache is not full. This utility displays the + main cache size needed to hold all upper INs, and displays a warning if + this is smaller than the main cache size specified. + +

        Estimating the JE Cache Size

        + + Estimating JE in-memory sizes is not straightforward for several reasons. + There is some fixed overhead for each Btree internal node, so fanout + (maximum number of child entries per parent node) and degree of node + sparseness impacts memory consumption. In addition, JE uses various compact + in-memory representations that depend on key sizes, data sizes, key + prefixing, how many child nodes are resident, etc. The physical proximity + of node children also allows compaction of child physical address values. +

        + Therefore, when running this utility it is important to specify all EnvironmentConfig and DatabaseConfig settings that will be used in + a production system. The EnvironmentConfig settings are specified + by command line options for each property, using the same names as the + EnvironmentConfig parameter name values. For example, EnvironmentConfig.LOG_FILE_MAX, which influences the amount of memory used + to store physical record addresses, can be specified on the command line as: +

        + -je.log.fileMax LENGTH +

        + To be sure that this utility takes into account all relevant settings, + especially as the utility is enhanced in future versions, it is best to + specify all EnvironmentConfig settings used by the application. +

        + The DatabaseConfig settings are specified using command line options + defined by this utility. +

        +

        + This utility estimates the JE cache size by creating an in-memory + Environment and Database. In addition to the size of the Database, the + minimum overhead for the Environment is output. The Environment overhead + shown is likely to be smaller than actually needed because it doesn't take + into account use of memory by JE daemon threads (cleaner, checkpointer, etc) + the memory used for locks that are held by application operations and + transactions, the memory for HA network connections, etc. An additional + amount should be added to account for these factors. +

        + This utility estimates the cache size for a single JE Database, or a logical + table spread across multiple databases (as in the case of Oracle NoSQL DB, + for example). To estimate the size for multiple databases/tables with + different configuration parameters or different key and data sizes, run + this utility for each database/table and sum the sizes. If you are summing + multiple runs for multiple databases/tables that are opened in a single + Environment, the overhead size for the Environment should only be added once. +

        + In some applications with databases/tables having variable key and data + sizes, it may be difficult to determine the key and data size input + parameters for this utility. If a representative data set can be created, + one approach is to use the DbPrintLog utility with the -S + option to find the average key and data size for all databases/tables, and + use these values as input parameters, as if there were only a single + database/tables. With this approach, it is important that the DatabaseConfig parameters are the same, or at least similar, for all + databases/tables. + +

        Key Prefixing and Compaction

        + + Key prefixing deserves special consideration. It can significantly reduce + the size of the cache and is generally recommended; however, the benefit can + be difficult to predict. Key prefixing, in turn, impacts the benefits of + key compaction, and the use of the EnvironmentConfig.TREE_COMPACT_MAX_KEY_LENGTH parameter. +

        + For a given data set, the impact of key prefixing is determined by how many + leading bytes are in common for the keys in a single bottom internal node + (BIN). For example, if keys are assigned sequentially as long (8 byte) + integers, and the maximum entries + per node is 128 (the default value) then 6 or 7 of the 8 bytes of the key + will have a common prefix in each BIN. Of course, when records are deleted, + the number of prefixed bytes may be reduced because the range of key values + in a BIN will be larger. For this example we will assume that, on average, + 5 bytes in each BIN are a common prefix leaving 3 bytes per key that are + unprefixed. +

        + Key compaction is applied when the number of unprefixed bytes is less than a + configured value; see EnvironmentConfig.TREE_COMPACT_MAX_KEY_LENGTH. + In the example, the 3 unprefixed bytes per key is less than the default used + for key compaction (16 bytes). This means that each key will use 16 bytes + of memory, in addition to the amount used for the prefix for each BIN. The + per-key overhead could be reduced by changing the TREE_COMPACT_MAX_KEY_LENGTH parameter to a smaller value, but care should + be taken to ensure the compaction will be effective as keys are inserted and + deleted over time. +

        + Because key prefixing depends so much on the application key format and the + way keys are assigned, the number of expected prefix bytes must be estimated + by the user and specified to DbCacheSize using the -keyprefix + argument. + +

        Key Prefixing and Duplicates

        + + When duplicates are configured + for a Database (including DPL MANY_TO_ONE and MANY_TO_MANY secondary + indices), key prefixing is always used. This is because the internal key in + a duplicates database BIN is formed by concatenating the user-specified key + and data. In secondary databases with duplicates configured, the data is + the primary key, so the internal key is the concatenation of the secondary + key and the primary key. +

        + Key prefixing is always used for duplicates databases because prefixing is + necessary to store keys efficiently. When the number of duplicates per + unique user-specified key is more than the number of entries per BIN, the + entire user-specified key will be the common prefix. +

        + For example, a database that stores user information may use email address + as the primary key and zip code as a secondary key. The secondary index + database will be a duplicates database, and the internal key stored in the + BINs will be a two part key containing zip code followed by email address. + If on average there are more users per zip code than the number of entries + in a BIN, then the key prefix will normally be at least as long as the zip + code key. If there are less (more than one zip code appears in each BIN), + then the prefix will be shorter than the zip code key. +

        + It is also possible for the key prefix to be larger than the secondary key. + If for one secondary key value (one zip code) there are a large number of + primary keys (email addresses), then a single BIN may contain concatenated + keys that all have the same secondary key (same zip code) and have primary + keys (email addresses) that all have some number of prefix bytes in common. + Therefore, when duplicates are specified it is possible to specify a prefix + size that is larger than the key size. + +

        Small Data Sizes and Embedded LNs

        + + Another special data representation involves small data sizes. When the + data size of a record is less than or equal to EnvironmentConfig.TREE_MAX_EMBEDDED_LN (16 bytes, by default), the data + is stored (embedded) in the BIN, and the LN is not stored in cache at all. + This increases the size needed to hold all INs in cache, but it decreases + the size needed to hold the complete data set. If the data size specified + when running this utility is less than or equal to TREE_MAX_EMBEDDED_LN, + the size displayed for holding INs only will be the same as the size + displayed for holdings INs and LNs. +

        + See EnvironmentConfig.TREE_MAX_EMBEDDED_LN for information about + the trade-offs in using the embedded LNs feature. + +

        Record Versions and Oracle NoSQL Database

        + + This note applies only to when JE is used with Oracle NoSQL DB. In Oracle + NoSQL DB, an internal JE environment configuration parameter is always + used: -je.rep.preserveRecordVersion true. This allows using record + versions in operations such as "put if version", "delete if version", etc. + This feature performs best when the cache is sized large enough to hold the + record versions. +

        + When using JE with Oracle NoSQL DB, always add -je.rep.preserveRecordVersion true to the command line. This ensures that + the cache sizes calculated are correct, and also outputs an additional line + showing how much memory is required to hold the internal nodes and record + versions (but not the leaf nodes). This is the minimum recommended size + when the "... if version" operations are used. + +

        Running the DbCacheSize utility

        + + Usage: +
        + java { com.sleepycat.je.util.DbCacheSize |
        +        -jar je-<version>.jar DbCacheSize }
        +  -records COUNT
        +      # Total records (key/data pairs); required
        +  -key BYTES
        +      # Average key bytes per record; required
        +  [-data BYTES]
        +      # Average data bytes per record; if omitted no leaf
        +      # node sizes are included in the output; required with
        +      # -duplicates, and specifies the primary key length
        +  [-offheap]
        +      # Indicates that an off-heap cache will be used.
        +  [-maincache BYTES]
        +      # The size of the main cache (in the JVM heap).
        +      # The size of the off-heap cache displayed is the
        +      # additional amount needed to hold the data set.
        +      # If omitted, the main cache size is implied to
        +      # be the amount needed to hold all internal nodes.
        +      # Ignored if -offheap is not also specified.
        +  [-keyprefix BYTES]
        +      # Expected size of the prefix for the keys in each
        +      # BIN; default: key prefixing is not configured;
        +      # required with -duplicates
        +  [-nodemax ENTRIES]
        +      # Number of entries per Btree node; default: 128
        +  [-orderedinsertion]
        +      # Assume ordered insertions and no deletions, so BINs
        +      # are 100% full; default: unordered insertions and/or
        +      # deletions, BINs are 70% full
        +  [-duplicates]
        +      # Indicates that sorted duplicates are used, including
        +      # MANY_TO_ONE and MANY_TO_MANY secondary indices;
        +      # default: false
        +  [-ttl]
        +      # Indicates that TTL is used; default: false
        +  [-replicated]
        +      # Use a ReplicatedEnvironment; default: false
        +  [-ENV_PARAM_NAME VALUE]...
        +      # Any number of EnvironmentConfig parameters and
        +      # ReplicationConfig parameters (if -replicated)
        +  [-btreeinfo]
        +      # Outputs additional Btree information
        +  [-outputproperties]
        +      # Writes Java properties file to System.out
        + 
        +

        + You should run DbCacheSize on the same target platform and JVM for which you + are sizing the cache, as cache sizes will vary. You may also need to + specify -d32 or -d64 depending on your target, if the default JVM mode is + not the same as the mode to be used in production. +

        + To take full advantage of JE cache memory, it is strongly recommended that + compressed oops + (-XX:+UseCompressedOops) is specified when a 64-bit JVM is used + and the maximum heap size is less than 32 GB. As described in the + referenced documentation, compressed oops is sometimes the default JVM mode + even when it is not explicitly specified in the Java command. However, if + compressed oops is desired then it must be explicitly specified in + the Java command when running DbCacheSize or a JE application. If it is not + explicitly specified then JE will not aware of it, even if it is the JVM + default setting, and will not take it into account when calculating cache + memory sizes. +

        + For example: +

        + $ java -jar je-X.Y.Z.jar DbCacheSize -records 554719 -key 16 -data 100
        +
        +  === Environment Cache Overhead ===
        +
        +  3,157,213 minimum bytes
        +
        + To account for JE daemon operation, record locks, HA network connections, etc,
        + a larger amount is needed in practice.
        +
        +  === Database Cache Size ===
        +
        +  Number of Bytes  Description
        +  ---------------  -----------
        +       23,933,736  Internal nodes only
        +      107,206,616  Internal nodes and leaf nodes
        + 
        +

        + This indicates that the minimum memory size to hold only the internal nodes + of the Database Btree is approximately 24MB. The maximum size to hold the + entire database, both internal nodes and data records, is approximately + 107MB. To either of these amounts, at least 3MB (plus more for locks and + daemons) should be added to account for the environment overhead. +

        + The following example adds the use of an off-heap cache, where the main + cache size is specified to be 30MB. +

        + $ java -jar je-X.Y.Z.jar DbCacheSize -records 554719 -key 16 -data 100 \
        +      -offheap -maincache 30000000
        +
        +  === Environment Cache Overhead ===
        +
        +  5,205,309 minimum bytes
        +
        + To account for JE daemon operation, record locks, HA network connections, etc,
        + a larger amount is needed in practice.
        +
        +  === Database Cache Size ===
        +
        +  Number of Bytes  Description
        +  ---------------  -----------
        +       23,933,736  Internal nodes only: MAIN cache
        +                0  Internal nodes only: OFF-HEAP cache
        +       24,794,691  Internal nodes and leaf nodes: MAIN cache
        +       70,463,604  Internal nodes and leaf nodes: OFF-HEAP cache
        + 
        + There are several things of interest in the output. +
          +
        • The environment overhead is larger because of memory used for the + off-heap LRU.
        • +
        • To cache only internal nodes, an off-heap cache is not needed since + the internal nodes take around 24MB, which when added to the 5MB + overhead is less than the 30MB main cache specified. This is why the + number of bytes on the second line is zero.
        • +
        • To cache all nodes, the main cache size specified should be used + (25MB added to the 5MB overhead is 30MB), and an off-heap cache of + around 71MB should be configured.
        • +
        + +

        Output Properties

        + +

        + When -outputproperties is specified, a list of properties in Java + properties file format will be written to System.out, instead of the output + shown above. The properties and their meanings are listed below. +

          +
        • The following properties are always output (except allNodes, see + below). They describe the estimated size of the main cache. +
            +
          • overhead: The environment overhead, as shown + under Environment Cache Overhead above.
          • +
          • internalNodes: The Btree size in the main + cache for holding the internal nodes. This is the "Internal nodes + only" line above (followed by "MAIN cache" when -offheap is + specified).
          • +
          • internalNodesAndVersions: The Btree size needed + to hold the internal nodes and record versions in the main cache. + This value is zero when -offheap is specified; currently JE + does not cache record versions off-heap unless their associated LNs + are also cached off-heap, so there is no way to calculate this + property.
          • +
          • allNodes: The Btree size in the main cache + needed to hold all nodes. This is the "Internal nodes and leaf + nodes" line above (followed by "MAIN cache" when -offheap is + specified). This property is not output unless -data is + specified.
          • +
          +
        • The following properties are output only when -offheap is + specified. They describe the estimated size of the off-heap cache. +
            +
          • minMainCache: The minimum size of the main + cache needed to hold all upper INs. When the -maincache + value specified is less than this minimum, not all internal nodes + can be cached. See the discussion further above.
          • +
          • offHeapInternalNodes: The size of the off-heap + cache needed to hold the internal nodes. This is the "Internal nodes + only: OFF_HEAP cache" line above.
          • +
          • offHeapAllNodes: The size of the off-heap cache + needed to hold all nodes. This is the "Internal nodes and leaf + nodes: OFF_HEAP cache" line above. This property is not output + unless -data is specified.
          • +
          +
        • The following properties are deprecated but are output for + compatibility with earlier releases. +
            +
          • minInternalNodes, maxInternalNodes, minAllNodes, and (when + -data is specified) maxAllNodes
          • +
          +
        +
        +
        See Also:
        +
        EnvironmentMutableConfig.setCacheSize(long), +EnvironmentMutableConfig.setOffHeapCacheSize(long), +CacheMode, +Cache Statistics: + Sizing
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] args) +
          Runs DbCacheSize as a command line utility.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] args)
            +                 throws java.lang.Throwable
            +
            Runs DbCacheSize as a command line utility. + For command usage, see class description.
            +
            +
            Throws:
            +
            java.lang.Throwable
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbDeleteReservedFiles.html b/docs/java/com/sleepycat/je/util/DbDeleteReservedFiles.html new file mode 100644 index 0000000..4717d8d --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbDeleteReservedFiles.html @@ -0,0 +1,279 @@ + + + + + +DbDeleteReservedFiles (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbDeleteReservedFiles

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbDeleteReservedFiles
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbDeleteReservedFiles
        +extends java.lang.Object
        +
        Command line utility used to delete reserved files explicitly, when + attempting to recover from a disk-full condition. + +

        When using HA (ReplicatedEnvironment), + cleaned files are reserved + and are not deleted until a disk limit is approached. Normally the + EnvironmentConfig.MAX_DISK and + EnvironmentConfig.FREE_DISK limits will + cause the reserved files to be deleted automatically to prevent + filling the disk. However, if these limits are both set to zero, or disk + space is used outside of the JE environment, it is possible for the disk + to become full. Manual recovery from this situation may require deleting + the reserved files without opening the JE Environment using the + application. This situation is not expected, but the DbDeleteReservedFiles utility provides a safeguard.

        + +

        Depending on the arguments given, the utility will either delete or list + the oldest reserved files. The files deleted or listed are those that can + be deleted in order to free the amount specified. Note that size deleted + may be larger than the specified size, because only whole files can be + deleted.

        + +
        + java { com.sleepycat.je.util.DbDeleteReservedFiles |
        +        -jar je-<version>.jar DbDeleteReservedFiles }
        +   -h <dir>            # environment home directory
        +   -s <size in MB>     # desired size to be freed in MB
        +  [-l]                       # list reserved files/sizes, do not delete
        +  [-V]                       # print JE version number
        +
        + +

        When the application uses custom key comparators, be sure to add the + jars or classes to the classpath that contain the application's comparator + classes.

        + +

        This utility opens the JE Environment in read-only mode in order to + determine which files are reserved. To speed up this process, specify + a large Java heap size when running the utility; 32 GB is recommended.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] args) 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] args)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbDump.html b/docs/java/com/sleepycat/je/util/DbDump.html new file mode 100644 index 0000000..c4a52d5 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbDump.html @@ -0,0 +1,722 @@ + + + + + +DbDump (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbDump

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbDump
        • +
        +
      • +
      +
      +
        +
      • +
        +
        Direct Known Subclasses:
        +
        DbScavenger
        +
        +
        +
        +
        public class DbDump
        +extends java.lang.Object
        +
        Dump the contents of a database. This utility may be used programmatically + or from the command line. + +

        When using this utility as a command line program, and the + application uses custom key comparators, be sure to add the jars or + classes to the classpath that contain the application's comparator + classes.

        + +
        + java { com.sleepycat.je.util.DbDump |
        +        -jar je-<version>.jar DbDump }
        +   -h <dir>           # environment home directory
        +  [-f <fileName>]     # output file, for non -rR dumps
        +  [-l]                # list databases in the environment
        +  [-p]                # output printable characters
        +  [-r]                # salvage mode
        +  [-R]                # aggressive salvage mode
        +  [-d] <directory>    # directory for *.dump files (salvage mode)
        +  [-s <databaseName>] # database to dump
        +  [-v]                # verbose in salvage mode
        +  [-V]                # print JE version number
        +
        + See main(java.lang.String[]) for a full description of the + command line arguments. +

        + To dump a database to a stream from code: +

        +    DbDump dump = new DbDump(env, databaseName, outputStream, boolean);
        +    dump.dump();
        + 
        + +

        + Because a DATA=END marker is used to terminate the dump of + each database, multiple databases can be dumped and loaded using a single + stream. The dump() method leaves the stream positioned after + the last line written and the DbLoad.load() method leaves the stream + positioned after the last line read.

        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          DbDump(Environment env, + java.lang.String dbName, + java.io.PrintStream outputFile, + boolean formatUsingPrintable) +
          Create a DbDump object for a specific environment and database.
          +
          DbDump(Environment env, + java.lang.String dbName, + java.io.PrintStream outputFile, + java.lang.String outputDirectory, + boolean formatUsingPrintable) +
          Deprecated.  +
          Please use the 4-arg ctor without outputDirectory instead.
          +
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voiddump() +
          Perform the dump.
          +
          protected voiddumpOne(java.io.PrintStream o, + byte[] ba, + boolean formatUsingPrintable) 
          static voidmain(java.lang.String[] argv) +
          The main used by the DbDump utility.
          +
          protected voidopenEnv(boolean doRecovery) 
          protected booleanparseArgs(java.lang.String[] argv) 
          protected voidprintHeader(java.io.PrintStream o, + boolean dupSort, + boolean formatUsingPrintable) 
          protected voidprintUsage(java.lang.String msg) 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            envHome

            +
            protected java.io.File envHome
            +
          • +
          + + + + + + + +
            +
          • +

            dbName

            +
            protected java.lang.String dbName
            +
          • +
          + + + +
            +
          • +

            formatUsingPrintable

            +
            protected boolean formatUsingPrintable
            +
          • +
          + + + +
            +
          • +

            outputDirectory

            +
            protected java.lang.String outputDirectory
            +
          • +
          + + + +
            +
          • +

            outputFile

            +
            protected java.io.PrintStream outputFile
            +
          • +
          + + + +
            +
          • +

            doScavengerRun

            +
            protected boolean doScavengerRun
            +
          • +
          + + + +
            +
          • +

            doAggressiveScavengerRun

            +
            protected boolean doAggressiveScavengerRun
            +
          • +
          + + + +
            +
          • +

            verbose

            +
            protected boolean verbose
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbDump

            +
            @Deprecated
            +public DbDump(Environment env,
            +                          java.lang.String dbName,
            +                          java.io.PrintStream outputFile,
            +                          java.lang.String outputDirectory,
            +                          boolean formatUsingPrintable)
            +
            Deprecated. Please use the 4-arg ctor without outputDirectory instead.
            +
          • +
          + + + +
            +
          • +

            DbDump

            +
            public DbDump(Environment env,
            +              java.lang.String dbName,
            +              java.io.PrintStream outputFile,
            +              boolean formatUsingPrintable)
            +
            Create a DbDump object for a specific environment and database.
            +
            +
            Parameters:
            +
            env - The Environment containing the database to dump.
            +
            dbName - The name of the database to dump.
            +
            outputFile - The output stream to dump the database to.
            +
            formatUsingPrintable - true if the dump should use printable + characters.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +                 throws java.lang.Exception
            +
            The main used by the DbDump utility.
            +
            +
            Parameters:
            +
            argv - The arguments accepted by the DbDump utility. + +
            + usage: java { com.sleepycat.je.util.DbDump | -jar
            + je-<version>.jar DbDump }
            +             [-f output-file] [-l] [-p] [-V]
            +             [-s database] -h dbEnvHome [-rR] [-v]
            +             [-d directory]
            + 
            + +
            +
            + -f - the file to dump to. If omitted, output is to System.out. + Does not apply when -r or -R is used. +
            + -l - list the databases in the environment. +
            + -p - output printable characters. +
            If characters in either the key or data items are printing + characters (as defined by isprint(3)), use printing characters in file + to represent them. This option permits users to use standard text + editors and tools to modify the contents of databases.
            +
            + -V - display the version of the JE library. +
            + -s database - the database to dump. Does not apply when -r or -R is + used. +
            + -h dbEnvHome - the directory containing the database environment. +
            + -d directory - the output directory for *.dump files. Applies only when + -r or -R is used. +
            + -v - print progress information to stdout for -r or -R mode. +
            + -r - Salvage data from possibly corrupt data files. +
            + The records for all databases are output. The records for each database + are saved into <databaseName>.dump files in the current directory. +

            + This option recreates the Btree structure in memory, so as large a heap + size as possible should be specified. If -r cannot be used due to + insufficient memory, use -R instead. +

            + When used on uncorrupted data files, this option should return + equivalent data to a normal dump, but most likely in a different order; + in other words, it should output a transactionally correct data set. + However, there is one exception where not all committed records will be + output: +

              +
            • When a committed transaction spans more than one .jdb file, and + the last file in this set of files has been deleted by the log + cleaner but earlier files have not, records for that transaction + that appear in the earlier files will not be output. This is because + the Commit entry in the last file is missing, and DbDump believes + that the transaction was not committed. Such missing output should + be relatively rare. Note that records in deleted files will be + output, because they were migrated forward by the log cleaner and + are no longer associated with a transaction.
            • +
            +
            +
            + -R - Aggressively salvage data from a possibly corrupt file. +
            +

            + The records for all databases are output. The records for each database + are saved into <databaseName>.dump files in the current directory. +

            + Unlike -r, the -R option does not recreate the Btree structure in + memory. However, it does use a bit set to track all committed + transactions, so as large a heap size as possible should be specified. +

            + -R also differs from -r in that -R does not return a transactionally + correct data set. This is because the Btree information is not + reconstructed in memory. Therefore, data dumped in this fashion will + almost certainly have to be edited by hand or other means before or + after the data is reloaded. Be aware of the following abnormalities. +

              +
            • Deleted records are often output. An application specific + technique should normally be used to correct for this.
            • +
            • Multiple versions of the same record are sometimes output. When + this happens, the more recent version of a record is output first. + Therefore, the -n option should normally be used when running + DbLoad.
            • +
            • When a committed transaction spans more than one .jdb file, and + the last file in this set of files has been deleted by the log + cleaner but earlier files have not, records for that transaction + that appear in the earlier files will not be output. This is because + the Commit entry in the last file is missing, and DbDump believes + that the transaction was not committed. Such missing output should + be relatively rare. Note that records in deleted files will be + output, because they were migrated forward by the log cleaner and + are no longer associated with a transaction. (This abnormality also + occurs with -r.)
            • +
            +
            +
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            printUsage

            +
            protected void printUsage(java.lang.String msg)
            +
          • +
          + + + +
            +
          • +

            parseArgs

            +
            protected boolean parseArgs(java.lang.String[] argv)
            +                     throws java.io.IOException
            +
            +
            Throws:
            +
            java.io.IOException
            +
            +
          • +
          + + + + + + + + + + + +
            +
          • +

            printHeader

            +
            protected void printHeader(java.io.PrintStream o,
            +                           boolean dupSort,
            +                           boolean formatUsingPrintable)
            +
          • +
          + + + +
            +
          • +

            dumpOne

            +
            protected void dumpOne(java.io.PrintStream o,
            +                       byte[] ba,
            +                       boolean formatUsingPrintable)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbFilterStats.html b/docs/java/com/sleepycat/je/util/DbFilterStats.html new file mode 100644 index 0000000..a2856b8 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbFilterStats.html @@ -0,0 +1,328 @@ + + + + + +DbFilterStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbFilterStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbFilterStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbFilterStats
        +extends java.lang.Object
        +
        Transform one or more je.stat.csv statistics files and + write the output to stdout. A set of column names is used to + specify the order and which columns are written to the output. + The utility is used to create an output file that is easier to + analyze by projecting and ordering only the data that is required. + Each user specified column name will either be a exact match of a + column in the file or a prefix match. In order to output the "time" + and all "Op" group statistics a column list "time,Op" could be used. + Multiple input files are processed in the order specified on the + command line. Duplicate column headers are suppressed in the output + when processing multiple input files.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbFilterStats() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanexecute(java.lang.String[] argv) +
          Performs the processing of the DbFilterStats command.
          +
          static voidmain(java.lang.String[] argv) +
          The main used by the DbFilterStats utility.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbFilterStats

            +
            public DbFilterStats()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +
            The main used by the DbFilterStats utility.
            +
            +
            Parameters:
            +
            argv - An array of command line arguments to the DbFilterStats + utility. + +
            + usage: java { com.sleepycat.je.util.DbFilterStats | -jar
            + je.jar DbFilterStats }
            +  -f  <projection file>
            +  -p  <column projection list> A comma separated list of column
            +      names to project.
            +  <stat file> [<stat file>]
            + 
            + +

            At least one argument must be specified.

            +
            +
          • +
          + + + +
            +
          • +

            execute

            +
            public boolean execute(java.lang.String[] argv)
            +
            Performs the processing of the DbFilterStats command.
            +
            +
            Parameters:
            +
            argv - DbFilterStats command arguments
            +
            Returns:
            +
            true if command is successful, otherwise false
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbLoad.html b/docs/java/com/sleepycat/je/util/DbLoad.html new file mode 100644 index 0000000..28ed8d1 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbLoad.html @@ -0,0 +1,614 @@ + + + + + +DbLoad (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbLoad

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbLoad
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbLoad
        +extends java.lang.Object
        +
        Loads a database from a dump file generated by DbDump. + This utility may be used programmatically or from the command line. + +

        When using this utility as a command line program, and the + application uses custom key comparators, be sure to add the jars or + classes to the classpath that contain the application's comparator + classes.

        + +
        + java { com.sleepycat.je.util.DbLoad |
        +        -jar je-<version>.jar DbLoad }
        +     -h <dir>            # environment home directory
        +    [-f <fileName>]      # input file
        +    [-n]                 # no overwrite mode
        +    [-T]                 # input file is in text mode
        +    [-I]                 # ignore unknown parameters
        +    [-c name=value]      # config values
        +    [-s <databaseName> ] # database to load
        +    [-v]                 # show progress
        +    [-V]                 # print JE version number
        +
        + See main(java.lang.String[]) for a full description of the + command line arguments. +

        + To load a database to a stream from code: +

        +    DbLoad loader = new DbLoad();
        +    loader.setEnv(env);
        +    loader.setDbName(dbName);
        +    loader.setInputStream(stream);
        +    loader.setNoOverwrite(noOvrwr);
        +    loader.setTextFileMode(tfm);
        +    loader.load();
        + 
        + +

        Because a DATA=END marker is used to terminate the dump of + each database, multiple databases can be dumped and loaded using a single + stream. The DbDump.dump() method leaves the stream positioned after + the last line written and the load() method leaves the stream + positioned after the last line read.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          protected Environmentenv 
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbLoad() +
          Creates a DbLoad object.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanload() 
          static voidmain(java.lang.String[] argv) +
          The main used by the DbLoad utility.
          +
          voidsetDbName(java.lang.String dbName) +
          Sets the database name to load.
          +
          voidsetEnv(Environment env) +
          Sets the Environment to load from.
          +
          voidsetIgnoreUnknownConfig(boolean ignoreUnknownConfigMode) +
          Sets whether to ignore unknown parameters in the config file.
          +
          voidsetInputReader(java.io.BufferedReader reader) +
          Sets the BufferedReader to load from.
          +
          voidsetNoOverwrite(boolean noOverwrite) +
          Sets whether the load should overwrite existing data or not.
          +
          voidsetProgressInterval(long progressInterval) +
          If progressInterval is set, progress status messages are generated to + stdout at set percentages of the load.
          +
          voidsetTextFileMode(boolean textFileMode) +
          Sets whether the load data is in text file format.
          +
          voidsetTotalLoadBytes(long totalLoadBytes) +
          Used for progress status messages.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbLoad

            +
            public DbLoad()
            +
            Creates a DbLoad object.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +                 throws java.lang.Exception
            +
            The main used by the DbLoad utility.
            +
            +
            Parameters:
            +
            argv - The arguments accepted by the DbLoad utility. + +
            + usage: java { com.sleepycat.je.util.DbLoad | -jar
            + je-<version>.jar DbLoad }
            +             [-f input-file] [-n] [-V] [-v] [-T] [-I]
            +             [-c name=value]
            +             [-s database] -h dbEnvHome
            + 
            + +

            -f - the file to load from (in DbDump format)
            + -n - no overwrite mode. Do not overwrite existing data.
            + -V - display the version of the JE library.
            + -T - input file is in Text mode.
            + -I - ignore unknown parameters in the config file.

            + +

            If -f is not specified, the dump is read from System.in.

            + +

            The -T option allows JE applications to easily load text files into + databases.

            + +

            The -I option allows loading databases that were dumped with the + Berkeley DB C product, when the dump file contains parameters not known + to JE.

            + +

            The input must be paired lines of text, where the first line of the + pair is the key item, and the second line of the pair is its + corresponding data item.

            + +

            A simple escape mechanism, where newline and backslash (\) characters + are special, is applied to the text input. Newline characters are + interpreted as record separators. Backslash characters in the text will + be interpreted in one of two ways: If the backslash character precedes + another backslash character, the pair will be interpreted as a literal + backslash. If the backslash character precedes any other character, the + two characters following the backslash will be interpreted as a + hexadecimal specification of a single character; for example, \0a is a + newline character in the ASCII character set.

            + +

            For this reason, any backslash or newline characters that naturally + occur in the text input must be escaped to avoid misinterpretation by + db_load.

            + +

            -c name=value - Specify configuration options ignoring any value they + may have based on the input. The command-line format is name=value. See + the Supported Keywords section below for a list of keywords supported by + the -c option.

            + +

            -s database - the database to load.
            + -h dbEnvHome - the directory containing the database environment.
            + -v - report progress

            + +

            Supported Keywords
            + version=N - specify the version of the input file. Currently only + version 3 is supported.
            + format - specify the format of the file. Allowable values are "print" + and "bytevalue".
            + dupsort - specify whether the database allows duplicates or not. + Allowable values are "true" and "false".
            + type - specifies the type of database. Only "btree" is allowed.
            + database - specifies the name of the database to be loaded.

            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            setEnv

            +
            public void setEnv(Environment env)
            +
            Sets the Environment to load from.
            +
            +
            Parameters:
            +
            env - The environment.
            +
            +
          • +
          + + + +
            +
          • +

            setDbName

            +
            public void setDbName(java.lang.String dbName)
            +
            Sets the database name to load.
            +
            +
            Parameters:
            +
            dbName - database name
            +
            +
          • +
          + + + +
            +
          • +

            setInputReader

            +
            public void setInputReader(java.io.BufferedReader reader)
            +
            Sets the BufferedReader to load from.
            +
            +
            Parameters:
            +
            reader - The BufferedReader.
            +
            +
          • +
          + + + +
            +
          • +

            setNoOverwrite

            +
            public void setNoOverwrite(boolean noOverwrite)
            +
            Sets whether the load should overwrite existing data or not.
            +
            +
            Parameters:
            +
            noOverwrite - True if existing data should not be overwritten.
            +
            +
          • +
          + + + +
            +
          • +

            setTextFileMode

            +
            public void setTextFileMode(boolean textFileMode)
            +
            Sets whether the load data is in text file format.
            +
            +
            Parameters:
            +
            textFileMode - True if the load data is in text file format.
            +
            +
          • +
          + + + +
            +
          • +

            setIgnoreUnknownConfig

            +
            public void setIgnoreUnknownConfig(boolean ignoreUnknownConfigMode)
            +
            Sets whether to ignore unknown parameters in the config file. This + allows loading databases that were dumped with the Berkeley DB C + product, when the dump file contains parameters not known to JE.
            +
            +
            Parameters:
            +
            ignoreUnknownConfigMode - True to ignore unknown parameters in + the config file.
            +
            +
          • +
          + + + +
            +
          • +

            setProgressInterval

            +
            public void setProgressInterval(long progressInterval)
            +
            If progressInterval is set, progress status messages are generated to + stdout at set percentages of the load.
            +
            +
            Parameters:
            +
            progressInterval - Specifies the percentage intervals for status + messages. If 0, no messages are generated.
            +
            +
          • +
          + + + +
            +
          • +

            setTotalLoadBytes

            +
            public void setTotalLoadBytes(long totalLoadBytes)
            +
            Used for progress status messages. Must be set to greater than + 0 if the progressInterval is greater than 0.
            +
            +
            Parameters:
            +
            totalLoadBytes - number of input bytes to be loaded.
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbPrintLog.html b/docs/java/com/sleepycat/je/util/DbPrintLog.html new file mode 100644 index 0000000..bf3341e --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbPrintLog.html @@ -0,0 +1,361 @@ + + + + + +DbPrintLog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbPrintLog

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbPrintLog
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbPrintLog
        +extends java.lang.Object
        +
        Dumps the contents of the log in XML format to System.out. + +

        To print an environment log:

        + +
        +      DbPrintLog.main(argv);
        + 
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbPrintLog() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voiddump(java.io.File envHome, + java.lang.String entryTypes, + java.lang.String txnIds, + long startLsn, + long endLsn, + boolean verbose, + boolean stats, + boolean repEntriesOnly, + boolean csvFormat, + boolean forwards, + boolean vlsnDistribution, + java.lang.String customDumpReaderClass) +
          Dump a JE log into human readable form.
          +
          static voidmain(java.lang.String[] argv) +
          The main used by the DbPrintLog utility.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbPrintLog

            +
            public DbPrintLog()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +
            The main used by the DbPrintLog utility.
            +
            +
            Parameters:
            +
            argv - An array of command line arguments to the DbPrintLog + utility. + +
            + usage: java { com.sleepycat.je.util.DbPrintLog | -jar
            + je-<version>.jar DbPrintLog }
            +  -h <envHomeDir>
            +  -s  <start file number or LSN, in hex>
            +  -e  <end file number or LSN, in hex>
            +  -k  <binary|hex|text|obfuscate> (format for dumping the key/data)
            +  -db <targeted db ids, comma separated>
            +  -tx <targeted txn ids, comma separated>
            +  -ty <targeted entry types, comma separated>
            +  -S  show summary of log entries
            +  -SC show summary of log entries in CSV format
            +  -r  only print replicated log entries
            +  -b  scan log backwards. The entire log must be scanned, cannot be used
            +      with -s or -e
            +  -q  if specified, concise version is printed,
            +      default is verbose version
            +  -c  <name of custom dump reader class> if specified, DbPrintLog
            +      will attempt to load a class of this name, which will be used to
            +      process log entries. Used to customize formatting and dumping when
            +      debugging files.
            + 
            + +

            All arguments are optional. The current directory is used if -h is not specified.

            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbScavenger.html b/docs/java/com/sleepycat/je/util/DbScavenger.html new file mode 100644 index 0000000..7396a67 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbScavenger.html @@ -0,0 +1,371 @@ + + + + + +DbScavenger (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbScavenger

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class DbScavenger
        +extends DbDump
        +
        Used to retrieve as much data as possible from a corrupted environment. + This utility is meant to be used programmatically, and is the equivalent + to the -R or -r options for DbDump. +

        + To scavenge a database: +

        +  DbScavenger scavenger =
        +      new DbScavenger(env, outputDirectory, , , );
        +  scavenger.dump();
        +
        + +

        + The recovered databases will put placed in the outputDirectory with ".dump" + file suffixes. The format of the .dump files will be suitable for use with + DbLoad.

        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbScavenger

            +
            public DbScavenger(Environment env,
            +                   java.lang.String outputDirectory,
            +                   boolean formatUsingPrintable,
            +                   boolean doAggressiveScavengerRun,
            +                   boolean verbose)
            +
            Create a DbScavenger object for a specific environment. +

            +
            +
            Parameters:
            +
            env - The Environment containing the database to dump.
            +
            outputDirectory - The directory to create the .dump files in.
            +
            formatUsingPrintable - true if the dump should use printable + characters.
            +
            doAggressiveScavengerRun - true if true, then all data records are + dumped, regardless of whether they are the latest version or not.
            +
            verbose - true if status output should be written to System.out + during scavenging.
            +
            +
          • +
          +
        • +
        + + +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbSpace.html b/docs/java/com/sleepycat/je/util/DbSpace.html new file mode 100644 index 0000000..2e03f0c --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbSpace.html @@ -0,0 +1,403 @@ + + + + + +DbSpace (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbSpace

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbSpace
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbSpace
        +extends java.lang.Object
        +
        DbSpace displays the disk space utilization for an environment. +
        + usage: java { com.sleepycat.je.util.DbSpace |
        +               -jar je-<version>.jar DbSpace }
        +          -h <dir># environment home directory
        +         [-q]     # quiet, print grand totals only
        +         [-u]     # sort by average utilization
        +         [-d]     # dump file summary details
        +         [-r]     # recalculate utilization (expensive)
        +         [-R]     # recalculate expired data (expensive)
        +         [-s]     # start file number or LSN, in hex
        +         [-e]     # end file number or LSN, in hex
        +         [-t]     # time for calculating expired data
        +                  #   format: yyyy-MM-dd'T'HHZ
        +                  #  example: 2016-03-09T22-0800
        +         [-V]     # print JE version number
        + 
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbSpace(Environment env, + boolean quiet, + boolean details, + boolean sorted) +
          Creates a DbSpace object for calculating utilization using an open + Environment.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] argv) 
          voidprint(java.io.PrintStream out) +
          Calculates utilization and prints a report to the given output stream.
          +
          voidsetEndFile(long endFile) +
          Sets the ending file number, which is an upper bound on the range of + files for which utilization is reported and (optionally) recalculated.
          +
          voidsetRecalculate(boolean recalc) +
          Sets the recalculation property, which if true causes a more expensive + recalculation of utilization to be performed for debugging purposes.
          +
          voidsetStartFile(long startFile) +
          Sets the start file number, which is a lower bound on the range of + files for which utilization is reported and (optionally) recalculated.
          +
          voidsetTime(long time) +
          Sets the time for calculating expired data.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbSpace

            +
            public DbSpace(Environment env,
            +               boolean quiet,
            +               boolean details,
            +               boolean sorted)
            +
            Creates a DbSpace object for calculating utilization using an open + Environment.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +                 throws java.lang.Exception
            +
            +
            Throws:
            +
            java.lang.Exception
            +
            +
          • +
          + + + +
            +
          • +

            setRecalculate

            +
            public void setRecalculate(boolean recalc)
            +
            Sets the recalculation property, which if true causes a more expensive + recalculation of utilization to be performed for debugging purposes. + This property is false by default.
            +
          • +
          + + + +
            +
          • +

            setStartFile

            +
            public void setStartFile(long startFile)
            +
            Sets the start file number, which is a lower bound on the range of + files for which utilization is reported and (optionally) recalculated. + By default there is no lower bound.
            +
          • +
          + + + +
            +
          • +

            setEndFile

            +
            public void setEndFile(long endFile)
            +
            Sets the ending file number, which is an upper bound on the range of + files for which utilization is reported and (optionally) recalculated. + By default there is no upper bound.
            +
          • +
          + + + +
            +
          • +

            setTime

            +
            public void setTime(long time)
            +
            Sets the time for calculating expired data.
            +
          • +
          + + + +
            +
          • +

            print

            +
            public void print(java.io.PrintStream out)
            +           throws DatabaseException
            +
            Calculates utilization and prints a report to the given output stream.
            +
            +
            Throws:
            +
            DatabaseException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbStat.html b/docs/java/com/sleepycat/je/util/DbStat.html new file mode 100644 index 0000000..c290668 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbStat.html @@ -0,0 +1,313 @@ + + + + + +DbStat (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbStat

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class DbStat
        +extends DbVerify
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbStat(Environment env, + java.lang.String dbName) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] argv) 
          booleanstats(java.io.PrintStream out) 
          + +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbTruncateLog.html b/docs/java/com/sleepycat/je/util/DbTruncateLog.html new file mode 100644 index 0000000..2dab8c6 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbTruncateLog.html @@ -0,0 +1,316 @@ + + + + + +DbTruncateLog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbTruncateLog

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbTruncateLog
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbTruncateLog
        +extends java.lang.Object
        +
        DbTruncateLog is a utility that lets the user truncate JE log starting at a + specified file and offset to the last log file, inclusive. Generally used in + replication systems for handling + com.sleepycat.je.rep.RollbackProhibitedException, to permit the application + to interject application specific handling. Should be used with caution. +

        + The parameters for DbTruncateLog are provided through the + RollbackProhibitedException instance, and the exception message. The goal is + to truncate the JE log after a specified file number and file offset. + DbTruncateLog will automatically delete all log entries after that specified + log entry. +

        + For example, suppose the JE log consists of these files: +

        +    00000002.jdb
        +    0000000e.jdb
        +    0000000f.jdb
        +    00000010.jdb
        +    00000012.jdb
        +    0000001d.jdb
        +    0000001e.jdb
        +    0000001f.jdb
        + 
        + And the log must be truncated at file 0x1d, offset 0x34567, users should use + the following command: +
          +
        1. DbTruncateLog -h <envDir> -f 0x1d -o 0x34567
        2. +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          DbTruncateLog() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] argv) +
          Usage:
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            DbTruncateLog

            +
            public DbTruncateLog()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +
            Usage: +
            +  -h environmentDirectory
            +  -f file number. If hex, prefix with "0x"
            +  -o file offset byte. If hex, prefix with "0x"
            + 
            + For example, to truncate a log to file 0xa, offset 0x1223: +
            + DbTruncateLog -h <environmentDir> -f 0xa -o 0x1223
            + 
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbVerify.html b/docs/java/com/sleepycat/je/util/DbVerify.html new file mode 100644 index 0000000..238f24a --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbVerify.html @@ -0,0 +1,389 @@ + + + + + +DbVerify (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbVerify

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbVerify
        • +
        +
      • +
      +
      +
        +
      • +
        +
        Direct Known Subclasses:
        +
        DbStat
        +
        +
        +
        +
        public class DbVerify
        +extends java.lang.Object
        +
        Verifies the internal structures of a database. + +

        When using this utility as a command line program, and the + application uses custom key comparators, be sure to add the jars or + classes to the classpath that contain the application's comparator + classes.

        + +

        To verify a database and write the errors to stream:

        + +
        +    DbVerify verifier = new DbVerify(env, dbName, quiet);
        +    verifier.verify();
        + 
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +                 throws DatabaseException
            +
            The main used by the DbVerify utility.
            +
            +
            Parameters:
            +
            argv - The arguments accepted by the DbVerify utility. + +
            + usage: java { com.sleepycat.je.util.DbVerify | -jar
            + je-<version>.jar DbVerify }
            +             [-q] [-V] -s database -h dbEnvHome [-v progressInterval]
            +             [-bs batchSize] [-d delayMs] [-vdr]
            + 
            + +

            + -V - show the version of the JE library.
            + -s - specify the database to verify
            + -h - specify the environment directory
            + -q - work quietly and don't display errors
            + -v - report intermediate statistics every progressInterval Leaf Nodes
            + -bs - specify how many records to check each batch
            + -d - specify the delay in ms between batches
            + -vdr - verify data records (read LNs)
            +

            + +

            Note that the DbVerify command line cannot be used to verify the + integrity of secondary databases, because this feature requires the + secondary databases to have been opened by the application. To verify + secondary database integrity, use Environment.verify(com.sleepycat.je.VerifyConfig, java.io.PrintStream) or + Database.verify(com.sleepycat.je.VerifyConfig) instead, from within the + application.

            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/DbVerifyLog.html b/docs/java/com/sleepycat/je/util/DbVerifyLog.html new file mode 100644 index 0000000..ea40808 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/DbVerifyLog.html @@ -0,0 +1,421 @@ + + + + + +DbVerifyLog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class DbVerifyLog

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.DbVerifyLog
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class DbVerifyLog
        +extends java.lang.Object
        +
        Verifies the checksums in one or more log files. + +

        This class may be instantiated and used programmatically, or used as a + command line utility as described below.

        + +
        + usage: java { com.sleepycat.je.util.DbVerifyLog |
        +               -jar je-<version>.jar DbVerifyLog }
        +  [-h <dir>]      # environment home directory
        +  [-s <file>]     # starting (minimum) file number
        +  [-e <file>]     # ending (one past the maximum) file number
        +  [-d <millis>]   # delay in ms between reads (default is zero)
        +  [-V]                  # print JE version number"
        + 
        + +

        All arguments are optional. The current directory is used if -h + is not specified. File numbers may be specified in hex (preceded by 0x) or decimal format. For convenience when copy/pasting from other + output, LSN format (<file>/<offset>) is also allowed.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          DbVerifyLog(Environment env) +
          Creates a utility object for verifying the checksums in log files.
          +
          DbVerifyLog(Environment env, + int readBufferSize) +
          Creates a utility object for verifying log files.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static voidmain(java.lang.String[] argv) 
          voidsetReadDelay(long delay, + java.util.concurrent.TimeUnit unit) +
          Configures the delay between file reads during verification.
          +
          voidverify(long startFile, + long endFile) +
          Verifies the given range of log files in the environment.
          +
          voidverifyAll() +
          Verifies all log files in the environment.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + + + + + +
            +
          • +

            DbVerifyLog

            +
            public DbVerifyLog(Environment env,
            +                   int readBufferSize)
            +
            Creates a utility object for verifying log files.
            +
            +
            Parameters:
            +
            env - the Environment associated with the log.
            +
            readBufferSize - is the buffer size to use. If a value less than + or equal to zero is specified, EnvironmentConfig.LOG_ITERATOR_READ_SIZE is used.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            verifyAll

            +
            public void verifyAll()
            +               throws LogVerificationException,
            +                      java.io.IOException
            +
            Verifies all log files in the environment.
            +
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents.
            +
            java.io.IOException - if an IOException occurs while reading a log file.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          + + + +
            +
          • +

            verify

            +
            public void verify(long startFile,
            +                   long endFile)
            +            throws LogVerificationException,
            +                   java.io.IOException
            +
            Verifies the given range of log files in the environment.
            +
            +
            Parameters:
            +
            startFile - is the lowest numbered log file to be verified.
            +
            endFile - is one greater than the highest numbered log file to be + verified.
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents.
            +
            java.io.IOException - if an IOException occurs while reading a log file.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] argv)
            +
          • +
          + + + +
            +
          • +

            setReadDelay

            +
            public void setReadDelay(long delay,
            +                         java.util.concurrent.TimeUnit unit)
            +
            Configures the delay between file reads during verification. A delay + between reads is needed to allow other JE components, such as HA, to + make timely progress. + +

            By default there is no read delay (it is zero).

            + +

            Note that when using the background data verifier, the delay between reads is + EnvironmentConfig.VERIFY_LOG_READ_DELAY.

            +
            +
            Parameters:
            +
            delay - the delay between reads or zero for no delay.
            +
            unit - the TimeUnit of the delay value. May be + null only if delay is zero.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/FileHandler.html b/docs/java/com/sleepycat/je/util/FileHandler.html new file mode 100644 index 0000000..6452611 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/FileHandler.html @@ -0,0 +1,351 @@ + + + + + +FileHandler (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class FileHandler

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.util.logging.Handler
        • +
        • +
            +
          • java.util.logging.StreamHandler
          • +
          • +
              +
            • java.util.logging.FileHandler
            • +
            • +
                +
              • com.sleepycat.je.util.FileHandler
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class FileHandler
        +extends java.util.logging.FileHandler
        +
        JE instances of java.util.logging.Logger are configured to use this + implementation of java.util.logging.FileHandler. By default, the handler's + level is Level.INFO To enable the console output, use the standard + java.util.logging.LogManager configuration to set the desired level: +
        + com.sleepycat.je.util.FileHandler.level=INFO
        + 
        +

        + The default destination for this output is a circular set of files named + <environmentHome>/je.info.# The logging file size can be configured + with standard java.util.logging.FileHandler configuration. +

        + JE augments the java.util.logging API with a JE environment parameter for + setting handler levels. This is described in greater detail in + + Chapter 12.Administering Berkeley DB Java Edition Applications

        +
        +
        See Also:
        +
        + Chapter 12. Logging, +Using JE Trace Logging
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          FileHandler(java.lang.String pattern, + int limit, + int count, + java.util.logging.Formatter formatter, + com.sleepycat.je.dbi.EnvironmentImpl envImpl) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          +
            +
          • + + +

            Methods inherited from class java.util.logging.FileHandler

            +close, publish
          • +
          +
            +
          • + + +

            Methods inherited from class java.util.logging.StreamHandler

            +flush, isLoggable, setEncoding, setOutputStream
          • +
          +
            +
          • + + +

            Methods inherited from class java.util.logging.Handler

            +getEncoding, getErrorManager, getFilter, getFormatter, getLevel, reportError, setErrorManager, setFilter, setFormatter, setLevel
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            STIFLE_DEFAULT_ERROR_MANAGER

            +
            public static boolean STIFLE_DEFAULT_ERROR_MANAGER
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            FileHandler

            +
            public FileHandler(java.lang.String pattern,
            +                   int limit,
            +                   int count,
            +                   java.util.logging.Formatter formatter,
            +                   com.sleepycat.je.dbi.EnvironmentImpl envImpl)
            +            throws java.lang.SecurityException,
            +                   java.io.IOException
            +
            +
            Throws:
            +
            java.lang.SecurityException
            +
            java.io.IOException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/LogVerificationException.html b/docs/java/com/sleepycat/je/util/LogVerificationException.html new file mode 100644 index 0000000..03a21b7 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/LogVerificationException.html @@ -0,0 +1,291 @@ + + + + + +LogVerificationException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class LogVerificationException

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • +
            +
          • java.lang.Exception
          • +
          • +
              +
            • java.io.IOException
            • +
            • +
                +
              • com.sleepycat.je.util.LogVerificationException
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class LogVerificationException
        +extends java.io.IOException
        +
        Thrown during log verification if a checksum cannot be verified or a log + entry is determined to be invalid by examining its contents. + +

        This class extends IOException so that it can be thrown by the + InputStream methods of LogVerificationInputStream.

        +
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            LogVerificationException

            +
            public LogVerificationException(java.lang.String message)
            +
          • +
          + + + +
            +
          • +

            LogVerificationException

            +
            public LogVerificationException(java.lang.String message,
            +                                java.lang.Throwable cause)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/LogVerificationInputStream.html b/docs/java/com/sleepycat/je/util/LogVerificationInputStream.html new file mode 100644 index 0000000..2cb6aa1 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/LogVerificationInputStream.html @@ -0,0 +1,528 @@ + + + + + +LogVerificationInputStream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class LogVerificationInputStream

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.io.InputStream
        • +
        • +
            +
          • com.sleepycat.je.util.LogVerificationInputStream
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class LogVerificationInputStream
        +extends java.io.InputStream
        +
        Verifies the checksums in an InputStream for a log file in a JE + Environment. + +

        This InputStream reads input from some other given InputStream, and verifies checksums while reading. Its primary intended + use is to verify log files that are being copied as part of a programmatic + backup. It is critical that invalid files are not added to a backup set, + since then both the live environment and the backup will be invalid.

        + +

        The following example verifies log files as they are being copied. The + DbBackup class should normally be used to obtain the array of files + to be copied.

        + + + +
        +  void copyFiles(final Environment env,
        +                 final String[] fileNames,
        +                 final File destDir,
        +                 final int bufSize)
        +      throws IOException, DatabaseException {
        +
        +      final File srcDir = env.getHome();
        +
        +      for (final String fileName : fileNames) {
        +
        +          final File destFile = new File(destDir, fileName);
        +          final FileOutputStream fos = new FileOutputStream(destFile);
        +
        +          final File srcFile = new File(srcDir, fileName);
        +          final FileInputStream fis = new FileInputStream(srcFile);
        +          final LogVerificationInputStream vis =
        +              new LogVerificationInputStream(env, fis, fileName);
        +
        +          final byte[] buf = new byte[bufSize];
        +
        +          try {
        +              while (true) {
        +                  final int len = vis.read(buf);
        +                  if (len < 0) {
        +                      break;
        +                  }
        +                  fos.write(buf, 0, len);
        +              }
        +          } finally {
        +              fos.close();
        +              vis.close();
        +          }
        +      }
        +  }
        + 
        + +

        It is important to read the entire underlying input stream until the + end-of-file is reached to detect incomplete entries at the end of the log + file.

        + +

        Note that mark and reset are not supported and markSupported returns false. The default InputStream + implementation of these methods is used.

        +
        +
        See Also:
        +
        DbBackup, +DbVerifyLog
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          LogVerificationInputStream(Environment env, + java.io.InputStream in, + java.lang.String fileName) +
          Creates a verification input stream.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intavailable()
          voidclose()
          intread()
          intread(byte[] b)
          intread(byte[] b, + int off, + int len)
          longskip(long bytesToSkip)
          +
            +
          • + + +

            Methods inherited from class java.io.InputStream

            +mark, markSupported, reset
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            LogVerificationInputStream

            +
            public LogVerificationInputStream(Environment env,
            +                                  java.io.InputStream in,
            +                                  java.lang.String fileName)
            +
            Creates a verification input stream.
            +
            +
            Parameters:
            +
            env - the Environment associated with the log.
            +
            in - the underlying InputStream for the log to be read.
            +
            fileName - the file name of the input stream, for reporting in the + LogVerificationException. This should be a simple file name of + the form NNNNNNNN.jdb, where NNNNNNNN is the file number in + hexadecimal format.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            read

            +
            public int read()
            +         throws java.io.IOException
            +
            + +

            This method reads the underlying InputStream and verifies the + contents of the stream.

            +
            +
            Specified by:
            +
            read in class java.io.InputStream
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            read

            +
            public int read(byte[] b)
            +         throws java.io.IOException
            +
            + +

            This method reads the underlying InputStream and verifies the + contents of the stream.

            +
            +
            Overrides:
            +
            read in class java.io.InputStream
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            read

            +
            public int read(byte[] b,
            +                int off,
            +                int len)
            +         throws java.io.IOException
            +
            + +

            This method reads the underlying InputStream and verifies the + contents of the stream.

            +
            +
            Overrides:
            +
            read in class java.io.InputStream
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            skip

            +
            public long skip(long bytesToSkip)
            +          throws java.io.IOException
            +
            + +

            This method reads the underlying InputStream in order to + skip the required number of bytes and verifies the contents of the + stream. A temporary buffer is allocated lazily for reading.

            +
            +
            Overrides:
            +
            skip in class java.io.InputStream
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            available

            +
            public int available()
            +              throws java.io.IOException
            +
            + +

            This method simply performs in.available().

            +
            +
            Overrides:
            +
            available in class java.io.InputStream
            +
            Throws:
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws java.io.IOException
            +
            + +

            This method simply performs in.close().

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Overrides:
            +
            close in class java.io.InputStream
            +
            Throws:
            +
            java.io.IOException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/LogVerificationReadableByteChannel.html b/docs/java/com/sleepycat/je/util/LogVerificationReadableByteChannel.html new file mode 100644 index 0000000..8207cff --- /dev/null +++ b/docs/java/com/sleepycat/je/util/LogVerificationReadableByteChannel.html @@ -0,0 +1,430 @@ + + + + + +LogVerificationReadableByteChannel (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class LogVerificationReadableByteChannel

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.LogVerificationReadableByteChannel
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable, java.nio.channels.Channel, java.nio.channels.ReadableByteChannel
        +
        +
        +
        +
        public class LogVerificationReadableByteChannel
        +extends java.lang.Object
        +implements java.nio.channels.ReadableByteChannel
        +
        Verifies the checksums in a ReadableByteChannel for a log file in a + JE Environment. This class is similar to the LogVerificationInputStream class, but permits using NIO channels and direct + buffers to provide better copying performance. + +

        This ReadableByteChannel reads input from some other given ReadableByteChannel, and verifies checksums while reading. Its primary + intended use is to verify log files that are being copied as part of a + programmatic backup. It is critical that invalid files are not added to a + backup set, since then both the live environment and the backup will be + invalid. + +

        The following example verifies log files as they are being copied. The + DbBackup class should normally be used to obtain the array of files + to be copied. + + + +

        +  void copyFilesNIO(final Environment env,
        +                    final String[] fileNames,
        +                    final File destDir,
        +                    final int bufSize)
        +      throws IOException, DatabaseException {
        +
        +      final File srcDir = env.getHome();
        +
        +      for (final String fileName : fileNames) {
        +
        +          final File destFile = new File(destDir, fileName);
        +          final FileOutputStream fos = new FileOutputStream(destFile);
        +          final FileChannel foc = fos.getChannel();
        +
        +          final File srcFile = new File(srcDir, fileName);
        +          final FileInputStream fis = new FileInputStream(srcFile);
        +          final FileChannel fic = fis.getChannel();
        +          final LogVerificationReadableByteChannel vic =
        +              new LogVerificationReadableByteChannel(env, fic, fileName);
        +
        +          final ByteBuffer buf = ByteBuffer.allocateDirect(bufSize);
        +
        +          try {
        +              while (true) {
        +                  final int len = vic.read(buf);
        +                  if (len < 0) {
        +                      break;
        +                  }
        +                  buf.flip();
        +                  foc.write(buf);
        +                  buf.clear();
        +              }
        +          } finally {
        +              fos.close();
        +              vic.close();
        +          }
        +      }
        +  }
        + 
        + +

        It is important to read the entire underlying input stream until the + end-of-file is reached to detect incomplete entries at the end of the log + file.

        +
        +
        See Also:
        +
        DbBackup, +DbVerifyLog, +LogVerificationInputStream
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          LogVerificationReadableByteChannel(Environment env, + java.nio.channels.ReadableByteChannel channel, + java.lang.String fileName) +
          Creates a verification input stream.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidclose()
          booleanisOpen()
          intread(java.nio.ByteBuffer buffer)
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            LogVerificationReadableByteChannel

            +
            public LogVerificationReadableByteChannel(Environment env,
            +                                          java.nio.channels.ReadableByteChannel channel,
            +                                          java.lang.String fileName)
            +
            Creates a verification input stream.
            +
            +
            Parameters:
            +
            env - the Environment associated with the log
            +
            channel - the underlying ReadableByteChannel for the log to + be read
            +
            fileName - the file name of the input stream, for reporting in the + LogVerificationException. This should be a simple file name of + the form NNNNNNNN.jdb, where NNNNNNNN is the file number in + hexadecimal format.
            +
            Throws:
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            read

            +
            public int read(java.nio.ByteBuffer buffer)
            +         throws java.io.IOException
            +
            + +

            This method reads the underlying ReadableByteChannel and + verifies the contents of the stream.

            +
            +
            Specified by:
            +
            read in interface java.nio.channels.ReadableByteChannel
            +
            Throws:
            +
            LogVerificationException - if a checksum cannot be verified or a + log entry is determined to be invalid by examining its contents
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws java.io.IOException
            +
            + +

            This method calls close on the underlying channel.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Specified by:
            +
            close in interface java.nio.channels.Channel
            +
            Throws:
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            isOpen

            +
            public boolean isOpen()
            +
            + +

            This method calls isOpen on the underlying channel.

            +
            +
            Specified by:
            +
            isOpen in interface java.nio.channels.Channel
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/Splitter.html b/docs/java/com/sleepycat/je/util/Splitter.html new file mode 100644 index 0000000..6d1cbe1 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/Splitter.html @@ -0,0 +1,280 @@ + + + + + +Splitter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.je.util
      +

      Class Splitter

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.je.util.Splitter
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class Splitter
        +extends java.lang.Object
        +
        Splitter is used to split a string based on a delimiter. + Support includes double quoted strings, and the escape character. + Raw tokens are returned that include the double quotes, white space, + and escape characters.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          Splitter(char delimiter) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.String[]tokenize(java.lang.String inrow) 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Splitter

            +
            public Splitter(char delimiter)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            tokenize

            +
            public java.lang.String[] tokenize(java.lang.String inrow)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/ConsoleHandler.html b/docs/java/com/sleepycat/je/util/class-use/ConsoleHandler.html new file mode 100644 index 0000000..5f2e0f7 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/ConsoleHandler.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.ConsoleHandler (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.ConsoleHandler

      +
      +
      No usage of com.sleepycat.je.util.ConsoleHandler
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbBackup.html b/docs/java/com/sleepycat/je/util/class-use/DbBackup.html new file mode 100644 index 0000000..a0dcb33 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbBackup.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbBackup (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbBackup

      +
      +
      No usage of com.sleepycat.je.util.DbBackup
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbCacheSize.html b/docs/java/com/sleepycat/je/util/class-use/DbCacheSize.html new file mode 100644 index 0000000..c33f5e8 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbCacheSize.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbCacheSize (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbCacheSize

      +
      +
      No usage of com.sleepycat.je.util.DbCacheSize
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbDeleteReservedFiles.html b/docs/java/com/sleepycat/je/util/class-use/DbDeleteReservedFiles.html new file mode 100644 index 0000000..74c48f8 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbDeleteReservedFiles.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbDeleteReservedFiles (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbDeleteReservedFiles

      +
      +
      No usage of com.sleepycat.je.util.DbDeleteReservedFiles
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbDump.html b/docs/java/com/sleepycat/je/util/class-use/DbDump.html new file mode 100644 index 0000000..e75f98d --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbDump.html @@ -0,0 +1,173 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbDump (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbDump

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbFilterStats.html b/docs/java/com/sleepycat/je/util/class-use/DbFilterStats.html new file mode 100644 index 0000000..f94cb48 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbFilterStats.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbFilterStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbFilterStats

      +
      +
      No usage of com.sleepycat.je.util.DbFilterStats
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbLoad.html b/docs/java/com/sleepycat/je/util/class-use/DbLoad.html new file mode 100644 index 0000000..4bde792 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbLoad.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbLoad (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbLoad

      +
      +
      No usage of com.sleepycat.je.util.DbLoad
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbPrintLog.html b/docs/java/com/sleepycat/je/util/class-use/DbPrintLog.html new file mode 100644 index 0000000..ceb9345 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbPrintLog.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbPrintLog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbPrintLog

      +
      +
      No usage of com.sleepycat.je.util.DbPrintLog
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbScavenger.html b/docs/java/com/sleepycat/je/util/class-use/DbScavenger.html new file mode 100644 index 0000000..f6c2716 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbScavenger.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbScavenger (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbScavenger

      +
      +
      No usage of com.sleepycat.je.util.DbScavenger
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbSpace.html b/docs/java/com/sleepycat/je/util/class-use/DbSpace.html new file mode 100644 index 0000000..4376bae --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbSpace.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbSpace (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbSpace

      +
      +
      No usage of com.sleepycat.je.util.DbSpace
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbStat.html b/docs/java/com/sleepycat/je/util/class-use/DbStat.html new file mode 100644 index 0000000..4030684 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbStat.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbStat (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbStat

      +
      +
      No usage of com.sleepycat.je.util.DbStat
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbTruncateLog.html b/docs/java/com/sleepycat/je/util/class-use/DbTruncateLog.html new file mode 100644 index 0000000..95b1018 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbTruncateLog.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbTruncateLog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbTruncateLog

      +
      +
      No usage of com.sleepycat.je.util.DbTruncateLog
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbVerify.html b/docs/java/com/sleepycat/je/util/class-use/DbVerify.html new file mode 100644 index 0000000..f9a1a67 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbVerify.html @@ -0,0 +1,171 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbVerify (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbVerify

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/DbVerifyLog.html b/docs/java/com/sleepycat/je/util/class-use/DbVerifyLog.html new file mode 100644 index 0000000..be6a0bf --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/DbVerifyLog.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.DbVerifyLog (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.DbVerifyLog

      +
      +
      No usage of com.sleepycat.je.util.DbVerifyLog
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/FileHandler.html b/docs/java/com/sleepycat/je/util/class-use/FileHandler.html new file mode 100644 index 0000000..d5e05bf --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/FileHandler.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.FileHandler (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.FileHandler

      +
      +
      No usage of com.sleepycat.je.util.FileHandler
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/LogVerificationException.html b/docs/java/com/sleepycat/je/util/class-use/LogVerificationException.html new file mode 100644 index 0000000..14639de --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/LogVerificationException.html @@ -0,0 +1,180 @@ + + + + + +Uses of Class com.sleepycat.je.util.LogVerificationException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.LogVerificationException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/LogVerificationInputStream.html b/docs/java/com/sleepycat/je/util/class-use/LogVerificationInputStream.html new file mode 100644 index 0000000..5def7bc --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/LogVerificationInputStream.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.LogVerificationInputStream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.LogVerificationInputStream

      +
      +
      No usage of com.sleepycat.je.util.LogVerificationInputStream
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/LogVerificationReadableByteChannel.html b/docs/java/com/sleepycat/je/util/class-use/LogVerificationReadableByteChannel.html new file mode 100644 index 0000000..8eb88a2 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/LogVerificationReadableByteChannel.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.LogVerificationReadableByteChannel (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.LogVerificationReadableByteChannel

      +
      +
      No usage of com.sleepycat.je.util.LogVerificationReadableByteChannel
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/class-use/Splitter.html b/docs/java/com/sleepycat/je/util/class-use/Splitter.html new file mode 100644 index 0000000..a821173 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/class-use/Splitter.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.je.util.Splitter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.je.util.Splitter

      +
      +
      No usage of com.sleepycat.je.util.Splitter
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/package-frame.html b/docs/java/com/sleepycat/je/util/package-frame.html new file mode 100644 index 0000000..6a404f5 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/package-frame.html @@ -0,0 +1,41 @@ + + + + + +com.sleepycat.je.util (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.je.util

      + + + diff --git a/docs/java/com/sleepycat/je/util/package-summary.html b/docs/java/com/sleepycat/je/util/package-summary.html new file mode 100644 index 0000000..c341793 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/package-summary.html @@ -0,0 +1,294 @@ + + + + + +com.sleepycat.je.util (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.je.util

      +
      +
      Supporting utilities.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        ConsoleHandler +
        JE instances of java.util.logging.Logger are configured to use this + implementation of java.util.logging.ConsoleHandler.
        +
        DbBackup +
        DbBackup is a helper class for stopping and restarting JE background + activity in an open environment in order to simplify backup operations.
        +
        DbCacheSize +
        Estimates the in-memory cache size needed to hold a specified data set.
        +
        DbDeleteReservedFiles +
        Command line utility used to delete reserved files explicitly, when + attempting to recover from a disk-full condition.
        +
        DbDump +
        Dump the contents of a database.
        +
        DbFilterStats +
        Transform one or more je.stat.csv statistics files and + write the output to stdout.
        +
        DbLoad +
        Loads a database from a dump file generated by DbDump.
        +
        DbPrintLog +
        Dumps the contents of the log in XML format to System.out.
        +
        DbScavenger +
        Used to retrieve as much data as possible from a corrupted environment.
        +
        DbSpace +
        DbSpace displays the disk space utilization for an environment.
        +
        DbStat 
        DbTruncateLog +
        DbTruncateLog is a utility that lets the user truncate JE log starting at a + specified file and offset to the last log file, inclusive.
        +
        DbVerify +
        Verifies the internal structures of a database.
        +
        DbVerifyLog +
        Verifies the checksums in one or more log files.
        +
        FileHandler +
        JE instances of java.util.logging.Logger are configured to use this + implementation of java.util.logging.FileHandler.
        +
        LogVerificationInputStream +
        Verifies the checksums in an InputStream for a log file in a JE + Environment.
        +
        LogVerificationReadableByteChannel +
        Verifies the checksums in a ReadableByteChannel for a log file in a + JE Environment.
        +
        Splitter +
        Splitter is used to split a string based on a delimiter.
        +
        +
      • +
      • + + + + + + + + + + + + +
        Exception Summary 
        ExceptionDescription
        LogVerificationException +
        Thrown during log verification if a checksum cannot be verified or a log + entry is determined to be invalid by examining its contents.
        +
        +
      • +
      + + + +

      Package com.sleepycat.je.util Description

      +
      Supporting utilities. + +

      Package Specification

      +This package provides support for activities like +loading and dumping data. Most utilities can be used as a command line +tool or called programmatically.
      +
      +
      See Also:
      +
      [Getting Started Guide]
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/package-tree.html b/docs/java/com/sleepycat/je/util/package-tree.html new file mode 100644 index 0000000..22526d2 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/package-tree.html @@ -0,0 +1,198 @@ + + + + + +com.sleepycat.je.util Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.je.util

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/je/util/package-use.html b/docs/java/com/sleepycat/je/util/package-use.html new file mode 100644 index 0000000..dbd0604 --- /dev/null +++ b/docs/java/com/sleepycat/je/util/package-use.html @@ -0,0 +1,177 @@ + + + + + +Uses of Package com.sleepycat.je.util (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.je.util

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/EntityCursor.html b/docs/java/com/sleepycat/persist/EntityCursor.html new file mode 100644 index 0000000..87bf578 --- /dev/null +++ b/docs/java/com/sleepycat/persist/EntityCursor.html @@ -0,0 +1,1666 @@ + + + + + +EntityCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Interface EntityCursor<V>

      +
      +
      +
      +
        +
      • +
        +
        All Superinterfaces:
        +
        java.lang.AutoCloseable, java.io.Closeable, ForwardCursor<V>, java.lang.Iterable<V>
        +
        +
        +
        +
        public interface EntityCursor<V>
        +extends ForwardCursor<V>
        +
        Traverses entity values or key values and allows deleting or updating the + entity at the current cursor position. The value type (V) is either an + entity class or a key class, depending on how the cursor was opened. + +

        EntityCursor objects are not thread-safe. Cursors + should be opened, used and closed by a single thread.

        + +

        Cursors are opened using the EntityIndex.keys() and EntityIndex.entities() family of methods. These methods are available for + objects of any class that implements EntityIndex: PrimaryIndex, SecondaryIndex, and the indices returned by SecondaryIndex.keysIndex and SecondaryIndex.subIndex(SK). A ForwardCursor, which implements a subset of cursor operations, is also + available via the EntityJoin.keys() and EntityJoin.entities() + methods.

        + +

        Values are always returned by a cursor in key order, where the key is + defined by the underlying EntityIndex. For example, a cursor on a + SecondaryIndex returns values ordered by secondary key, while an + index on a PrimaryIndex or a SecondaryIndex.subIndex(SK) returns + values ordered by primary key.

        + +

        WARNING: Cursors must always be closed to prevent resource leaks + which could lead to the index becoming unusable or cause an + OutOfMemoryError. To ensure that a cursor is closed in the + face of exceptions, call close() in a finally block. For example, + the following code traverses all Employee entities and closes the cursor + whether or not an exception occurs:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + EntityStore store = ...
        +
        + PrimaryIndex<Long, Employee> primaryIndex =
        +     store.getPrimaryIndex(Long.class, Employee.class);
        +
        + EntityCursor<Employee> cursor = primaryIndex.entities();
        + try {
        +     for (Employee entity = cursor.first();
        +                   entity != null;
        +                   entity = cursor.next()) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        Initializing the Cursor Position

        + +

        When it is opened, a cursor is not initially positioned on any value; in + other words, it is uninitialized. Most methods in this interface initialize + the cursor position but certain methods, for example, current() and + delete(), throw IllegalStateException when called for an + uninitialized cursor.

        + +

        Note that the next() and prev() methods return the first or + last value respectively for an uninitialized cursor. This allows the loop + in the example above to be rewritten as follows:

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities();
        + try {
        +     Employee entity;
        +     while ((entity = cursor.next()) != null) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        Cursors and Iterators

        + +

        The iterator() method can be used to return a standard Java Iterator that returns the same values that the cursor returns. For + example:

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities();
        + try {
        +     Iterator<Employee> i = cursor.iterator();
        +     while (i.hasNext()) {
        +          Employee entity = i.next();
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        The Iterable interface is also extended by EntityCursor + to allow using the cursor as the target of a Java "foreach" statement:

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities();
        + try {
        +     for (Employee entity : cursor) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        The iterator uses the cursor directly, so any changes to the cursor + position impact the iterator and vice versa. The iterator advances the + cursor by calling next() when Iterator.hasNext() or Iterator.next() is called. Because of this interaction, to keep things + simple it is best not to mix the use of an EntityCursor + Iterator with the use of the EntityCursor traversal methods + such as next(), for a single EntityCursor object.

        + +

        Key Ranges

        + +

        A key range may be specified when opening the cursor, to restrict the + key range of the cursor to a subset of the complete range of keys in the + index. A fromKey and/or toKey parameter may be specified + when calling EntityIndex.keys(Object,boolean,Object,boolean) or + EntityIndex.entities(Object,boolean,Object,boolean). The key + arguments may be specified as inclusive or exclusive values.

        + +

        Whenever a cursor with a key range is moved, the key range bounds will be + checked, and the cursor will never be positioned outside the range. The + first() cursor value is the first existing value in the range, and + the last() cursor value is the last existing value in the range. For + example, the following code traverses Employee entities with keys from 100 + (inclusive) to 200 (exclusive):

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities(100, true, 200, false);
        + try {
        +     for (Employee entity : cursor) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        Duplicate Keys

        + +

        When using a cursor for a SecondaryIndex, the keys in the index + may be non-unique (duplicates) if SecondaryKey.relate() is MANY_TO_ONE or MANY_TO_MANY. For example, a MANY_TO_ONE Employee.department secondary key is non-unique because there are multiple + Employee entities with the same department key value. The nextDup(), + prevDup(), nextNoDup() and prevNoDup() methods may be + used to control how non-unique keys are returned by the cursor.

        + +

        nextDup() and prevDup() return the next or previous value + only if it has the same key as the current value, and null is returned when + a different key is encountered. For example, these methods can be used to + return all employees in a given department.

        + +

        nextNoDup() and prevNoDup() return the next or previous + value with a unique key, skipping over values that have the same key. For + example, these methods can be used to return the first employee in each + department.

        + +

        For example, the following code will find the first employee in each + department with nextNoDup() until it finds a department name that + matches a particular regular expression. For each matching department it + will find all employees in that department using nextDup().

        + +
        + SecondaryIndex<String, Long, Employee> secondaryIndex =
        +     store.getSecondaryIndex(primaryIndex, String.class, "department");
        +
        + String regex = ...;
        + EntityCursor<Employee> cursor = secondaryIndex.entities();
        + try {
        +     for (Employee entity = cursor.first();
        +                   entity != null;
        +                   entity = cursor.nextNoDup()) {
        +         if (entity.department.matches(regex)) {
        +             while (entity != null) {
        +                 // Do something with the matching entities...
        +                 entity = cursor.nextDup();
        +             }
        +         }
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        Updating and Deleting Entities with a Cursor

        + +

        The update(V) and delete() methods operate on the entity at + the current cursor position. Cursors on any type of index may be used to + delete entities. For example, the following code deletes all employees in + departments which have names that match a particular regular expression:

        + +
        + SecondaryIndex<String, Long, Employee> secondaryIndex =
        +     store.getSecondaryIndex(primaryIndex, String.class, "department");
        +
        + String regex = ...;
        + EntityCursor<Employee> cursor = secondaryIndex.entities();
        + try {
        +     for (Employee entity = cursor.first();
        +                   entity != null;
        +                   entity = cursor.nextNoDup()) {
        +         if (entity.department.matches(regex)) {
        +             while (entity != null) {
        +                 cursor.delete();
        +                 entity = cursor.nextDup();
        +             }
        +         }
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        Note that the cursor can be moved to the next (or previous) value after + deleting the entity at the current position. This is an important property + of cursors, since without it you would not be able to easily delete while + processing multiple values with a cursor. A cursor positioned on a deleted + entity is in a special state. In this state, current() will return + null, delete() will return false, and update(V) will return + false.

        + +

        The update(V) method is supported only if the value type is an + entity class (not a key class) and the underlying index is a PrimaryIndex; in other words, for a cursor returned by one of the BasicIndex.entities() methods. For example, the following code changes all + employee names to uppercase:

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities();
        + try {
        +     for (Employee entity = cursor.first();
        +                   entity != null;
        +                   entity = cursor.next()) {
        +         entity.name = entity.name.toUpperCase();
        +         cursor.update(entity);
        +     }
        + } finally {
        +     cursor.close();
        + }
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          voidclose() +
          Closes the cursor.
          +
          intcount() +
          Returns the number of values (duplicates) for the key at the cursor + position, or returns zero if all values for the key have been deleted.
          +
          longcountEstimate() +
          Returns a rough estimate of the number of values (duplicates) for the + key at the cursor position, or returns zero if all values for the key + have been deleted.
          +
          Vcurrent() +
          Returns the value at the cursor position, or null if the value at the + cursor position has been deleted.
          +
          Vcurrent(LockMode lockMode) +
          Returns the value at the cursor position, or null if the value at the + cursor position has been deleted.
          +
          booleandelete() +
          Deletes the entity at the cursor position.
          +
          OperationResultdelete(WriteOptions options) +
          Deletes the entity at the cursor position, using a WriteOptions + parameter and returning an OperationResult.
          +
          EntityCursor<V>dup() +
          Duplicates the cursor at the cursor position.
          +
          Vfirst() +
          Moves the cursor to the first value and returns it, or returns null if + the cursor range is empty.
          +
          Vfirst(LockMode lockMode) +
          Moves the cursor to the first value and returns it, or returns null if + the cursor range is empty.
          +
          EntityResult<V>get(Get getType, + ReadOptions options) +
          Moves the cursor according to the specified Get type and returns + the value at the updated position.
          +
          CacheModegetCacheMode() +
          Returns the default CacheMode used for subsequent operations + performed using this cursor.
          +
          java.util.Iterator<V>iterator() +
          Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
          +
          java.util.Iterator<V>iterator(LockMode lockMode) +
          Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
          +
          Vlast() +
          Moves the cursor to the last value and returns it, or returns null if + the cursor range is empty.
          +
          Vlast(LockMode lockMode) +
          Moves the cursor to the last value and returns it, or returns null if + the cursor range is empty.
          +
          Vnext() +
          Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
          +
          Vnext(LockMode lockMode) +
          Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
          +
          VnextDup() +
          Moves the cursor to the next value with the same key (duplicate) and + returns it, or returns null if no more values are present for the key at + the current position.
          +
          VnextDup(LockMode lockMode) +
          Moves the cursor to the next value with the same key (duplicate) and + returns it, or returns null if no more values are present for the key at + the current position.
          +
          VnextNoDup() +
          Moves the cursor to the next value with a different key and returns it, + or returns null if there are no more unique keys in the cursor range.
          +
          VnextNoDup(LockMode lockMode) +
          Moves the cursor to the next value with a different key and returns it, + or returns null if there are no more unique keys in the cursor range.
          +
          Vprev() +
          Moves the cursor to the previous value and returns it, or returns null + if there are no preceding values in the cursor range.
          +
          Vprev(LockMode lockMode) +
          Moves the cursor to the previous value and returns it, or returns null + if there are no preceding values in the cursor range.
          +
          VprevDup() +
          Moves the cursor to the previous value with the same key (duplicate) and + returns it, or returns null if no preceding values are present for the + key at the current position.
          +
          VprevDup(LockMode lockMode) +
          Moves the cursor to the previous value with the same key (duplicate) and + returns it, or returns null if no preceding values are present for the + key at the current position.
          +
          VprevNoDup() +
          Moves the cursor to the preceding value with a different key and returns + it, or returns null if there are no preceding unique keys in the cursor + range.
          +
          VprevNoDup(LockMode lockMode) +
          Moves the cursor to the preceding value with a different key and returns + it, or returns null if there are no preceding unique keys in the cursor + range.
          +
          voidsetCacheMode(CacheMode cacheMode) +
          Changes the CacheMode default used for subsequent operations + performed using this cursor.
          +
          booleanupdate(V entity) +
          Replaces the entity at the cursor position with the given entity.
          +
          OperationResultupdate(V entity, + WriteOptions options) +
          Replaces the entity at the cursor position with the given entity, + using a WriteOptions parameter and returning an OperationResult.
          +
          +
            +
          • + + +

            Methods inherited from interface java.lang.Iterable

            +forEach, spliterator
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
          • +

            nextDup

            +
            V nextDup()
            +   throws DatabaseException
            +
            Moves the cursor to the next value with the same key (duplicate) and + returns it, or returns null if no more values are present for the key at + the current position. + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Returns:
            +
            the next value with the same key, or null if no more values are + present for the key at the current position.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized. + +
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            nextDup

            +
            V nextDup(LockMode lockMode)
            +   throws DatabaseException
            +
            Moves the cursor to the next value with the same key (duplicate) and + returns it, or returns null if no more values are present for the key at + the current position.
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the next value with the same key, or null if no more values are + present for the key at the current position.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized. + +
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            nextNoDup

            +
            V nextNoDup()
            +     throws DatabaseException
            +
            Moves the cursor to the next value with a different key and returns it, + or returns null if there are no more unique keys in the cursor range. + If the cursor is uninitialized, this method is equivalent to first(). + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Returns:
            +
            the next value with a different key, or null if there are no + more unique keys in the cursor range. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            nextNoDup

            +
            V nextNoDup(LockMode lockMode)
            +     throws DatabaseException
            +
            Moves the cursor to the next value with a different key and returns it, + or returns null if there are no more unique keys in the cursor range. + If the cursor is uninitialized, this method is equivalent to first().
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the next value with a different key, or null if there are no + more unique keys in the cursor range. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            prev

            +
            V prev(LockMode lockMode)
            +throws DatabaseException
            +
            Moves the cursor to the previous value and returns it, or returns null + if there are no preceding values in the cursor range. If the cursor is + uninitialized, this method is equivalent to last().
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the previous value, or null if there are no preceding values in + the cursor range. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            prevDup

            +
            V prevDup()
            +   throws DatabaseException
            +
            Moves the cursor to the previous value with the same key (duplicate) and + returns it, or returns null if no preceding values are present for the + key at the current position. + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Returns:
            +
            the previous value with the same key, or null if no preceding + values are present for the key at the current position.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized. + +
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            prevDup

            +
            V prevDup(LockMode lockMode)
            +   throws DatabaseException
            +
            Moves the cursor to the previous value with the same key (duplicate) and + returns it, or returns null if no preceding values are present for the + key at the current position.
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the previous value with the same key, or null if no preceding + values are present for the key at the current position.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized. + +
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            prevNoDup

            +
            V prevNoDup()
            +     throws DatabaseException
            +
            Moves the cursor to the preceding value with a different key and returns + it, or returns null if there are no preceding unique keys in the cursor + range. If the cursor is uninitialized, this method is equivalent to + last(). + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Returns:
            +
            the previous value with a different key, or null if there are no + preceding unique keys in the cursor range. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            prevNoDup

            +
            V prevNoDup(LockMode lockMode)
            +     throws DatabaseException
            +
            Moves the cursor to the preceding value with a different key and returns + it, or returns null if there are no preceding unique keys in the cursor + range. If the cursor is uninitialized, this method is equivalent to + last().
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the previous value with a different key, or null if there are no + preceding unique keys in the cursor range. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            current

            +
            V current(LockMode lockMode)
            +   throws DatabaseException
            +
            Returns the value at the cursor position, or null if the value at the + cursor position has been deleted.
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the value at the cursor position, or null if it has been + deleted.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized. + +
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            get

            +
            EntityResult<V> get(Get getType,
            +                    ReadOptions options)
            +             throws DatabaseException
            +
            Moves the cursor according to the specified Get type and returns + the value at the updated position. + +

            The following table lists each allowed operation. Also specified is + whether the cursor must be initialized (positioned on a value) before + calling this method. See the individual Get operations for more + information.

            + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Get operationDescriptionCursor position
            must be initialized?
            Get.CURRENTAccesses the current value.yes
            Get.FIRSTFinds the first value in the cursor range.no
            Get.LASTFinds the last value in the cursor range.no
            Get.NEXTMoves to the next value.no**
            Get.NEXT_DUPMoves to the next value with the same key.yes
            Get.NEXT_NO_DUPMoves to the next value with a different key.no**
            Get.PREVMoves to the previous value.no**
            Get.PREV_DUPMoves to the previous value with the same key.yes
            Get.PREV_NO_DUPMoves to the previous value with a different key.no**
            + +

            ** - For these 'next' and 'previous' operations the cursor may be + uninitialized, in which case the cursor will be moved to the first or + last value in the cursor range, respectively.

            +
            +
            Parameters:
            +
            getType - the Get operation type. Must be one of the values listed + above.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the EntityResult, including the value at the new cursor + position, or null if the requested value is not present in the cursor + range.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            int count()
            +   throws DatabaseException
            +
            Returns the number of values (duplicates) for the key at the cursor + position, or returns zero if all values for the key have been deleted. + Returns one or zero if the underlying index has unique keys. + + +

            The cost of this method is directly proportional to the number of + values.

            + + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Returns:
            +
            the number of duplicates, or zero if all values for the current + key have been deleted.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized. + +
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            countEstimate

            +
            long countEstimate()
            +            throws DatabaseException
            +
            Returns a rough estimate of the number of values (duplicates) for the + key at the cursor position, or returns zero if all values for the key + have been deleted. Returns one or zero if the underlying index has + unique keys. + +

            If the underlying index has non-unique keys, a quick estimate of the + number of values is computed using information in the Btree. Because + the Btree is unbalanced, in some cases the estimate may be off by a + factor of two or more. The estimate is accurate when the number of + records is less than the configured NodeMaxEntries.

            + +

            The cost of this method is fixed, rather than being proportional to + the number of values. Because its accuracy is variable, this method + should normally be used when accuracy is not required, such as for query + optimization, and a fixed cost operation is needed. For example, this + method is used internally for determining the index processing order in + an EntityJoin.

            +
            +
            Returns:
            +
            an estimate of the count of the number of data items for the key + to which the cursor refers.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            iterator

            +
            java.util.Iterator<V> iterator()
            +
            Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized. + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Specified by:
            +
            iterator in interface ForwardCursor<V>
            +
            Specified by:
            +
            iterator in interface java.lang.Iterable<V>
            +
            Returns:
            +
            the iterator.
            +
            +
          • +
          + + + +
            +
          • +

            iterator

            +
            java.util.Iterator<V> iterator(LockMode lockMode)
            +
            Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
            +
            +
            Specified by:
            +
            iterator in interface ForwardCursor<V>
            +
            Parameters:
            +
            lockMode - the lock mode to use for all operations performed + using the iterator, or null to use LockMode.DEFAULT.
            +
            Returns:
            +
            the iterator.
            +
            +
          • +
          + + + + + +
            +
          • +

            update

            +
            boolean update(V entity)
            +        throws DatabaseException
            +
            Replaces the entity at the cursor position with the given entity.
            +
            +
            Parameters:
            +
            entity - the entity to replace the entity at the current position.
            +
            Returns:
            +
            true if successful or false if the entity at the current + position was previously deleted.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized.
            +
            java.lang.UnsupportedOperationException - if the index is read only or if + the value type is not an entity type. + +
            +
            DuplicateDataException - if the old and new data are not equal + according to the configured duplicate comparator or default comparator.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            update

            +
            OperationResult update(V entity,
            +                       WriteOptions options)
            +                throws DatabaseException
            +
            Replaces the entity at the cursor position with the given entity, + using a WriteOptions parameter and returning an OperationResult.
            +
            +
            Parameters:
            +
            entity - the entity to replace the entity at the current position.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if successful or null if the entity at the + current position was previously deleted.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized.
            +
            java.lang.UnsupportedOperationException - if the index is read only or if + the value type is not an entity type.
            +
            DuplicateDataException - if the old and new data are not equal + according to the configured duplicate comparator or default comparator.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            delete

            +
            boolean delete()
            +        throws DatabaseException
            +
            Deletes the entity at the cursor position.
            +
            +
            Returns:
            +
            true if successful or false if the entity at the current + position has been deleted. + +
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized.
            +
            java.lang.UnsupportedOperationException - if the index is read only.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            delete

            +
            OperationResult delete(WriteOptions options)
            +                throws DatabaseException
            +
            Deletes the entity at the cursor position, using a WriteOptions + parameter and returning an OperationResult.
            +
            +
            Returns:
            +
            the OperationResult if successful or null if the entity at the + current position was previously deleted.
            +
            Throws:
            +
            java.lang.IllegalStateException - if the cursor is uninitialized.
            +
            java.lang.UnsupportedOperationException - if the index is read only.
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            dup

            +
            EntityCursor<V> dup()
            +             throws DatabaseException
            +
            Duplicates the cursor at the cursor position. The returned cursor will + be initially positioned at the same position as this current cursor, and + will inherit this cursor's Transaction and CursorConfig.
            +
            +
            Returns:
            +
            the duplicated cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            void close()
            +    throws DatabaseException
            +
            Closes the cursor.
            +
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface ForwardCursor<V>
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            setCacheMode

            +
            void setCacheMode(CacheMode cacheMode)
            +
            Changes the CacheMode default used for subsequent operations + performed using this cursor. For a newly opened cursor, the default is + CacheMode.DEFAULT. Note that the default is always overridden by + a non-null cache mode that is specified via ReadOptions or + WriteOptions.
            +
            +
            Parameters:
            +
            cacheMode - is the default CacheMode used for subsequent + operations using this cursor, or null to configure the Database or + Environment default.
            +
            See Also:
            +
            CacheMode
            +
            +
          • +
          + + + +
            +
          • +

            getCacheMode

            +
            CacheMode getCacheMode()
            +
            Returns the default CacheMode used for subsequent operations + performed using this cursor. If setCacheMode(com.sleepycat.je.CacheMode) has not been + called with a non-null value, the configured Database or Environment + default is returned.
            +
            +
            Returns:
            +
            the CacheMode default used for subsequent operations + using this cursor.
            +
            See Also:
            +
            CacheMode
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/EntityIndex.html b/docs/java/com/sleepycat/persist/EntityIndex.html new file mode 100644 index 0000000..2d0c513 --- /dev/null +++ b/docs/java/com/sleepycat/persist/EntityIndex.html @@ -0,0 +1,1653 @@ + + + + + +EntityIndex (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Interface EntityIndex<K,V>

      +
      +
      +
      +
        +
      • +
        +
        All Known Implementing Classes:
        +
        PrimaryIndex, SecondaryIndex
        +
        +
        +
        +
        public interface EntityIndex<K,V>
        +
        The interface for accessing keys and entities via a primary or secondary + index. + +

        EntityIndex objects are thread-safe. Multiple threads may safely + call the methods of a shared EntityIndex object.

        + +

        An index is conceptually a map. {key:value} mappings are + stored in the index and accessed by key. In fact, for interoperability with + other libraries that use the standard Java Map or SortedMap + interfaces, an EntityIndex may be accessed via these standard + interfaces by calling the map() or sortedMap() methods.

        + +

        EntityIndex is an interface that is implemented by several + classes in this package for different purposes. Depending on the context, + the key type (K) and value type (V) of the index take on different meanings. + The different classes that implement EntityIndex are:

        + + +

        In all cases, the index key type (K) is a primary or secondary key class. + The index value type (V) is an entity class in all cases except for a SecondaryIndex.keysIndex, when it is a primary key class.

        + +

        In the following example, a Employee entity with a MANY_TO_ONE secondary key is defined.

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        + +

        Consider that we have stored the entities below:

        + +
        + + + + + + +
        Entities
        IDDepartmentName
        1EngineeringJane Smith
        2SalesJoan Smith
        3EngineeringJohn Smith
        4SalesJim Smith
        + +

        PrimaryIndex maps primary keys to entities:

        + +
        + PrimaryIndex<Long, Employee> primaryIndex =
        +     store.getPrimaryIndex(Long.class, Employee.class);
        + +
        + + + + + + +
        primaryIndex
        Primary KeyEntity
        11EngineeringJane Smith
        22SalesJoan Smith
        33EngineeringJohn Smith
        44SalesJim Smith
        + +

        SecondaryIndex maps secondary keys to entities:

        + +
        + SecondaryIndex<String, Long, Employee> secondaryIndex =
        +     store.getSecondaryIndex(primaryIndex, String.class, "department");
        + +
        + + + + + + +
        secondaryIndex
        Secondary KeyEntity
        Engineering1EngineeringJane Smith
        Engineering3EngineeringJohn Smith
        Sales2SalesJoan Smith
        Sales4SalesJim Smith
        + +

        SecondaryIndex.keysIndex maps secondary keys to primary + keys:

        + +
        + EntityIndex<String, Long> keysIndex = secondaryIndex.keysIndex();
        + +
        + + + + + + +
        keysIndex
        Secondary KeyPrimary Key
        Engineering1
        Engineering3
        Sales2
        Sales4
        + +

        SecondaryIndex.subIndex(SK) maps primary keys to entities, for the + subset of entities having a specified secondary key:

        + +
        + EntityIndex<Long, Entity> subIndex = secondaryIndex.subIndex("Engineering");
        + +
        + + + + +
        subIndex
        Primary KeyEntity
        11EngineeringJane Smith
        33EngineeringJohn Smith
        + +

        Accessing the Index

        + +

        An EntityIndex provides a variety of methods for retrieving + entities from an index. It also provides methods for deleting entities. + However, it does not provide methods for inserting and updating. To insert + and update entities, use the PrimaryIndex.put(E) family of methods in + the PrimaryIndex class.

        + +

        An EntityIndex supports two mechanisms for retrieving + entities:

        +
          +
        1. The get(K) method returns a single value for a given key. If there + are multiple values with the same secondary key (duplicates), it returns the + first entity in the duplicate set.
        2. +
        3. An EntityCursor can be obtained using the keys() and + entities() family of methods. A cursor can be used to return all + values in the index, including duplicates. A cursor can also be used to + return values within a specified range of keys.
        4. +
        + +

        Using the example entities above, calling get(K) on the primary + index will always return the employee with the given ID, or null if no such + ID exists. But calling get(K) on the secondary index will retrieve + the first employee in the given department, which may not be very + useful:

        + +
        + Employee emp = primaryIndex.get(1);      // Returns by unique ID
        + emp = secondaryIndex.get("Engineering"); // Returns first in department
        + +

        Using a cursor, you can iterate through all duplicates in the secondary + index:

        + +
        + EntityCursor<Employee> cursor = secondaryIndex.entities();
        + try {
        +     for (Employee entity : cursor) {
        +         if (entity.department.equals("Engineering")) {
        +             // Do something with the entity...
        +         }
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        But for a large database it is much more efficient to iterate over only + those entities with the secondary key you're searching for. This could be + done by restricting a cursor to a range of keys:

        + +
        + EntityCursor<Employee> cursor =
        +     secondaryIndex.entities("Engineering", true, "Engineering", true);
        + try {
        +     for (Employee entity : cursor) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        However, when you are interested only in the entities with a particular + secondary key value, it is more convenient to use a sub-index:

        + +
        + EntityIndex<Long, Entity> subIndex = secondaryIndex.subIndex("Engineering");
        + EntityCursor<Employee> cursor = subIndex.entities();
        + try {
        +     for (Employee entity : cursor) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        In addition to being more convenient than a cursor range, a sub-index + allows retrieving by primary key:

        + +
        + Employee emp = subIndex.get(1);
        + +

        When using a sub-index, all operations performed on the sub-index are + restricted to the single key that was specified when the sub-index was + created. For example, the following returns null because employee 2 is not + in the Engineering department and therefore is not part of the + sub-index:

        + +
        + Employee emp = subIndex.get(2);
        + +

        For more information on using cursors and cursor ranges, see EntityCursor.

        + +

        Note that when using an index, keys and values are stored and retrieved + by value not by reference. In other words, if an entity object is stored + and then retrieved, or retrieved twice, each object will be a separate + instance. For example, in the code below the assertion will always + fail.

        +
        + MyKey key = ...;
        + MyEntity entity1 = index.get(key);
        + MyEntity entity2 = index.get(key);
        + assert entity1 == entity2; // always fails!
        + 
        + +

        Deleting from the Index

        + +

        Any type of index may be used to delete entities with a specified key by + calling delete(K). The important thing to keep in mind is that + all entities with the specified key are deleted. In a primary index, + at most a single entity is deleted:

        + +
        + primaryIndex.delete(1); // Deletes a single employee by unique ID
        + +

        But in a secondary index, multiple entities may be deleted:

        + +
        + secondaryIndex.delete("Engineering"); // Deletes all Engineering employees
        + +

        This begs this question: How can a single entity be deleted without + knowing its primary key? The answer is to use cursors. After locating an + entity using a cursor, the entity can be deleted by calling EntityCursor.delete().

        + +

        Transactions

        + +

        Transactions can be used to provide standard ACID (Atomicity, + Consistency, Integrity and Durability) guarantees when retrieving, storing + and deleting entities. This section provides a brief overview of how to use + transactions with the Direct Persistence Layer. For more information on + using transactions, see Writing + Transactional Applications.

        + +

        Transactions may be used only with a transactional EntityStore, + which is one for which StoreConfig.setTransactional(true) has been called. Likewise, a + transactional store may only be used with a transactional Environment, which is one for which EnvironmentConfig.setTransactional(true) + has been called. For example:

        + +
        + EnvironmentConfig envConfig = new EnvironmentConfig();
        + envConfig.setTransactional(true);
        + envConfig.setAllowCreate(true);
        + Environment env = new Environment(new File("/my/data"), envConfig);
        +
        + StoreConfig storeConfig = new StoreConfig();
        + storeConfig.setTransactional(true);
        + storeConfig.setAllowCreate(true);
        + EntityStore store = new EntityStore(env, "myStore", storeConfig);
        + +

        Transactions are represented by Transaction objects, which are + part of the Base API. Transactions are created + using the Environment.beginTransaction + method.

        + +

        A transaction will include all operations for which the transaction + object is passed as a method argument. All retrieval, storage and deletion + methods have an optional Transaction parameter for this purpose. + When a transaction is passed to a method that opens a cursor, all retrieval, + storage and deletion operations performed using that cursor will be included + in the transaction.

        + +

        A transaction may be committed by calling Transaction.commit() or + aborted by calling Transaction.abort(). For example, two employees + may be deleted atomically with a transaction; other words, either both are + deleted or neither is deleted:

        + +
        + Transaction txn = env.beginTransaction(null, null);
        + try {
        +     primaryIndex.delete(txn, 1);
        +     primaryIndex.delete(txn, 2);
        +     txn.commit();
        +     txn = null;
        + } finally {
        +     if (txn != null) {
        +         txn.abort();
        +     }
        + }
        + +

        WARNING: Transactions must always be committed or aborted to + prevent resource leaks which could lead to the index becoming unusable or + cause an OutOfMemoryError. To ensure that a transaction is + aborted in the face of exceptions, call Transaction.abort() in a + finally block.

        + +

        For a transactional store, storage and deletion operations are always + transaction protected, whether or not a transaction is explicitly used. A + null transaction argument means to perform the operation using auto-commit, + or the implied thread transaction if an XAEnvironment is being used. A + transaction is automatically started as part of the operation and is + automatically committed if the operation completes successfully. The + transaction is automatically aborted if an exception occurs during the + operation, and the exception is re-thrown to the caller. For example, each + employee is deleted using a an auto-commit transaction below, but it is + possible that employee 1 will be deleted and employee 2 will not be deleted, + if an error or crash occurs while deleting employee 2:

        + +
        + primaryIndex.delete(null, 1);
        + primaryIndex.delete(null, 2);
        + +

        When retrieving entities, a null transaction argument means to perform + the operation non-transactionally. The operation is performed outside the + scope of any transaction, without providing transactional ACID guarantees. + If an implied thread transaction is present (i.e. if an XAEnvironment is + being used), that transaction is used. When a non-transactional store is + used, transactional ACID guarantees are also not provided.

        + +

        For non-transactional and auto-commit usage, overloaded signatures for + retrieval, storage and deletion methods are provided to avoid having to pass + a null transaction argument. For example, delete(K) may be called + instead of delete(Transaction,Object). For example, the following + code is equivalent to the code above where null was passed for the + transaction:

        + +
        + primaryIndex.delete(1);
        + primaryIndex.delete(2);
        + +

        For retrieval methods the overloaded signatures also include an optional + LockMode parameter, and overloaded signatures for opening cursors + include an optional CursorConfig parameter. These parameters are + described further below in the Locking and Lock Modes section.

        + +

        Transactions and Cursors

        + +

        There are two special consideration when using cursors with transactions. + First, for a transactional store, a non-null transaction must be passed to + methods that open a cursor if that cursor will be used to delete or update + entities. Cursors do not perform auto-commit when a null transaction is + explicitly passed or implied by the method signature. For example, the + following code will throw DatabaseException when the EntityCursor.delete() method is called:

        + +
        + // Does not work with a transactional store!
        + EntityCursor<Employee> cursor = primaryIndex.entities();
        + try {
        +     for (Employee entity : cursor) {
        +         cursor.delete(); // Will throw DatabaseException.
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        Instead, the entities(Transaction,CursorConfig) signature must + be used and a non-null transaction must be passed:

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities(txn, null);
        + try {
        +     for (Employee entity : cursor) {
        +         cursor.delete();
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        The second consideration is that error handling is more complex when + using both transactions and cursors, for the following reasons:

        +
          +
        1. When an exception occurs, the transaction should be aborted.
        2. +
        3. Cursors must be closed whether or not an exception occurs.
        4. +
        5. Cursors must be closed before committing or aborting the + transaction.
        6. +
        + +

        For example:

        + +
        + Transaction txn = env.beginTransaction(null, null);
        + EntityCursor<Employee> cursor = null;
        + try {
        +     cursor = primaryIndex.entities(txn, null);
        +     for (Employee entity : cursor) {
        +         cursor.delete();
        +     }
        +     cursor.close();
        +     cursor = null;
        +     txn.commit();
        +     txn = null;
        + } finally {
        +     if (cursor != null) {
        +         cursor.close();
        +     }
        +     if (txn != null) {
        +         txn.abort();
        +     }
        + }
        + +

        Locking and Lock Modes

        + +

        This section provides a brief overview of locking and describes how lock + modes are used with the Direct Persistence Layer. For more information on + locking, see Writing + Transactional Applications.

        + +

        When using transactions, locks are normally acquired on each entity that + is retrieved or stored. The locks are used to isolate one transaction from + another. Locks are normally released only when the transaction is committed + or aborted.

        + +

        When not using transactions, locks are also normally acquired on each + entity that is retrieved or stored. However, these locks are released when + the operation is complete. When using cursors, in order to provide + cursor stability locks are held until the cursor is moved to a + different entity or closed.

        + +

        This default locking behavior provides full transactional ACID guarantees + and cursor stability. However, application performance can sometimes be + improved by compromising these guarantees. As described in Writing + Transactional Applications, the LockMode and CursorConfig parameters are two of the mechanisms that can be used to make + compromises.

        + +

        For example, imagine that you need an approximate count of all entities + matching certain criterion, and it is acceptable for entities to be changed + by other threads or other transactions while performing this query. LockMode.READ_UNCOMMITTED can be used to perform the retrievals without + acquiring any locks. This reduces memory consumption, does less processing, + and improves concurrency.

        + +
        + EntityCursor<Employee> cursor = primaryIndex.entities(txn, null);
        + try {
        +     Employee entity;
        +     while ((entity = cursor.next(LockMode.READ_UNCOMMITTED)) != null) {
        +         // Examine the entity and accumulate totals...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        The LockMode parameter specifies locking behavior on a + per-operation basis. If null or LockMode.DEFAULT is specified, the + default lock mode is used.

        + +

        It is also possible to specify the default locking behavior for a cursor + using CursorConfig. The example below is equivalent to the example + above:

        + +
        + CursorConfig config = new CursorConfig();
        + config.setReadUncommitted(true);
        + EntityCursor<Employee> cursor = primaryIndex.entities(txn, config);
        + try {
        +     Employee entity;
        +     while ((entity = cursor.next()) != null) {
        +         // Examine the entity and accumulate totals...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + + +

        Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See Key Cursor Optimization with + READ_UNCOMMITTED

        + + +

        The use of other lock modes, cursor configuration, and transaction + configuration are discussed in Writing + Transactional Applications.

        + +

        Performing Transaction Retries

        + +

        Lock conflict handling is another important topic discussed in Writing + Transactional Applications. To go along with that material, here we + show a lock conflict handling loop in the context of the Direct Persistence + Layer. The example below shows deleting all entities in a primary index in + a single transaction. If a lock conflict occurs, the transaction is aborted + and the operation is retried.

        + + +

        This is a DPL version of the equivalent example code + for the base API.

        + +

        The following example code illustrates the recommended approach. Note + that the Environment.beginTransaction and Transaction.commit + calls are intentially inside the try block. When using JE-HA, this + will make it easy to add a catch for other exceptions that can be + resolved by retrying the transaction, such as consistency exceptions.

        + + +
        +  void doTransaction(final Environment env,
        +                     final PrimaryIndex<Long, Employee> primaryIndex,
        +                     final int maxTries)
        +      throws DatabaseException {
        +
        +      boolean success = false;
        +      long sleepMillis = 0;
        +      for (int i = 0; i < maxTries; i++) {
        +          // Sleep before retrying.
        +          if (sleepMillis != 0) {
        +              Thread.sleep(sleepMillis);
        +              sleepMillis = 0;
        +          }
        +          Transaction txn = null;
        +          try {
        +              txn = env.beginTransaction(null, null);
        +              final EntityCursor<Employee> cursor =
        +                  primaryIndex.entities(txn, null);
        +              try {
        +                  // INSERT APP-SPECIFIC CODE HERE:
        +                  // Perform read and write operations, for example:
        +                  for (Employee entity : cursor) {
        +                      cursor.delete();
        +                  }
        +              } finally {
        +                  cursor.close();
        +              }
        +              txn.commit();
        +              success = true;
        +              return;
        +          } catch (LockConflictException e) {
        +              sleepMillis = LOCK_CONFLICT_RETRY_SEC * 1000;
        +              continue;
        +          } finally {
        +              if (!success) {
        +                  if (txn != null) {
        +                      txn.abort();
        +                  }
        +              }
        +          }
        +      }
        +      // INSERT APP-SPECIFIC CODE HERE:
        +      // Transaction failed, despite retries.
        +      // Take some app-specific course of action.
        +  }
        + +

        Low Level Access

        + +

        Each Direct Persistence Layer index is associated with an underlying + Database or SecondaryDatabase defined in the Base API. At this level, an index is a Btree managed by + the Berkeley DB Java Edition transactional storage engine. Although you may + never need to work at the Base API level, keep in mind that some + types of performance tuning can be done by configuring the underlying + databases. See the EntityStore class for more information on + database and sequence configuration.

        + +

        If you wish to access an index using the Base API, you may call + the BasicIndex.getDatabase() or SecondaryIndex.getDatabase() + method to get the underlying database. To translate between entity or key + objects and DatabaseEntry objects at this level, use the bindings + returned by PrimaryIndex.getEntityBinding(), PrimaryIndex.getKeyBinding(), and SecondaryIndex.getKeyBinding().

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          booleancontains(K key) +
          Checks for existence of a key in this index.
          +
          booleancontains(Transaction txn, + K key, + LockMode lockMode) +
          Checks for existence of a key in this index.
          +
          longcount() +
          Returns a non-transactional count of the entities in this index.
          +
          longcount(long memoryLimit) +
          Returns a non-transactional count of the entities in this index.
          +
          booleandelete(K key) +
          Deletes all entities with a given index key.
          +
          booleandelete(Transaction txn, + K key) +
          Deletes all entities with a given index key.
          +
          OperationResultdelete(Transaction txn, + K key, + WriteOptions options) +
          Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
          +
          EntityCursor<V>entities() +
          Opens a cursor for traversing all entities in this index.
          +
          EntityCursor<V>entities(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
          Opens a cursor for traversing entities in a key range.
          +
          EntityCursor<V>entities(Transaction txn, + CursorConfig config) +
          Opens a cursor for traversing all entities in this index.
          +
          EntityCursor<V>entities(Transaction txn, + K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive, + CursorConfig config) +
          Opens a cursor for traversing entities in a key range.
          +
          Vget(K key) +
          Gets an entity via a key of this index.
          +
          EntityResult<V>get(Transaction txn, + K key, + Get getType, + ReadOptions options) +
          Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
          +
          Vget(Transaction txn, + K key, + LockMode lockMode) +
          Gets an entity via a key of this index.
          +
          DatabasegetDatabase() +
          Returns the underlying database for this index.
          +
          EntityCursor<K>keys() +
          Opens a cursor for traversing all keys in this index.
          +
          EntityCursor<K>keys(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
          Opens a cursor for traversing keys in a key range.
          +
          EntityCursor<K>keys(Transaction txn, + CursorConfig config) +
          Opens a cursor for traversing all keys in this index.
          +
          EntityCursor<K>keys(Transaction txn, + K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive, + CursorConfig config) +
          Opens a cursor for traversing keys in a key range.
          +
          java.util.Map<K,V>map() +
          Returns a standard Java map based on this entity index.
          +
          java.util.SortedMap<K,V>sortedMap() +
          Returns a standard Java sorted map based on this entity index.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDatabase

            +
            Database getDatabase()
            +
            Returns the underlying database for this index.
            +
            +
            Returns:
            +
            the database.
            +
            +
          • +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
          • +

            get

            +
            EntityResult<V> get(Transaction txn,
            +                    K key,
            +                    Get getType,
            +                    ReadOptions options)
            +             throws DatabaseException
            +
            Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, or null + if the operation should not be transaction protected.
            +
            key - the key to search for.
            +
            getType - must be Get.SEARCH.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the EntityResult, including the value mapped to the given key, + or null if the key is not present in the index.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            long count()
            +    throws DatabaseException
            +
            Returns a non-transactional count of the entities in this index. + + + +

            This operation is faster than obtaining a count by scanning the index + manually, and will not perturb the current contents of the cache. + However, the count is not guaranteed to be accurate if there are + concurrent updates. Note that this method does scan a significant + portion of the index and should be considered a fairly expensive + operation.

            + +

            This operation will disable deletion of log files by the JE log + cleaner during its execution and will consume a certain amount of + memory (but without affecting the memory that is available for the + JE cache). To avoid excessive memory consumption (and a potential + OutOfMemoryError) this method places an internal limit on + its memory consumption. If this limit is reached, the method will + still work properly, but its performance will degrade. To specify + a different memory limit than the one used by this method, use the + count(long memoryLimit) method.

            + +
            +
            +
            Returns:
            +
            the number of entities in this index. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            long count(long memoryLimit)
            +    throws DatabaseException
            +
            Returns a non-transactional count of the entities in this index. + +

            This operation is faster than obtaining a count by scanning the index + manually, and will not perturb the current contents of the cache. + However, the count is not guaranteed to be accurate if there are + concurrent updates. Note that this method does scan a significant + portion of the index and should be considered a fairly expensive + operation.

            + +

            This operation will disable deletion of log files by the JE log + cleaner during its execution and will consume a certain amount of + memory (but without affecting the memory that is available for the + JE cache). To avoid excessive memory consumption (and a potential + OutOfMemoryError) this method takes as input an upper bound + on the memory it may consume. If this limit is reached, the method + will still work properly, but its performance will degrade.

            +
            +
            Returns:
            +
            the number of entities in this index.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + + + + + + + + + + + +
            +
          • +

            delete

            +
            OperationResult delete(Transaction txn,
            +                       K key,
            +                       WriteOptions options)
            +                throws DatabaseException
            +
            Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            key - the key to search for.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if any entities were deleted, else null. If
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + +
            +
          • +

            keys

            +
            EntityCursor<K> keys()
            +              throws DatabaseException
            +
            Opens a cursor for traversing all keys in this index. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            keys

            +
            EntityCursor<K> keys(Transaction txn,
            +                     CursorConfig config)
            +              throws DatabaseException
            +
            Opens a cursor for traversing all keys in this index. + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            entities

            +
            EntityCursor<V> entities()
            +                  throws DatabaseException
            +
            Opens a cursor for traversing all entities in this index. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            +
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            entities

            +
            EntityCursor<V> entities(Transaction txn,
            +                         CursorConfig config)
            +                  throws DatabaseException
            +
            Opens a cursor for traversing all entities in this index.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            keys

            +
            EntityCursor<K> keys(K fromKey,
            +                     boolean fromInclusive,
            +                     K toKey,
            +                     boolean toInclusive)
            +              throws DatabaseException
            +
            Opens a cursor for traversing keys in a key range. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Parameters:
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            keys

            +
            EntityCursor<K> keys(Transaction txn,
            +                     K fromKey,
            +                     boolean fromInclusive,
            +                     K toKey,
            +                     boolean toInclusive,
            +                     CursorConfig config)
            +              throws DatabaseException
            +
            Opens a cursor for traversing keys in a key range. + + +

            Key Cursor Optimization with + READ_UNCOMMITTED

            + +

            Using a key cursor potentially has a large performance benefit when + the READ_UNCOMMITTED isolation mode is used. In this case, if + the record data is not in the JE cache, it will not be read from disk. + The performance benefit is potentially large because random access disk + reads may be reduced. Examples are:

            +
              +
            • Scanning all records in key order, when the entity is not needed and + READ_UNCOMMITTED isolation is acceptable.
            • +
            • Skipping over records quickly to perform approximate pagination with + READ_UNCOMMITTED isolation.
            • +
            + +

            For other isolation modes (READ_COMMITTED, REPEATABLE_READ and SERIALIZABLE), the performance benefit of a + key cursor is not as significant. In this case, the data item must be + read into the JE cache if it is not already present, in order to lock + the record. The only performance benefit is that the data will not be + copied from the JE cache to the application's entry parameter, and will + not be unmarshalled into an entity object.

            + +

            For information on specifying isolation modes, see LockMode, + CursorConfig and TransactionConfig.

            +
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            entities

            +
            EntityCursor<V> entities(K fromKey,
            +                         boolean fromInclusive,
            +                         K toKey,
            +                         boolean toInclusive)
            +                  throws DatabaseException
            +
            Opens a cursor for traversing entities in a key range. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            +
            +
            Parameters:
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            entities

            +
            EntityCursor<V> entities(Transaction txn,
            +                         K fromKey,
            +                         boolean fromInclusive,
            +                         K toKey,
            +                         boolean toInclusive,
            +                         CursorConfig config)
            +                  throws DatabaseException
            +
            Opens a cursor for traversing entities in a key range.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            map

            +
            java.util.Map<K,V> map()
            +
            Returns a standard Java map based on this entity index. The StoredMap returned is defined by the Collections API. Stored collections conform + to the standard Java collections framework interface.
            +
            +
            Returns:
            +
            the map.
            +
            +
          • +
          + + + +
            +
          • +

            sortedMap

            +
            java.util.SortedMap<K,V> sortedMap()
            +
            Returns a standard Java sorted map based on this entity index. The + StoredSortedMap returned is defined by the Collections API. Stored collections conform + to the standard Java collections framework interface.
            +
            +
            Returns:
            +
            the map.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/EntityJoin.html b/docs/java/com/sleepycat/persist/EntityJoin.html new file mode 100644 index 0000000..df8790c --- /dev/null +++ b/docs/java/com/sleepycat/persist/EntityJoin.html @@ -0,0 +1,501 @@ + + + + + +EntityJoin (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class EntityJoin<PK,E>

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.EntityJoin<PK,E>
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class EntityJoin<PK,E>
        +extends java.lang.Object
        +
        Performs an equality join on two or more secondary keys. + +

        EntityJoin objects are thread-safe. Multiple threads may safely + call the methods of a shared EntityJoin object.

        + +

        An equality join is a match on all entities in a given primary index that + have two or more specific secondary key values. Note that key ranges may + not be matched by an equality join, only exact keys are matched.

        + +

        For example:

        +
        +  // Index declarations -- see package summary example.
        +  //
        +  PrimaryIndex<String, Person> personBySsn;
        +  SecondaryIndex<String, String, Person> personByParentSsn;
        +  SecondaryIndex<Long, String, Person> personByEmployerIds;
        +  Employer employer = ...;
        +
        +  // Match on all Person objects having parentSsn "111-11-1111" and also
        +  // containing an employerId of employer.id.  In other words, match on all
        +  // of Bob's children that work for a given employer.
        +  //
        +  EntityJoin<String, Person> join = new EntityJoin(personBySsn);
        +  join.addCondition(personByParentSsn, "111-11-1111");
        +  join.addCondition(personByEmployerIds, employer.id);
        +
        +  // Perform the join operation by traversing the results with a cursor.
        +  //
        +  ForwardCursor<Person> results = join.entities();
        +  try {
        +      for (Person person : results) {
        +          System.out.println(person.ssn + ' ' + person.name);
        +      }
        +  } finally {
        +      results.close();
        +  }
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EntityJoin

            +
            public EntityJoin(PrimaryIndex<PK,E> index)
            +
            Creates a join object for a given primary index.
            +
            +
            Parameters:
            +
            index - the primary index on which the join will operate.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + +
            +
          • +

            addCondition

            +
            public <SK> void addCondition(SecondaryIndex<SK,PK,E> index,
            +                              SK key)
            +
            Adds a secondary key condition to the equality join. Only entities + having the given key value in the given secondary index will be returned + by the join operation.
            +
            +
            Type Parameters:
            +
            SK - the secondary key class.
            +
            Parameters:
            +
            index - the secondary index containing the given key value.
            +
            key - the key value to match during the join.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            entities

            +
            public ForwardCursor<E> entities(Transaction txn,
            +                                 CursorConfig config)
            +                          throws DatabaseException
            +
            Opens a cursor that returns the entities qualifying for the join. The + join operation is performed as the returned cursor is accessed.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            java.lang.IllegalStateException - if less than two conditions were added.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            keys

            +
            public ForwardCursor<PK> keys(Transaction txn,
            +                              CursorConfig config)
            +                       throws DatabaseException
            +
            Opens a cursor that returns the primary keys of entities qualifying for + the join. The join operation is performed as the returned cursor is + accessed.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            java.lang.IllegalStateException - if less than two conditions were added.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/EntityResult.html b/docs/java/com/sleepycat/persist/EntityResult.html new file mode 100644 index 0000000..09c1879 --- /dev/null +++ b/docs/java/com/sleepycat/persist/EntityResult.html @@ -0,0 +1,273 @@ + + + + + +EntityResult (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class EntityResult<V>

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.EntityResult<V>
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class EntityResult<V>
        +extends java.lang.Object
        +
        Used to return an entity value from a 'get' operation along with an + OperationResult. If the operation fails, null is returned. If the operation + succeeds and a non-null EntityResult is returned, the contained entity value + and OperationResult are guaranteed to be non-null.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          OperationResultresult() +
          Returns the OperationResult resulting from the operation.
          +
          Vvalue() +
          Returns the entity value resulting from the operation.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            value

            +
            public V value()
            +
            Returns the entity value resulting from the operation.
            +
            +
            Returns:
            +
            the non-null entity value.
            +
            +
          • +
          + + + +
            +
          • +

            result

            +
            public OperationResult result()
            +
            Returns the OperationResult resulting from the operation.
            +
            +
            Returns:
            +
            the non-null OperationResult.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/EntityStore.html b/docs/java/com/sleepycat/persist/EntityStore.html new file mode 100644 index 0000000..51c0b2f --- /dev/null +++ b/docs/java/com/sleepycat/persist/EntityStore.html @@ -0,0 +1,1288 @@ + + + + + +EntityStore (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class EntityStore

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.EntityStore
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class EntityStore
        +extends java.lang.Object
        +implements java.io.Closeable
        +
        A store for managing persistent entity objects. + +

        EntityStore objects are thread-safe. Multiple threads may safely + call the methods of a shared EntityStore object.

        + +

        See the package + summary example for an example of using an EntityStore.

        + +

        Before creating an EntityStore you must create an Environment object using the Berkeley DB engine API. The environment may + contain any number of entity stores and their associated databases, as well + as other databases not associated with an entity store.

        + +

        An entity store is based on an EntityModel: a data model which + defines persistent classes (entity classes), primary keys, + secondary keys, and relationships between entities. A primary index is + created for each entity class. An associated secondary index is created for + each secondary key. The Entity, PrimaryKey and SecondaryKey annotations may be used to define entities and keys.

        + +

        To use an EntityStore, first obtain PrimaryIndex and + SecondaryIndex objects by calling getPrimaryIndex and getSecondaryIndex. Then use + these indices to store and access entity records by key.

        + +

        Although not normally needed, you can also use the entity store along + with the Base API. Methods in the PrimaryIndex and SecondaryIndex classes may be used to obtain + databases and bindings. The databases may be used directly for accessing + entity records. The bindings should be called explicitly to translate + between DatabaseEntry objects and entity model + objects.

        + +

        Each primary and secondary index is associated internally with a Database. With any of the above mentioned use cases, methods are provided + that may be used for database performance tuning. The setPrimaryConfig and setSecondaryConfig methods may be called anytime before a database is + opened via getPrimaryIndex or getSecondaryIndex. The setSequenceConfig method may be called anytime before getSequence is called or getPrimaryIndex is called + for a primary index associated with that sequence.

        + + +

        Database Names

        + +

        The database names of primary and secondary indices are designed to be + unique within the environment and identifiable for debugging and use with + tools such as DbDump and DbLoad.

        + +

        The syntax of a primary index database name is:

        +
           persist#STORE_NAME#ENTITY_CLASS
        +

        Where STORE_NAME is the name parameter passed to EntityStore and ENTITY_CLASS is name of the class passed to getPrimaryIndex.

        + +

        The syntax of a secondary index database name is:

        +
           persist#STORE_NAME#ENTITY_CLASS#KEY_NAME
        +

        Where KEY_NAME is the secondary key name passed to getSecondaryIndex.

        + +

        Although you should never have to construct these names manually, + understanding their syntax is useful for several reasons:

        +
          +
        • Exception messages sometimes contain the database name, from which you + can identify the entity class and secondary key.
        • +
        • If you create other databases in the same environment that are not + part of an EntityStore, to avoid naming conflicts the other + database names should not begin with "persist#".
        • +
        • If you are using DbDump or DbLoad to perform a backup or copy databases between + environments, knowing the database names can be useful. Normally you will + dump or load all database names starting with + "persist#STORE_NAME#".
        • +
        + +

        If you are copying all databases in a store as mentioned in the last + point above, there is one further consideration. There are two internal + databases that must be kept with the other databases in the store in order + for the store to be used. These contain the data formats and sequences for + the store:

        +
           persist#STORE_NAME#com.sleepycat.persist.formats
        +
           persist#STORE_NAME#com.sleepycat.persist.sequences
        +

        These databases must normally be included with copies of other databases + in the store. They should not be modified by the application.

        + +

        For example, the following code snippet removes all databases for a given + store in a single transaction.

        +
        +  Environment env = ...
        +  EntityStore store = ...
        +  Transaction txn = env.beginTransaction(null, null);
        +  String prefix = "persist#" + store.getStoreName() + "#";
        +  for (String dbName : env.getDatabaseNames()) {
        +      if (dbName.startsWith(prefix)) {
        +          env.removeDatabase(txn, dbName);
        +      }
        +  }
        +  txn.commit();
        + +
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          EntityStore(Environment env, + java.lang.String storeName, + StoreConfig config) +
          Opens an entity store in a given environment.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidclose() +
          Closes all databases and sequences that were opened via this store.
          +
          voidcloseClass(java.lang.Class entityClass) +
          Closes the primary and secondary databases for the given entity class + that were opened via this store.
          +
          EvolveStatsevolve(EvolveConfig config) +
          Performs conversion of unevolved objects in order to reduce lazy + conversion overhead.
          +
          StoreConfiggetConfig() +
          Returns a copy of the entity store configuration.
          +
          EnvironmentgetEnvironment() +
          Returns the environment associated with this store.
          +
          EntityModelgetModel() +
          Returns the current entity model for this store.
          +
          MutationsgetMutations() +
          Returns the set of mutations that were configured when the store was + opened, or if none were configured, the set of mutations that were + configured and stored previously.
          +
          DatabaseConfiggetPrimaryConfig(java.lang.Class entityClass) +
          Returns the default primary database Berkeley DB engine API + configuration for an entity class.
          +
          <PK,E> PrimaryIndex<PK,E>getPrimaryIndex(java.lang.Class<PK> primaryKeyClass, + java.lang.Class<E> entityClass) +
          Returns the primary index for a given entity class, opening it if + necessary.
          +
          SecondaryConfiggetSecondaryConfig(java.lang.Class entityClass, + java.lang.String keyName) +
          Returns the default secondary database Berkeley DB engine API + configuration for an entity class and key name.
          +
          <SK,PK,E> SecondaryIndex<SK,PK,E>getSecondaryIndex(PrimaryIndex<PK,E> primaryIndex, + java.lang.Class<SK> keyClass, + java.lang.String keyName) +
          Returns a secondary index for a given primary index and secondary key, + opening it if necessary.
          +
          SequencegetSequence(java.lang.String name) +
          Returns a named sequence for using Berkeley DB engine API directly, + opening it if necessary.
          +
          SequenceConfiggetSequenceConfig(java.lang.String name) +
          Returns the default Berkeley DB engine API configuration for a named key + sequence.
          +
          java.lang.StringgetStoreName() +
          Returns the name of this store.
          +
          static java.util.Set<java.lang.String>getStoreNames(Environment env) +
          Returns the names of all entity stores in the given environment.
          +
          <SK,PK,E1,E2 extends E1>
          SecondaryIndex<SK,PK,E2>
          getSubclassIndex(PrimaryIndex<PK,E1> primaryIndex, + java.lang.Class<E2> entitySubclass, + java.lang.Class<SK> keyClass, + java.lang.String keyName) +
          Returns a secondary index for a secondary key in an entity subclass, + opening it if necessary.
          +
          voidsetPrimaryConfig(java.lang.Class entityClass, + DatabaseConfig config) +
          Configures the primary database for an entity class using the Berkeley + DB engine API.
          +
          voidsetSecondaryConfig(java.lang.Class entityClass, + java.lang.String keyName, + SecondaryConfig config) +
          Configures a secondary database for an entity class and key name using + the Berkeley DB engine API.
          +
          voidsetSequenceConfig(java.lang.String name, + SequenceConfig config) +
          Configures a named key sequence using the Berkeley DB engine API.
          +
          voidsync() +
          Flushes each modified index to disk that was opened in deferred-write + mode.
          +
          voidtruncateClass(java.lang.Class entityClass) +
          Deletes all instances of this entity class and its (non-entity) + subclasses.
          +
          voidtruncateClass(Transaction txn, + java.lang.Class entityClass) +
          Deletes all instances of this entity class and its (non-entity) + subclasses.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getEnvironment

            +
            public Environment getEnvironment()
            +
            Returns the environment associated with this store.
            +
            +
            Returns:
            +
            the environment.
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public StoreConfig getConfig()
            +
            Returns a copy of the entity store configuration.
            +
            +
            Returns:
            +
            the config.
            +
            +
          • +
          + + + +
            +
          • +

            getStoreName

            +
            public java.lang.String getStoreName()
            +
            Returns the name of this store.
            +
            +
            Returns:
            +
            the name.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            getModel

            +
            public EntityModel getModel()
            +
            Returns the current entity model for this store. The current model is + derived from the configured entity model and the live entity class + definitions.
            +
            +
            Returns:
            +
            the model.
            +
            +
          • +
          + + + +
            +
          • +

            getMutations

            +
            public Mutations getMutations()
            +
            Returns the set of mutations that were configured when the store was + opened, or if none were configured, the set of mutations that were + configured and stored previously.
            +
            +
            Returns:
            +
            the mutations.
            +
            +
          • +
          + + + +
            +
          • +

            getPrimaryIndex

            +
            public <PK,E> PrimaryIndex<PK,E> getPrimaryIndex(java.lang.Class<PK> primaryKeyClass,
            +                                                 java.lang.Class<E> entityClass)
            +                                          throws DatabaseException
            +
            Returns the primary index for a given entity class, opening it if + necessary. + +

            If they are not already open, the primary and secondary databases for + the entity class are created/opened together in a single internal + transaction. When the secondary indices are opened, that can cascade to + open other related primary indices.

            +
            +
            Type Parameters:
            +
            PK - the primary key class.
            +
            E - the entity class.
            +
            Parameters:
            +
            primaryKeyClass - the class of the entity's primary key field, or + the corresponding primitive wrapper class if the primary key field type + is a primitive.
            +
            entityClass - the entity class for which to open the primary index.
            +
            Returns:
            +
            the primary index.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the entity class or classes + referenced by it are not persistent, or the primary key class does not + match the entity's primary key field, or if metadata for the entity or + primary key is invalid. + +
            +
            IndexNotAvailableException - in a replicated environment if this + Replica's persistent classes have been upgraded to define a new index, + but the Master has not yet been upgraded.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs. If the index does not exist and the ReadOnly parameter is false, then one of the Write + Operation Failures may also occur.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryIndex

            +
            public <SK,PK,E> SecondaryIndex<SK,PK,E> getSecondaryIndex(PrimaryIndex<PK,E> primaryIndex,
            +                                                           java.lang.Class<SK> keyClass,
            +                                                           java.lang.String keyName)
            +                                                    throws DatabaseException
            +
            Returns a secondary index for a given primary index and secondary key, + opening it if necessary. + +

            NOTE: If the secondary key field is declared in a subclass + of the entity class, use getSubclassIndex(com.sleepycat.persist.PrimaryIndex<PK, E1>, java.lang.Class<E2>, java.lang.Class<SK>, java.lang.String) instead.

            + +

            If a SecondaryKey.relatedEntity() is used and the primary index + for the related entity is not already open, it will be opened by this + method. That will, in turn, open its secondary indices, which can + cascade to open other primary indices.

            +
            +
            Type Parameters:
            +
            SK - the secondary key class.
            +
            PK - the primary key class.
            +
            E - the entity class.
            +
            Parameters:
            +
            primaryIndex - the primary index associated with the returned + secondary index. The entity class of the primary index, or one of its + superclasses, must contain a secondary key with the given secondary key + class and key name.
            +
            keyClass - the class of the secondary key field, or the + corresponding primitive wrapper class if the secondary key field type is + a primitive.
            +
            keyName - the name of the secondary key field, or the SecondaryKey.name() if this name annotation property was specified.
            +
            Returns:
            +
            the secondary index.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the entity class or one of its + superclasses does not contain a key field of the given key class and key + name, or if the metadata for the secondary key is invalid. + +
            +
            IndexNotAvailableException - in a replicated environment if this + Replica's persistent classes have been upgraded to define a new index, + but the Master has not yet been upgraded.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs. If the index does not exist and the ReadOnly parameter is false, then one of the Write + Operation Failures may also occur.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            getSubclassIndex

            +
            public <SK,PK,E1,E2 extends E1> SecondaryIndex<SK,PK,E2> getSubclassIndex(PrimaryIndex<PK,E1> primaryIndex,
            +                                                                          java.lang.Class<E2> entitySubclass,
            +                                                                          java.lang.Class<SK> keyClass,
            +                                                                          java.lang.String keyName)
            +                                                                   throws DatabaseException
            +
            Returns a secondary index for a secondary key in an entity subclass, + opening it if necessary. + +

            If a SecondaryKey.relatedEntity() is used and the primary index + for the related entity is not already open, it will be opened by this + method. That will, in turn, open its secondary indices, which can + cascade to open other primary indices.

            +
            +
            Type Parameters:
            +
            SK - the secondary key class.
            +
            PK - the primary key class.
            +
            E1 - the entity class.
            +
            E2 - the entity sub-class.
            +
            Parameters:
            +
            primaryIndex - the primary index associated with the returned + secondary index. The entity class of the primary index, or one of its + superclasses, must contain a secondary key with the given secondary key + class and key name.
            +
            entitySubclass - a subclass of the entity class for the primary + index. The entity subclass must contain a secondary key with the given + secondary key class and key name.
            +
            keyClass - the class of the secondary key field, or the + corresponding primitive wrapper class if the secondary key field type is + a primitive.
            +
            keyName - the name of the secondary key field, or the SecondaryKey.name() if this name annotation property was specified.
            +
            Returns:
            +
            the secondary index.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the given entity subclass does not + contain a key field of the given key class and key name, or if the + metadata for the secondary key is invalid. + +
            +
            IndexNotAvailableException - in a replicated environment if this + Replica's persistent classes have been upgraded to define a new index, + but the Master has not yet been upgraded.
            +
            OperationFailureException - if one of the Read Operation + Failures occurs. If the index does not exist and the ReadOnly parameter is false, then one of the Write + Operation Failures may also occur.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            evolve

            +
            public EvolveStats evolve(EvolveConfig config)
            +                   throws DatabaseException
            +
            Performs conversion of unevolved objects in order to reduce lazy + conversion overhead. Evolution may be performed concurrently with + normal access to the store. + +

            Conversion is performed one entity class at a time. An entity class + is converted only if it has Mutations associated with it via + StoreConfig.setMutations.

            + +

            Conversion of an entity class is performed by reading each entity, + converting it if necessary, and updating it if conversion was performed. + When all instances of an entity class are converted, references to the + appropriate Mutations are deleted. Therefore, if this method is + called twice successfully without changing class definitions, the second + call will do nothing.

            +
            +
            Parameters:
            +
            config - the EvolveConfig.
            +
            Returns:
            +
            the EvolveStats. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            See Also:
            +
            Class Evolution
            +
            +
          • +
          + + + + + + + + + + + + + + + + + + + +
            +
          • +

            close

            +
            public void close()
            +           throws DatabaseException
            +
            Closes all databases and sequences that were opened via this store. The + caller must ensure that no databases opened via this store are in use. + + +

            WARNING: To prevent memory leaks, the application must call this + method even when the Environment has become invalid. While this is not + necessary for Database objects, it is necessary for EntityStore objects + to prevent the accumulation of memory in the global DPL metadata cache. + + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            getSequence

            +
            public Sequence getSequence(java.lang.String name)
            +                     throws DatabaseException
            +
            Returns a named sequence for using Berkeley DB engine API directly, + opening it if necessary.
            +
            +
            Parameters:
            +
            name - the sequence name, which is normally defined using the + PrimaryKey.sequence() annotation property.
            +
            Returns:
            +
            the open sequence for the given sequence name.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            getSequenceConfig

            +
            public SequenceConfig getSequenceConfig(java.lang.String name)
            +
            Returns the default Berkeley DB engine API configuration for a named key + sequence. + +

            The returned configuration is as follows. All other properties have + default values.

            +
            +
            +
            Parameters:
            +
            name - the sequence name, which is normally defined using the + PrimaryKey.sequence() annotation property.
            +
            Returns:
            +
            the default configuration for the given sequence name.
            +
            +
          • +
          + + + +
            +
          • +

            setSequenceConfig

            +
            public void setSequenceConfig(java.lang.String name,
            +                              SequenceConfig config)
            +
            Configures a named key sequence using the Berkeley DB engine API. + +

            To be compatible with the entity model and the Direct Persistence + Layer, the configuration should be retrieved using getSequenceConfig, modified, and then passed to this + method. The following configuration properties may not be changed:

            + +

            In addition, AllowCreate must be + the inverse of ReadOnly

            + +

            If the range is changed to include the value zero, see PrimaryKey for restrictions.

            +
            +
            Parameters:
            +
            name - the sequence name, which is normally defined using the + PrimaryKey.sequence() annotation property.
            +
            config - the configuration to use for the given sequence name.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the configuration is incompatible + with the entity model or the Direct Persistence Layer.
            +
            java.lang.IllegalStateException - if the sequence has already been opened.
            +
            +
          • +
          + + + +
            +
          • +

            getPrimaryConfig

            +
            public DatabaseConfig getPrimaryConfig(java.lang.Class entityClass)
            +
            Returns the default primary database Berkeley DB engine API + configuration for an entity class. + +

            The returned configuration is as follows. All other properties have + default values.

            +
            +
            +
            Parameters:
            +
            entityClass - the entity class identifying the primary database.
            +
            Returns:
            +
            the default configuration for the given entity class.
            +
            +
          • +
          + + + +
            +
          • +

            setPrimaryConfig

            +
            public void setPrimaryConfig(java.lang.Class entityClass,
            +                             DatabaseConfig config)
            +
            Configures the primary database for an entity class using the Berkeley + DB engine API. + +

            To be compatible with the entity model and the Direct Persistence + Layer, the configuration should be retrieved using getPrimaryConfig, modified, and then passed to this + method. The following configuration properties may not be changed:

            + +

            In addition, AllowCreate must be + the inverse of ReadOnly

            +
            +
            Parameters:
            +
            entityClass - the entity class identifying the primary database.
            +
            config - the configuration to use for the given entity class.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the configuration is incompatible + with the entity model or the Direct Persistence Layer.
            +
            java.lang.IllegalStateException - if the database has already been opened.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            setSecondaryConfig

            +
            public void setSecondaryConfig(java.lang.Class entityClass,
            +                               java.lang.String keyName,
            +                               SecondaryConfig config)
            +
            Configures a secondary database for an entity class and key name using + the Berkeley DB engine API. + +

            To be compatible with the entity model and the Direct Persistence + Layer, the configuration should be retrieved using getSecondaryConfig, modified, and then passed to + this method. The following configuration properties may not be + changed:

            + +

            In addition, AllowCreate must be + the inverse of ReadOnly

            +
            +
            Parameters:
            +
            entityClass - the entity class containing the given secondary key + name.
            +
            keyName - the name of the secondary key field, or the SecondaryKey.name() if this name annotation property was specified.
            +
            config - the configuration to use for the given secondary key.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the configuration is incompatible + with the entity model or the Direct Persistence Layer.
            +
            java.lang.IllegalStateException - if the database has already been opened.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/ForwardCursor.html b/docs/java/com/sleepycat/persist/ForwardCursor.html new file mode 100644 index 0000000..e4d455b --- /dev/null +++ b/docs/java/com/sleepycat/persist/ForwardCursor.html @@ -0,0 +1,398 @@ + + + + + +ForwardCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Interface ForwardCursor<V>

      +
      +
      +
      +
        +
      • +
        +
        All Superinterfaces:
        +
        java.lang.AutoCloseable, java.io.Closeable, java.lang.Iterable<V>
        +
        +
        +
        All Known Subinterfaces:
        +
        EntityCursor<V>
        +
        +
        +
        +
        public interface ForwardCursor<V>
        +extends java.lang.Iterable<V>, java.io.Closeable
        +
        Cursor operations limited to traversing forward. See EntityCursor + for general information on cursors. + +

        ForwardCursor objects are not thread-safe. Cursors + should be opened, used and closed by a single thread.

        + +

        WARNING: Cursors must always be closed to prevent resource leaks + which could lead to the index becoming unusable or cause an + OutOfMemoryError. To ensure that a cursor is closed in the + face of exceptions, close it in a finally block.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          voidclose() +
          Closes the cursor.
          +
          java.util.Iterator<V>iterator() +
          Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
          +
          java.util.Iterator<V>iterator(LockMode lockMode) +
          Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
          +
          Vnext() +
          Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
          +
          Vnext(LockMode lockMode) +
          Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
          +
          +
            +
          • + + +

            Methods inherited from interface java.lang.Iterable

            +forEach, spliterator
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            next

            +
            V next(LockMode lockMode)
            +throws DatabaseException
            +
            Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range. If the cursor is + uninitialized, this method returns the first value.
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for this operation, or null to + use LockMode.DEFAULT.
            +
            Returns:
            +
            the next value, or null if there are no more values in the + cursor range. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            iterator

            +
            java.util.Iterator<V> iterator()
            +
            Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized. + +

            LockMode.DEFAULT is used implicitly.

            +
            +
            Specified by:
            +
            iterator in interface java.lang.Iterable<V>
            +
            Returns:
            +
            the iterator.
            +
            +
          • +
          + + + +
            +
          • +

            iterator

            +
            java.util.Iterator<V> iterator(LockMode lockMode)
            +
            Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
            +
            +
            Parameters:
            +
            lockMode - the lock mode to use for all operations performed + using the iterator, or null to use LockMode.DEFAULT.
            +
            Returns:
            +
            the iterator.
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            void close()
            +    throws DatabaseException
            +
            Closes the cursor.
            +
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/IndexNotAvailableException.html b/docs/java/com/sleepycat/persist/IndexNotAvailableException.html new file mode 100644 index 0000000..6615648 --- /dev/null +++ b/docs/java/com/sleepycat/persist/IndexNotAvailableException.html @@ -0,0 +1,276 @@ + + + + + +IndexNotAvailableException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class IndexNotAvailableException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class IndexNotAvailableException
        +extends OperationFailureException
        +
        Thrown by the getPrimaryIndex, getSecondaryIndex and getSubclassIndex when an index has not yet + been created. + + + This exception can be thrown in two circumstances. +
          +
        1. It can be thrown in a replicated environment when the Replica has been + upgraded to contain new persistent classes that define a new primary or + secondary index, but the Master has not yet been upgraded. The index does + not exist because the Master has not yet been upgraded with the new classes. + If the application is aware of when the Master is upgraded, it can wait for + that to occur and then open the index. Or, the application may repeatedly + try to open the index until it becomes available.
        2. +
        3. + +

          It can be thrown when opening an environment read-only with new + persistent classes that define a new primary or secondary index. The index + does not exist because the environment has not yet been opened read-write + with the new classes. When the index is created by a read-write + application, the read-only application must close and re-open the + environment in order to open the new index.

          + +
        4. +
        +
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/PrimaryIndex.html b/docs/java/com/sleepycat/persist/PrimaryIndex.html new file mode 100644 index 0000000..28b35a4 --- /dev/null +++ b/docs/java/com/sleepycat/persist/PrimaryIndex.html @@ -0,0 +1,1785 @@ + + + + + +PrimaryIndex (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class PrimaryIndex<PK,E>

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.PrimaryIndex<PK,E>
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        EntityIndex<PK,E>
        +
        +
        +
        +
        public class PrimaryIndex<PK,E>
        +extends java.lang.Object
        +
        The primary index for an entity class and its primary key. + +

        PrimaryIndex objects are thread-safe. Multiple threads may + safely call the methods of a shared PrimaryIndex object.

        + +

        PrimaryIndex implements EntityIndex to map the primary + key type (PK) to the entity type (E).

        + +

        The Entity annotation may be used to define an entity class and + the PrimaryKey annotation may be used to define a primary key as + shown in the following example.

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     String name;
        +
        +     Employee(long id, String name) {
        +         this.id = id;
        +         this.name = name;
        +     }
        +
        +     private Employee() {} // For bindings
        + }
        + +

        To obtain the PrimaryIndex for a given entity class, call EntityStore.getPrimaryIndex, passing the + primary key class and the entity class. For example:

        + +
        + EntityStore store = new EntityStore(...);
        +
        + PrimaryIndex<Long, Employee> primaryIndex =
        +     store.getPrimaryIndex(Long.class, Employee.class);
        + +

        Note that Long.class is passed as the primary key class, but the + primary key field has the primitive type long. When a primitive + primary key field is used, the corresponding primitive wrapper class is used + to access the primary index. For more information on key field types, see + PrimaryKey.

        + +

        The PrimaryIndex provides the primary storage and access methods + for the instances of a particular entity class. Entities are inserted and + updated in the PrimaryIndex by calling a method in the family of + put(E) methods. The put(E) method will insert the entity if no + entity with the same primary key already exists. If an entity with the same + primary key does exist, it will update the entity and return the existing + (old) entity. For example:

        + +
        + Employee oldEntity;
        + oldEntity = primaryIndex.put(new Employee(1, "Jane Smith"));    // Inserts an entity
        + assert oldEntity == null;
        + oldEntity = primaryIndex.put(new Employee(2, "Joan Smith"));    // Inserts an entity
        + assert oldEntity == null;
        + oldEntity = primaryIndex.put(new Employee(2, "Joan M. Smith")); // Updates an entity
        + assert oldEntity != null;
        + +

        The putNoReturn(E) method can be used to avoid the overhead of + returning the existing entity, when the existing entity is not important to + the application. The return type of putNoReturn(E) is void. For + example:

        + +
        + primaryIndex.putNoReturn(new Employee(1, "Jane Smith"));    // Inserts an entity
        + primaryIndex.putNoReturn(new Employee(2, "Joan Smith"));    // Inserts an entity
        + primaryIndex.putNoReturn(new Employee(2, "Joan M. Smith")); // Updates an entity
        + +

        The putNoOverwrite(E) method can be used to ensure that an existing + entity is not overwritten. putNoOverwrite(E) returns true if the + entity was inserted, or false if an existing entity exists and no action was + taken. For example:

        + +
        + boolean inserted;
        + inserted = primaryIndex.putNoOverwrite(new Employee(1, "Jane Smith"));    // Inserts an entity
        + assert inserted;
        + inserted = primaryIndex.putNoOverwrite(new Employee(2, "Joan Smith"));    // Inserts an entity
        + assert inserted;
        + inserted = primaryIndex.putNoOverwrite(new Employee(2, "Joan M. Smith")); // No action was taken!
        + assert !inserted;
        + +

        Primary key values must be unique, in other words, each instance of a + given entity class must have a distinct primary key value. Rather than + assigning the unique primary key values yourself, a sequence can be + used to assign sequential integer values automatically, starting with the + value 1 (one). A sequence is defined using the PrimaryKey.sequence() + annotation property. For example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey(sequence="ID")
        +     long id;
        +
        +     String name;
        +
        +     Employee(String name) {
        +         this.name = name;
        +     }
        +
        +     private Employee() {} // For bindings
        + }
        + +

        The name of the sequence used above is "ID". Any name can be used. If + the same sequence name is used in more than one entity class, the sequence + will be shared by those classes, in other words, a single sequence of + integers will be used for all instances of those classes. See PrimaryKey.sequence() for more information.

        + +

        Any method in the family of put(E) methods may be used to insert + entities where the primary key is assigned from a sequence. When the put(E) method returns, the primary key field of the entity object will be set + to the assigned key value. For example:

        + +
        + Employee employee;
        + employee = new Employee("Jane Smith");
        + primaryIndex.putNoReturn(employee);    // Inserts an entity
        + assert employee.id == 1;
        + employee = new Employee("Joan Smith");
        + primaryIndex.putNoReturn(employee);    // Inserts an entity
        + assert employee.id == 2;
        + +

        This begs the question: How do you update an existing entity, without + assigning a new primary key? The answer is that the put(E) methods + will only assign a new key from the sequence if the primary key field is + zero or null (for reference types). If an entity with a non-zero and + non-null key field is passed to a put(E) method, any existing entity + with that primary key value will be updated. For example:

        + +
        + Employee employee;
        + employee = new Employee("Jane Smith");
        + primaryIndex.putNoReturn(employee);    // Inserts an entity
        + assert employee.id == 1;
        + employee = new Employee("Joan Smith");
        + primaryIndex.putNoReturn(employee);    // Inserts an entity
        + assert employee.id == 2;
        + employee.name = "Joan M. Smith";
        + primaryIndex.putNoReturn(employee);    // Updates an existing entity
        + assert employee.id == 2;
        + +

        Since PrimaryIndex implements the EntityIndex interface, + it shares the common index methods for retrieving and deleting entities, + opening cursors and using transactions. See EntityIndex for more + information on these topics.

        + +

        Note that when using an index, keys and values are stored and retrieved + by value not by reference. In other words, if an entity object is stored + and then retrieved, or retrieved twice, each object will be a separate + instance. For example, in the code below the assertion will always + fail.

        +
        + MyKey key = ...;
        + MyEntity entity1 = new MyEntity(key, ...);
        + index.put(entity1);
        + MyEntity entity2 = index.get(key);
        + assert entity1 == entity2; // always fails!
        + 
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          PrimaryIndex(Database database, + java.lang.Class<PK> keyClass, + EntryBinding<PK> keyBinding, + java.lang.Class<E> entityClass, + EntityBinding<E> entityBinding) +
          Creates a primary index without using an EntityStore.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleancontains(K key) +
          Checks for existence of a key in this index.
          +
          booleancontains(Transaction txn, + K key, + LockMode lockMode) +
          Checks for existence of a key in this index.
          +
          longcount() +
          Returns a non-transactional count of the entities in this index.
          +
          longcount(long memoryLimit) +
          Returns a non-transactional count of the entities in this index.
          +
          booleandelete(K key) +
          Deletes all entities with a given index key.
          +
          booleandelete(Transaction txn, + K key) +
          Deletes all entities with a given index key.
          +
          OperationResultdelete(Transaction txn, + K key, + WriteOptions options) +
          Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
          +
          EntityCursor<E>entities() +
          Opens a cursor for traversing all entities in this index.
          +
          EntityCursor<E>entities(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
          Opens a cursor for traversing entities in a key range.
          +
          EntityCursor<E>entities(Transaction txn, + CursorConfig config) +
          Opens a cursor for traversing all entities in this index.
          +
          EntityCursor<E>entities(Transaction txn, + K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive, + CursorConfig config) +
          Opens a cursor for traversing entities in a key range.
          +
          Eget(PK key) +
          Gets an entity via a key of this index.
          +
          EntityResult<E>get(Transaction txn, + PK key, + Get getType, + ReadOptions options) +
          Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
          +
          Eget(Transaction txn, + PK key, + LockMode lockMode) +
          Gets an entity via a key of this index.
          +
          DatabasegetDatabase() +
          Returns the underlying database for this index.
          +
          EntityBinding<E>getEntityBinding() +
          Returns the entity binding for this index.
          +
          java.lang.Class<E>getEntityClass() +
          Returns the entity class for this index.
          +
          EntryBinding<PK>getKeyBinding() +
          Returns the primary key binding for this index.
          +
          java.lang.Class<PK>getKeyClass() +
          Returns the primary key class for this index.
          +
          EntityCursor<K>keys() +
          Opens a cursor for traversing all keys in this index.
          +
          EntityCursor<K>keys(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
          Opens a cursor for traversing keys in a key range.
          +
          EntityCursor<K>keys(Transaction txn, + CursorConfig config) +
          Opens a cursor for traversing all keys in this index.
          +
          EntityCursor<K>keys(Transaction txn, + K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive, + CursorConfig config) +
          Opens a cursor for traversing keys in a key range.
          +
          java.util.Map<PK,E>map() +
          Returns a standard Java map based on this entity index.
          +
          Eput(E entity) +
          Inserts an entity and returns null, or updates it if the primary key + already exists and returns the existing entity.
          +
          Eput(Transaction txn, + E entity) +
          Inserts an entity and returns null, or updates it if the primary key + already exists and returns the existing entity.
          +
          OperationResultput(Transaction txn, + E entity, + Put putType, + WriteOptions options) +
          Inserts or updates an entity, using Put type and WriteOptions + parameters, and returning an OperationResult.
          +
          booleanputNoOverwrite(E entity) +
          Inserts an entity and returns true, or returns false if the primary key + already exists.
          +
          booleanputNoOverwrite(Transaction txn, + E entity) +
          Inserts an entity and returns true, or returns false if the primary key + already exists.
          +
          voidputNoReturn(E entity) +
          Inserts an entity, or updates it if the primary key already exists (does + not return the existing entity).
          +
          voidputNoReturn(Transaction txn, + E entity) +
          Inserts an entity, or updates it if the primary key already exists (does + not return the existing entity).
          +
          java.util.SortedMap<PK,E>sortedMap() +
          Returns a standard Java sorted map based on this entity index.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            PrimaryIndex

            +
            public PrimaryIndex(Database database,
            +                    java.lang.Class<PK> keyClass,
            +                    EntryBinding<PK> keyBinding,
            +                    java.lang.Class<E> entityClass,
            +                    EntityBinding<E> entityBinding)
            +             throws DatabaseException
            +
            Creates a primary index without using an EntityStore. + +

            This constructor is not normally needed and is provided for + applications that wish to use custom bindings along with the Direct + Persistence Layer. Normally, getPrimaryIndex is used instead.

            + +

            Note that when this constructor is used directly, primary keys cannot + be automatically assigned from a sequence. The key assignment feature + requires knowledge of the primary key field, which is only available if + an EntityStore is used. Of course, primary keys may be + assigned from a sequence manually before calling the put + methods in this class.

            +
            +
            Parameters:
            +
            database - the primary database.
            +
            keyClass - the class of the primary key.
            +
            keyBinding - the binding to be used for primary keys.
            +
            entityClass - the class of the entities stored in this index.
            +
            entityBinding - the binding to be used for entities.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getKeyClass

            +
            public java.lang.Class<PK> getKeyClass()
            +
            Returns the primary key class for this index.
            +
            +
            Returns:
            +
            the key class.
            +
            +
          • +
          + + + +
            +
          • +

            getKeyBinding

            +
            public EntryBinding<PK> getKeyBinding()
            +
            Returns the primary key binding for this index.
            +
            +
            Returns:
            +
            the key binding.
            +
            +
          • +
          + + + +
            +
          • +

            getEntityClass

            +
            public java.lang.Class<E> getEntityClass()
            +
            Returns the entity class for this index.
            +
            +
            Returns:
            +
            the entity class.
            +
            +
          • +
          + + + +
            +
          • +

            getEntityBinding

            +
            public EntityBinding<E> getEntityBinding()
            +
            Returns the entity binding for this index.
            +
            +
            Returns:
            +
            the entity binding.
            +
            +
          • +
          + + + + + +
            +
          • +

            put

            +
            public E put(E entity)
            +      throws DatabaseException
            +
            Inserts an entity and returns null, or updates it if the primary key + already exists and returns the existing entity. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            + +

            Auto-commit is used implicitly if the store is transactional.

            +
            +
            Parameters:
            +
            entity - the entity to be inserted or updated.
            +
            Returns:
            +
            the existing entity that was updated, or null if the entity was + inserted. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            put

            +
            public E put(Transaction txn,
            +             E entity)
            +      throws DatabaseException
            +
            Inserts an entity and returns null, or updates it if the primary key + already exists and returns the existing entity. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            entity - the entity to be inserted or updated.
            +
            Returns:
            +
            the existing entity that was updated, or null if the entity was + inserted. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            putNoReturn

            +
            public void putNoReturn(E entity)
            +                 throws DatabaseException
            +
            Inserts an entity, or updates it if the primary key already exists (does + not return the existing entity). This method may be used instead of + put(Object) to save the overhead of returning the existing + entity. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            + +

            Auto-commit is used implicitly if the store is transactional.

            +
            +
            Parameters:
            +
            entity - the entity to be inserted or updated. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            putNoReturn

            +
            public void putNoReturn(Transaction txn,
            +                        E entity)
            +                 throws DatabaseException
            +
            Inserts an entity, or updates it if the primary key already exists (does + not return the existing entity). This method may be used instead of + put(Transaction,Object) to save the overhead of returning the + existing entity. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            entity - the entity to be inserted or updated. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            putNoOverwrite

            +
            public boolean putNoOverwrite(E entity)
            +                       throws DatabaseException
            +
            Inserts an entity and returns true, or returns false if the primary key + already exists. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            + +

            Auto-commit is used implicitly if the store is transactional.

            +
            +
            Parameters:
            +
            entity - the entity to be inserted.
            +
            Returns:
            +
            true if the entity was inserted, or false if an entity with the + same primary key is already present. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            putNoOverwrite

            +
            public boolean putNoOverwrite(Transaction txn,
            +                              E entity)
            +                       throws DatabaseException
            +
            Inserts an entity and returns true, or returns false if the primary key + already exists. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            entity - the entity to be inserted.
            +
            Returns:
            +
            true if the entity was inserted, or false if an entity with the + same primary key is already present. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            put

            +
            public OperationResult put(Transaction txn,
            +                           E entity,
            +                           Put putType,
            +                           WriteOptions options)
            +
            Inserts or updates an entity, using Put type and WriteOptions + parameters, and returning an OperationResult. + +

            If a PrimaryKey.sequence() is used and the primary key field of + the given entity is null or zero, this method will assign the next value + from the sequence to the primary key field of the given entity.

            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            entity - the entity to be inserted.
            +
            putType - is Put.OVERWRITE or Put.NO_OVERWRITE.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if the record is written, else null. If + Put.NO_OVERWRITE is used, null is returned if an entity with the + same primary key is already present. If Put.OVERWRITE is used, + null is never returned.
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            Since:
            +
            7.0
            +
            +
          • +
          + + + + + + + + + + + + + + + + + +
            +
          • +

            get

            +
            public EntityResult<E> get(Transaction txn,
            +                           PK key,
            +                           Get getType,
            +                           ReadOptions options)
            +                    throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, or null + if the operation should not be transaction protected.
            +
            key - the key to search for.
            +
            getType - must be Get.SEARCH.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the EntityResult, including the value mapped to the given key, + or null if the key is not present in the index.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            map

            +
            public java.util.Map<PK,E> map()
            +
            Description copied from interface: EntityIndex
            +
            Returns a standard Java map based on this entity index. The StoredMap returned is defined by the Collections API. Stored collections conform + to the standard Java collections framework interface.
            +
            +
            Returns:
            +
            the map.
            +
            +
          • +
          + + + +
            +
          • +

            sortedMap

            +
            public java.util.SortedMap<PK,E> sortedMap()
            +
            Description copied from interface: EntityIndex
            +
            Returns a standard Java sorted map based on this entity index. The + StoredSortedMap returned is defined by the Collections API. Stored collections conform + to the standard Java collections framework interface.
            +
            +
            Returns:
            +
            the map.
            +
            +
          • +
          + + + +
            +
          • +

            getDatabase

            +
            public Database getDatabase()
            +
            Description copied from interface: EntityIndex
            +
            Returns the underlying database for this index.
            +
            +
            Specified by:
            +
            getDatabase in interface EntityIndex<K,E>
            +
            Returns:
            +
            the database.
            +
            +
          • +
          + + + + + + + + + + + + + + + +
            +
          • +

            count

            +
            public long count()
            +           throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Returns a non-transactional count of the entities in this index. + + + +

            This operation is faster than obtaining a count by scanning the index + manually, and will not perturb the current contents of the cache. + However, the count is not guaranteed to be accurate if there are + concurrent updates. Note that this method does scan a significant + portion of the index and should be considered a fairly expensive + operation.

            + +

            This operation will disable deletion of log files by the JE log + cleaner during its execution and will consume a certain amount of + memory (but without affecting the memory that is available for the + JE cache). To avoid excessive memory consumption (and a potential + OutOfMemoryError) this method places an internal limit on + its memory consumption. If this limit is reached, the method will + still work properly, but its performance will degrade. To specify + a different memory limit than the one used by this method, use the + EntityIndex.count(long memoryLimit) method.

            + +
            +
            +
            Specified by:
            +
            count in interface EntityIndex<K,E>
            +
            Returns:
            +
            the number of entities in this index. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            public long count(long memoryLimit)
            +           throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Returns a non-transactional count of the entities in this index. + +

            This operation is faster than obtaining a count by scanning the index + manually, and will not perturb the current contents of the cache. + However, the count is not guaranteed to be accurate if there are + concurrent updates. Note that this method does scan a significant + portion of the index and should be considered a fairly expensive + operation.

            + +

            This operation will disable deletion of log files by the JE log + cleaner during its execution and will consume a certain amount of + memory (but without affecting the memory that is available for the + JE cache). To avoid excessive memory consumption (and a potential + OutOfMemoryError) this method takes as input an upper bound + on the memory it may consume. If this limit is reached, the method + will still work properly, but its performance will degrade.

            +
            +
            Specified by:
            +
            count in interface EntityIndex<K,E>
            +
            Returns:
            +
            the number of entities in this index.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + + + + + + + + + + + +
            +
          • +

            delete

            +
            public OperationResult delete(Transaction txn,
            +                              K key,
            +                              WriteOptions options)
            +                       throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
            +
            +
            Specified by:
            +
            delete in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            key - the key to search for.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if any entities were deleted, else null. If
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys()
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all keys in this index. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys(Transaction txn,
            +                            CursorConfig config)
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all keys in this index. + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities()
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all entities in this index. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities(Transaction txn,
            +                                CursorConfig config)
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all entities in this index.
            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys(K fromKey,
            +                            boolean fromInclusive,
            +                            K toKey,
            +                            boolean toInclusive)
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing keys in a key range. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Parameters:
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys(Transaction txn,
            +                            K fromKey,
            +                            boolean fromInclusive,
            +                            K toKey,
            +                            boolean toInclusive,
            +                            CursorConfig config)
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing keys in a key range. + + +

            Key Cursor Optimization with + READ_UNCOMMITTED

            + +

            Using a key cursor potentially has a large performance benefit when + the READ_UNCOMMITTED isolation mode is used. In this case, if + the record data is not in the JE cache, it will not be read from disk. + The performance benefit is potentially large because random access disk + reads may be reduced. Examples are:

            +
              +
            • Scanning all records in key order, when the entity is not needed and + READ_UNCOMMITTED isolation is acceptable.
            • +
            • Skipping over records quickly to perform approximate pagination with + READ_UNCOMMITTED isolation.
            • +
            + +

            For other isolation modes (READ_COMMITTED, REPEATABLE_READ and SERIALIZABLE), the performance benefit of a + key cursor is not as significant. In this case, the data item must be + read into the JE cache if it is not already present, in order to lock + the record. The only performance benefit is that the data will not be + copied from the JE cache to the application's entry parameter, and will + not be unmarshalled into an entity object.

            + +

            For information on specifying isolation modes, see LockMode, + CursorConfig and TransactionConfig.

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities(K fromKey,
            +                                boolean fromInclusive,
            +                                K toKey,
            +                                boolean toInclusive)
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing entities in a key range. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Parameters:
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities(Transaction txn,
            +                                K fromKey,
            +                                boolean fromInclusive,
            +                                K toKey,
            +                                boolean toInclusive,
            +                                CursorConfig config)
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing entities in a key range.
            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/SecondaryIndex.html b/docs/java/com/sleepycat/persist/SecondaryIndex.html new file mode 100644 index 0000000..3eb196f --- /dev/null +++ b/docs/java/com/sleepycat/persist/SecondaryIndex.html @@ -0,0 +1,2097 @@ + + + + + +SecondaryIndex (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class SecondaryIndex<SK,PK,E>

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.SecondaryIndex<SK,PK,E>
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        EntityIndex<SK,E>
        +
        +
        +
        +
        public class SecondaryIndex<SK,PK,E>
        +extends java.lang.Object
        +
        The secondary index for an entity class and a secondary key. + +

        SecondaryIndex objects are thread-safe. Multiple threads may + safely call the methods of a shared SecondaryIndex object.

        + +

        SecondaryIndex implements EntityIndex to map the + secondary key type (SK) to the entity type (E). In other words, entities + are accessed by secondary key values.

        + +

        The SecondaryKey annotation may be used to define a secondary key + as shown in the following example.

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        + +

        Before obtaining a SecondaryIndex, the PrimaryIndex must + be obtained for the entity class. To obtain the SecondaryIndex call + EntityStore.getSecondaryIndex, passing + the primary index, the secondary key class and the secondary key name. For + example:

        + +
        + EntityStore store = new EntityStore(...);
        +
        + PrimaryIndex<Long, Employee> primaryIndex =
        +     store.getPrimaryIndex(Long.class, Employee.class);
        +
        + SecondaryIndex<String, Long, Employee> secondaryIndex =
        +     store.getSecondaryIndex(primaryIndex, String.class, "department");
        + +

        Since SecondaryIndex implements the EntityIndex + interface, it shares the common index methods for retrieving and deleting + entities, opening cursors and using transactions. See EntityIndex + for more information on these topics.

        + +

        SecondaryIndex does not provide methods for inserting + and updating entities. That must be done using the PrimaryIndex.

        + +

        Note that a SecondaryIndex has three type parameters <SK, + PK, E> or in the example <String, Long, Employee> while a PrimaryIndex has only two type parameters <PK, E> or <Long, + Employee>. This is because a SecondaryIndex has an extra level of + mapping: It maps from secondary key to primary key, and then from primary + key to entity. For example, consider this entity:

        + +
        + + +
        IDDepartmentName
        1EngineeringJane Smith
        + +

        The PrimaryIndex maps from id directly to the entity, or from + primary key 1 to the "Jane Smith" entity in the example. The SecondaryIndex maps from department to id, or from secondary key + "Engineering" to primary key 1 in the example, and then uses the PrimaryIndex to map from the primary key to the entity.

        + +

        Because of this extra type parameter and extra level of mapping, a SecondaryIndex can provide more than one mapping, or view, of the entities + in the primary index. The main mapping of a SecondaryIndex is to + map from secondary key (SK) to entity (E), or in the example, from the + String department key to the Employee entity. The SecondaryIndex + itself, by implementing EntityIndex<SK, E>, provides this + mapping.

        + +

        The second mapping provided by SecondaryIndex is from secondary + key (SK) to primary key (PK), or in the example, from the String department + key to the Long id key. The keysIndex method provides this + mapping. When accessing the keys index, the primary key is returned rather + than the entity. When only the primary key is needed and not the entire + entity, using the keys index is less expensive than using the secondary + index because the primary index does not have to be accessed.

        + +

        The third mapping provided by SecondaryIndex is from primary key + (PK) to entity (E), for the subset of entities having a given secondary key + (SK). This mapping is provided by the subIndex(SK) method. A + sub-index is convenient when you are interested in working with the subset + of entities having a particular secondary key value, for example, all + employees in a given department.

        + +

        All three mappings, along with the mapping provided by the PrimaryIndex, are shown using example data in the EntityIndex + interface documentation. See EntityIndex for more information.

        + +

        Note that when using an index, keys and values are stored and retrieved + by value not by reference. In other words, if an entity object is stored + and then retrieved, or retrieved twice, each object will be a separate + instance. For example, in the code below the assertion will always + fail.

        +
        + MyKey key = ...;
        + MyEntity entity1 = index.get(key);
        + MyEntity entity2 = index.get(key);
        + assert entity1 == entity2; // always fails!
        + 
        + +

        One-to-One Relationships

        + +

        A ONE_TO_ONE relationship, although less + common than other types of relationships, is the simplest type of + relationship. A single entity is related to a single secondary key value. + For example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=ONE_TO_ONE)
        +     String ssn;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + SecondaryIndex<String, Long, Employee> employeeBySsn =
        +     store.getSecondaryIndex(primaryIndex, String.class, "ssn");
        + +

        With a ONE_TO_ONE relationship, the + secondary key must be unique; in other words, no two entities may have the + same secondary key value. If an attempt is made to store an entity having + the same secondary key value as another existing entity, a DatabaseException will be thrown.

        + +

        Because the secondary key is unique, it is useful to lookup entities by + secondary key using EntityIndex.get(K). For example:

        + +
        + Employee employee = employeeBySsn.get(mySsn);
        + +

        Many-to-One Relationships

        + +

        A MANY_TO_ONE relationship is the most + common type of relationship. One or more entities is related to a single + secondary key value. For example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + SecondaryIndex<String, Long, Employee> employeeByDepartment =
        +     store.getSecondaryIndex(primaryIndex, String.class, "department");
        + +

        With a MANY_TO_ONE relationship, the + secondary key is not required to be unique; in other words, more than one + entity may have the same secondary key value. In this example, more than + one employee may belong to the same department.

        + +

        The most convenient way to access the employees in a given department is + by using a sub-index. For example:

        + +
        + EntityIndex<Long, Entity> subIndex = employeeByDepartment.subIndex(myDept);
        + EntityCursor<Employee> cursor = subIndex.entities();
        + try {
        +     for (Employee entity : cursor) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        One-to-Many Relationships

        + +

        In a ONE_TO_MANY relationship, a single + entity is related to one or more secondary key values. For example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=ONE_TO_MANY)
        +     Set<String> emailAddresses = new HashSet<String>;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + SecondaryIndex<String, Long, Employee> employeeByEmail =
        +     store.getSecondaryIndex(primaryIndex, String.class, "emailAddresses");
        + +

        With a ONE_TO_MANY relationship, the + secondary key must be unique; in other words, no two entities may have the + same secondary key value. In this example, no two employees may have the + same email address. If an attempt is made to store an entity having the + same secondary key value as another existing entity, a DatabaseException will be thrown.

        + +

        Because the secondary key is unique, it is useful to lookup entities by + secondary key using EntityIndex.get(K). For example:

        + +
        + Employee employee = employeeByEmail.get(myEmailAddress);
        + +

        The secondary key field for a ONE_TO_MANY relationship must be an array or collection type. To access + the email addresses of an employee, simply access the collection field + directly. For example:

        + +
        + Employee employee = primaryIndex.get(1); // Get the entity by primary key
        + employee.emailAddresses.add(myNewEmail); // Add an email address
        + primaryIndex.putNoReturn(1, employee);   // Update the entity
        + +

        Many-to-Many Relationships

        + +

        In a MANY_TO_MANY relationship, one + or more entities is related to one or more secondary key values. For + example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_MANY)
        +     Set<String> organizations = new HashSet<String>;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + SecondaryIndex<String, Long, Employee> employeeByOrganization =
        +     store.getSecondaryIndex(primaryIndex, String.class, "organizations");
        + +

        With a MANY_TO_MANY relationship, the + secondary key is not required to be unique; in other words, more than one + entity may have the same secondary key value. In this example, more than + one employee may belong to the same organization.

        + +

        The most convenient way to access the employees in a given organization + is by using a sub-index. For example:

        + +
        + EntityIndex<Long, Entity> subIndex = employeeByOrganization.subIndex(myOrg);
        + EntityCursor<Employee> cursor = subIndex.entities();
        + try {
        +     for (Employee entity : cursor) {
        +         // Do something with the entity...
        +     }
        + } finally {
        +     cursor.close();
        + }
        + +

        The secondary key field for a MANY_TO_MANY relationship must be an array or collection type. To access + the organizations of an employee, simply access the collection field + directly. For example:

        + +
        + Employee employee = primaryIndex.get(1); // Get the entity by primary key
        + employee.organizations.remove(myOldOrg); // Remove an organization
        + primaryIndex.putNoReturn(1, employee);   // Update the entity
        + +

        Foreign Key Constraints for Related Entities

        + +

        In all the examples above the secondary key is treated only as a simple + value, such as a String department field. In many cases, that is + sufficient. But in other cases, you may wish to constrain the secondary + keys of one entity class to be valid primary keys of another entity + class. For example, a Department entity may also be defined:

        + +
        + @Entity
        + class Department {
        +
        +     @PrimaryKey
        +     String name;
        +
        +     String missionStatement;
        +
        +     private Department() {}
        + }
        + +

        You may wish to constrain the department field values of the Employee + class in the examples above to be valid primary keys of the Department + entity class. In other words, you may wish to ensure that the department + field of an Employee will always refer to a valid Department entity.

        + +

        You can implement this constraint yourself by validating the department + field before you store an Employee. For example:

        + +
        + PrimaryIndex<String, Department> departmentIndex =
        +     store.getPrimaryIndex(String.class, Department.class);
        +
        + void storeEmployee(Employee employee) throws DatabaseException {
        +     if (departmentIndex.contains(employee.department)) {
        +         primaryIndex.putNoReturn(employee);
        +     } else {
        +         throw new IllegalArgumentException("Department does not exist: " +
        +                                            employee.department);
        +     }
        + }
        + +

        Or, instead you could define the Employee department field as a foreign + key, and this validation will be done for you when you attempt to store the + Employee entity. For example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Department.class)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        + +

        The relatedEntity=Department.class above defines the department + field as a foreign key that refers to a Department entity. Whenever a + Employee entity is stored, its department field value will be checked to + ensure that a Department entity exists with that value as its primary key. + If no such Department entity exists, then a DatabaseException is + thrown, causing the transaction to be aborted (assuming that transactions + are used).

        + +

        This begs the question: What happens when a Department entity is deleted + while one or more Employee entities have department fields that refer to + the deleted department's primary key? If the department were allowed to be + deleted, the foreign key constraint for the Employee department field would + be violated, because the Employee department field would refer to a + department that does not exist.

        + +

        By default, when this situation arises the system does not allow the + department to be deleted. Instead, a DatabaseException is thrown, + causing the transaction to be aborted. In this case, in order to delete a + department, the department field of all Employee entities must first be + updated to refer to a different existing department, or set to null. This + is the responsibility of the application.

        + +

        There are two additional ways of handling deletion of a Department + entity. These alternatives are configured using the SecondaryKey.onRelatedEntityDelete() annotation property. Setting this + property to DeleteAction.NULLIFY causes the Employee department + field to be automatically set to null when the department they refer to is + deleted. This may or may not be desirable, depending on application + policies. For example:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Department.class,
        +                                       onRelatedEntityDelete=NULLIFY)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        + +

        The DeleteAction.CASCADE value, on the other hand, causes the + Employee entities to be automatically deleted when the department they refer + to is deleted. This is probably not desirable in this particular example, + but is useful for parent-child relationships. For example:

        + +
        + @Entity
        + class Order {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     String description;
        +
        +     private Order() {}
        + }
        +
        + @Entity
        + class OrderItem {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Order.class,
        +                                       onRelatedEntityDelete=CASCADE)
        +     long orderId;
        +
        +     String description;
        +
        +     private OrderItem() {}
        + }
        + +

        The OrderItem orderId field refers to its "parent" Order entity. When an + Order entity is deleted, it may be useful to automatically delete its + "child" OrderItem entities.

        + +

        For more information, see SecondaryKey.onRelatedEntityDelete().

        + +

        One-to-Many versus Many-to-One for Related Entities

        + +

        When there is a conceptual Many-to-One relationship such as Employee to + Department as illustrated in the examples above, the relationship may be + implemented either as Many-to-One in the Employee class or as One-to-Many in + the Department class.

        + +

        Here is the Many-to-One approach.

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Department.class)
        +     String department;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + @Entity
        + class Department {
        +
        +     @PrimaryKey
        +     String name;
        +
        +     String missionStatement;
        +
        +     private Department() {}
        + }
        + +

        And here is the One-to-Many approach.

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + @Entity
        + class Department {
        +
        +     @PrimaryKey
        +     String name;
        +
        +     String missionStatement;
        +
        +     @SecondaryKey(relate=ONE_TO_MANY, relatedEntity=Employee.class)
        +     Set<Long> employees = new HashSet<Long>;
        +
        +     private Department() {}
        + }
        + +

        Which approach is best? The Many-to-One approach better handles large + number of entities on the to-Many side of the relationship because it + doesn't store a collection of keys as an entity field. With Many-to-One a + Btree is used to store the collection of keys and the Btree can easily + handle very large numbers of keys. With One-to-Many, each time a related + key is added or removed the entity on the One side of the relationship, + along with the complete collection of related keys, must be updated. + Therefore, if large numbers of keys may be stored per relationship, + Many-to-One is recommended.

        + +

        If the number of entities per relationship is not a concern, then you may + wish to choose the approach that is most natural in your application data + model. For example, if you think of a Department as containing employees + and you wish to modify the Department object each time an employee is added + or removed, then you may wish to store a collection of Employee keys in the + Department object (One-to-Many).

        + +

        Note that if you have a One-to-Many relationship and there is no related + entity, then you don't have a choice -- you have to use One-to-Many because + there is no entity on the to-Many side of the relationship where a + Many-to-One key could be defined. An example is the Employee to email + addresses relationship discussed above:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=ONE_TO_MANY)
        +     Set<String> emailAddresses = new HashSet<String>;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        + +

        For sake of argument imagine that each employee has thousands of email + addresses and employees frequently add and remove email addresses. To + avoid the potential performance problems associated with updating the + Employee entity every time an email address is added or removed, you could + create an EmployeeEmailAddress entity and use a Many-to-One relationship as + shown below:

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + @Entity
        + class EmployeeEmailAddress {
        +
        +     @PrimaryKey
        +     String emailAddress;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Employee.class)
        +     long employeeId;
        +
        +     private EmployeeEmailAddress() {}
        + }
        + +

        Key Placement with Many-to-Many for Related Entities

        + +

        As discussed in the section above, one drawback of a to-Many relationship + (One-to-Many was discussed above and Many-to-Many is discussed here) is that + it requires storing a collection of keys in an entity. Each time a key is + added or removed, the containing entity must be updated. This has potential + performance problems when there are large numbers of entities on the to-Many + side of the relationship, in other words, when there are large numbers of + keys in each secondary key field collection.

        + +

        If you have a Many-to-Many relationship with a reasonably small number of + entities on one side of the relationship and a large number of entities on + the other side, you can avoid the potential performance problems by defining + the secondary key field on the side with a small number of entities.

        + +

        For example, in an Employee-to-Organization relationship, the number of + organizations per employee will normally be reasonably small but the number + of employees per organization may be very large. Therefore, to avoid + potential performance problems, the secondary key field should be defined in + the Employee class as shown below.

        + +
        + @Entity
        + class Employee {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_MANY, relatedEntity=Organization.class)
        +     Set<String> organizations = new HashSet<String>;
        +
        +     String name;
        +
        +     private Employee() {}
        + }
        +
        + @Entity
        + class Organization {
        +
        +     @PrimaryKey
        +     String name;
        +
        +     String description;
        + }
        + +

        If instead a Set<Long> members key had been defined in the + Organization class, this set could potentially have a large number of + elements and performance problems could result.

        + +

        Many-to-Many Versus a Relationship Entity

        + +

        If you have a Many-to-Many relationship with a large number of entities + on both sides of the relationship, you can avoid the potential + performance problems by using a relationship entity. A + relationship entity defines the relationship between two other entities + using two Many-to-One relationships.

        + +

        Imagine a relationship between cars and trucks indicating whenever a + particular truck was passed on the road by a particular car. A given car + may pass a large number of trucks and a given truck may be passed by a large + number of cars. First look at a Many-to-Many relationship between these two + entities:

        + +
        + @Entity
        + class Car {
        +
        +     @PrimaryKey
        +     String licenseNumber;
        +
        +     @SecondaryKey(relate=MANY_TO_MANY, relatedEntity=Truck.class)
        +     Set<String> trucksPassed = new HashSet<String>;
        +
        +     String color;
        +
        +     private Car() {}
        + }
        +
        + @Entity
        + class Truck {
        +
        +     @PrimaryKey
        +     String licenseNumber;
        +
        +     int tons;
        +
        +     private Truck() {}
        + }
        + +

        With the Many-to-Many approach above, the trucksPassed set could + potentially have a large number of elements and performance problems could + result.

        + +

        To apply the relationship entity approach we define a new entity class + named CarPassedTruck representing a single truck passed by a single car. We + remove the secondary key from the Car class and use two secondary keys in + the CarPassedTruck class instead.

        + +
        + @Entity
        + class Car {
        +
        +     @PrimaryKey
        +     String licenseNumber;
        +
        +     String color;
        +
        +     private Car() {}
        + }
        +
        + @Entity
        + class Truck {
        +
        +     @PrimaryKey
        +     String licenseNumber;
        +
        +     int tons;
        +
        +     private Truck() {}
        + }
        +
        + @Entity
        + class CarPassedTruck {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Car.class)
        +     String carLicense;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Truck.class)
        +     String truckLicense;
        +
        +     private CarPassedTruck() {}
        + }
        + +

        The CarPassedTruck entity can be used to access the relationship by car + license or by truck license.

        + +

        You may use the relationship entity approach because of the potential + performance problems mentioned above. Or, you may choose to use this + approach in order to store other information about the relationship. For + example, if for each car that passes a truck you wish to record how much + faster the car was going than the truck, then a relationship entity is the + logical place to store that property. In the example below the + speedDifference property is added to the CarPassedTruck class.

        + +
        + @Entity
        + class CarPassedTruck {
        +
        +     @PrimaryKey
        +     long id;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Car.class)
        +     String carLicense;
        +
        +     @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Truck.class)
        +     String truckLicense;
        +
        +     int speedDifference;
        +
        +     private CarPassedTruck() {}
        + }
        + +

        Be aware that the relationship entity approach adds overhead compared to + Many-to-Many. There is one additional entity and one additional secondary + key. These factors should be weighed against its advantages and the + relevant application access patterns should be considered.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleancontains(K key) +
          Checks for existence of a key in this index.
          +
          booleancontains(Transaction txn, + K key, + LockMode lockMode) +
          Checks for existence of a key in this index.
          +
          longcount() +
          Returns a non-transactional count of the entities in this index.
          +
          longcount(long memoryLimit) +
          Returns a non-transactional count of the entities in this index.
          +
          booleandelete(K key) +
          Deletes all entities with a given index key.
          +
          booleandelete(Transaction txn, + K key) +
          Deletes all entities with a given index key.
          +
          OperationResultdelete(Transaction txn, + K key, + WriteOptions options) +
          Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
          +
          EntityCursor<E>entities() +
          Opens a cursor for traversing all entities in this index.
          +
          EntityCursor<E>entities(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
          Opens a cursor for traversing entities in a key range.
          +
          EntityCursor<E>entities(Transaction txn, + CursorConfig config) +
          Opens a cursor for traversing all entities in this index.
          +
          EntityCursor<E>entities(Transaction txn, + K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive, + CursorConfig config) +
          Opens a cursor for traversing entities in a key range.
          +
          Eget(SK key) +
          Gets an entity via a key of this index.
          +
          EntityResult<E>get(Transaction txn, + SK key, + Get getType, + ReadOptions options) +
          Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
          +
          Eget(Transaction txn, + SK key, + LockMode lockMode) +
          Gets an entity via a key of this index.
          +
          SecondaryDatabasegetDatabase() +
          Returns the underlying secondary database for this index.
          +
          EntryBinding<SK>getKeyBinding() +
          Returns the secondary key binding for the index.
          +
          java.lang.Class<SK>getKeyClass() +
          Returns the secondary key class for this index.
          +
          DatabasegetKeysDatabase() +
          Returns the underlying secondary database that is not associated with + the primary database and is used for the keysIndex.
          +
          PrimaryIndex<PK,E>getPrimaryIndex() +
          Returns the primary index associated with this secondary index.
          +
          EntityCursor<K>keys() +
          Opens a cursor for traversing all keys in this index.
          +
          EntityCursor<K>keys(K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive) +
          Opens a cursor for traversing keys in a key range.
          +
          EntityCursor<K>keys(Transaction txn, + CursorConfig config) +
          Opens a cursor for traversing all keys in this index.
          +
          EntityCursor<K>keys(Transaction txn, + K fromKey, + boolean fromInclusive, + K toKey, + boolean toInclusive, + CursorConfig config) +
          Opens a cursor for traversing keys in a key range.
          +
          EntityIndex<SK,PK>keysIndex() +
          Returns a read-only keys index that maps secondary key to primary key.
          +
          java.util.Map<SK,E>map() +
          Returns a standard Java map based on this entity index.
          +
          java.util.SortedMap<SK,E>sortedMap() +
          Returns a standard Java sorted map based on this entity index.
          +
          EntityIndex<PK,E>subIndex(SK key) +
          Returns an index that maps primary key to entity for the subset of + entities having a given secondary key (duplicates).
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            SecondaryIndex

            +
            public SecondaryIndex(SecondaryDatabase database,
            +                      Database keysDatabase,
            +                      PrimaryIndex<PK,E> primaryIndex,
            +                      java.lang.Class<SK> secondaryKeyClass,
            +                      EntryBinding<SK> secondaryKeyBinding)
            +               throws DatabaseException
            +
            Creates a secondary index without using an EntityStore. + When using an EntityStore, call getSecondaryIndex instead. + +

            This constructor is not normally needed and is provided for + applications that wish to use custom bindings along with the Direct + Persistence Layer. Normally, getSecondaryIndex is used instead.

            +
            +
            Parameters:
            +
            database - the secondary database used for all access other than + via a keysIndex.
            +
            keysDatabase - another handle on the secondary database, opened + without association to the primary, and used only for access via a + keysIndex. If this argument is null and the keysIndex + method is called, then the keys database will be opened automatically; + however, the user is then responsible for closing the keys database. To + get the keys database in order to close it, call getKeysDatabase().
            +
            primaryIndex - the primary index associated with this secondary + index.
            +
            secondaryKeyClass - the class of the secondary key.
            +
            secondaryKeyBinding - the binding to be used for secondary keys.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDatabase

            +
            public SecondaryDatabase getDatabase()
            +
            Returns the underlying secondary database for this index.
            +
            +
            Specified by:
            +
            getDatabase in interface EntityIndex<SK,E>
            +
            Returns:
            +
            the secondary database.
            +
            +
          • +
          + + + +
            +
          • +

            getKeysDatabase

            +
            public Database getKeysDatabase()
            +
            Returns the underlying secondary database that is not associated with + the primary database and is used for the keysIndex.
            +
            +
            Returns:
            +
            the keys database.
            +
            +
          • +
          + + + +
            +
          • +

            getPrimaryIndex

            +
            public PrimaryIndex<PK,E> getPrimaryIndex()
            +
            Returns the primary index associated with this secondary index.
            +
            +
            Returns:
            +
            the primary index.
            +
            +
          • +
          + + + +
            +
          • +

            getKeyClass

            +
            public java.lang.Class<SK> getKeyClass()
            +
            Returns the secondary key class for this index.
            +
            +
            Returns:
            +
            the class.
            +
            +
          • +
          + + + +
            +
          • +

            getKeyBinding

            +
            public EntryBinding<SK> getKeyBinding()
            +
            Returns the secondary key binding for the index.
            +
            +
            Returns:
            +
            the key binding.
            +
            +
          • +
          + + + +
            +
          • +

            keysIndex

            +
            public EntityIndex<SK,PK> keysIndex()
            +                             throws DatabaseException
            +
            Returns a read-only keys index that maps secondary key to primary key. + When accessing the keys index, the primary key is returned rather than + the entity. When only the primary key is needed and not the entire + entity, using the keys index is less expensive than using the secondary + index because the primary index does not have to be accessed. + +

            Note the following in the unusual case that you are not + using an EntityStore: This method will open the keys + database, a second database handle for the secondary database, if it is + not already open. In this case, if you are not using an + EntityStore, then you are responsible for closing the + database returned by getKeysDatabase() before closing the + environment. If you are using an EntityStore, the + keys database will be closed automatically by EntityStore.close().

            +
            +
            Returns:
            +
            the keys index.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            subIndex

            +
            public EntityIndex<PK,E> subIndex(SK key)
            +                           throws DatabaseException
            +
            Returns an index that maps primary key to entity for the subset of + entities having a given secondary key (duplicates). A sub-index is + convenient when you are interested in working with the subset of + entities having a particular secondary key value. + +

            When using a MANY_TO_ONE or MANY_TO_MANY secondary key, the sub-index + represents the left (MANY) side of a relationship.

            +
            +
            Parameters:
            +
            key - the secondary key that identifies the entities in the + sub-index.
            +
            Returns:
            +
            the sub-index.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + + + + + + + + + + + +
            +
          • +

            get

            +
            public EntityResult<E> get(Transaction txn,
            +                           SK key,
            +                           Get getType,
            +                           ReadOptions options)
            +                    throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
            +
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, or null + if the operation should not be transaction protected.
            +
            key - the key to search for.
            +
            getType - must be Get.SEARCH.
            +
            options - the ReadOptions, or null to use default options.
            +
            Returns:
            +
            the EntityResult, including the value mapped to the given key, + or null if the key is not present in the index.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            map

            +
            public java.util.Map<SK,E> map()
            +
            Description copied from interface: EntityIndex
            +
            Returns a standard Java map based on this entity index. The StoredMap returned is defined by the Collections API. Stored collections conform + to the standard Java collections framework interface.
            +
            +
            Returns:
            +
            the map.
            +
            +
          • +
          + + + +
            +
          • +

            sortedMap

            +
            public java.util.SortedMap<SK,E> sortedMap()
            +
            Description copied from interface: EntityIndex
            +
            Returns a standard Java sorted map based on this entity index. The + StoredSortedMap returned is defined by the Collections API. Stored collections conform + to the standard Java collections framework interface.
            +
            +
            Returns:
            +
            the map.
            +
            +
          • +
          + + + + + + + + + + + + + + + +
            +
          • +

            count

            +
            public long count()
            +           throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Returns a non-transactional count of the entities in this index. + + + +

            This operation is faster than obtaining a count by scanning the index + manually, and will not perturb the current contents of the cache. + However, the count is not guaranteed to be accurate if there are + concurrent updates. Note that this method does scan a significant + portion of the index and should be considered a fairly expensive + operation.

            + +

            This operation will disable deletion of log files by the JE log + cleaner during its execution and will consume a certain amount of + memory (but without affecting the memory that is available for the + JE cache). To avoid excessive memory consumption (and a potential + OutOfMemoryError) this method places an internal limit on + its memory consumption. If this limit is reached, the method will + still work properly, but its performance will degrade. To specify + a different memory limit than the one used by this method, use the + EntityIndex.count(long memoryLimit) method.

            + +
            +
            +
            Specified by:
            +
            count in interface EntityIndex<K,E>
            +
            Returns:
            +
            the number of entities in this index. + +
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs. +
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            count

            +
            public long count(long memoryLimit)
            +           throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Returns a non-transactional count of the entities in this index. + +

            This operation is faster than obtaining a count by scanning the index + manually, and will not perturb the current contents of the cache. + However, the count is not guaranteed to be accurate if there are + concurrent updates. Note that this method does scan a significant + portion of the index and should be considered a fairly expensive + operation.

            + +

            This operation will disable deletion of log files by the JE log + cleaner during its execution and will consume a certain amount of + memory (but without affecting the memory that is available for the + JE cache). To avoid excessive memory consumption (and a potential + OutOfMemoryError) this method takes as input an upper bound + on the memory it may consume. If this limit is reached, the method + will still work properly, but its performance will degrade.

            +
            +
            Specified by:
            +
            count in interface EntityIndex<K,E>
            +
            Returns:
            +
            the number of entities in this index.
            +
            Throws:
            +
            OperationFailureException - if one of the Read Operation + Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + + + + + + + + + + + + + +
            +
          • +

            delete

            +
            public OperationResult delete(Transaction txn,
            +                              K key,
            +                              WriteOptions options)
            +                       throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
            +
            +
            Specified by:
            +
            delete in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect this operation, null to use + auto-commit, or null if the store is non-transactional.
            +
            key - the key to search for.
            +
            options - the WriteOptions, or null to use default options.
            +
            Returns:
            +
            the OperationResult if any entities were deleted, else null. If
            +
            Throws:
            +
            OperationFailureException - if one of the Write + Operation Failures occurs.
            +
            EnvironmentFailureException - if an unexpected, internal or + environment-wide failure occurs.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys()
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all keys in this index. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys(Transaction txn,
            +                            CursorConfig config)
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all keys in this index. + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities()
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all entities in this index. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities(Transaction txn,
            +                                CursorConfig config)
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing all entities in this index.
            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys(K fromKey,
            +                            boolean fromInclusive,
            +                            K toKey,
            +                            boolean toInclusive)
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing keys in a key range. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            + + +

            Note that READ_UNCOMMITTED can be used with a key cursor to + reduce I/O, potentially providing significant performance benefits. See + Key Cursor Optimization with + READ_UNCOMMITTED

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Parameters:
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            keys

            +
            public EntityCursor<K> keys(Transaction txn,
            +                            K fromKey,
            +                            boolean fromInclusive,
            +                            K toKey,
            +                            boolean toInclusive,
            +                            CursorConfig config)
            +                     throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing keys in a key range. + + +

            Key Cursor Optimization with + READ_UNCOMMITTED

            + +

            Using a key cursor potentially has a large performance benefit when + the READ_UNCOMMITTED isolation mode is used. In this case, if + the record data is not in the JE cache, it will not be read from disk. + The performance benefit is potentially large because random access disk + reads may be reduced. Examples are:

            +
              +
            • Scanning all records in key order, when the entity is not needed and + READ_UNCOMMITTED isolation is acceptable.
            • +
            • Skipping over records quickly to perform approximate pagination with + READ_UNCOMMITTED isolation.
            • +
            + +

            For other isolation modes (READ_COMMITTED, REPEATABLE_READ and SERIALIZABLE), the performance benefit of a + key cursor is not as significant. In this case, the data item must be + read into the JE cache if it is not already present, in order to lock + the record. The only performance benefit is that the data will not be + copied from the JE cache to the application's entry parameter, and will + not be unmarshalled into an entity object.

            + +

            For information on specifying isolation modes, see LockMode, + CursorConfig and TransactionConfig.

            +
            +
            +
            Specified by:
            +
            keys in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities(K fromKey,
            +                                boolean fromInclusive,
            +                                K toKey,
            +                                boolean toInclusive)
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing entities in a key range. + +

            The operations performed with the cursor will not be transaction + protected, and CursorConfig.DEFAULT is used implicitly. If the + store is transactional, the cursor may not be used to update or delete + entities.

            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Parameters:
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + + + +
            +
          • +

            entities

            +
            public EntityCursor<E> entities(Transaction txn,
            +                                K fromKey,
            +                                boolean fromInclusive,
            +                                K toKey,
            +                                boolean toInclusive,
            +                                CursorConfig config)
            +                         throws DatabaseException
            +
            Description copied from interface: EntityIndex
            +
            Opens a cursor for traversing entities in a key range.
            +
            +
            Specified by:
            +
            entities in interface EntityIndex<K,E>
            +
            Parameters:
            +
            txn - the transaction used to protect all operations performed with + the cursor, or null if the operations should not be transaction + protected. If the store is non-transactional, null must be specified. + For a transactional store the transaction is optional for read-only + access and required for read-write access.
            +
            fromKey - is the lower bound of the key range, or null if the range + has no lower bound.
            +
            fromInclusive - is true if keys greater than or equal to fromKey + should be included in the key range, or false if only keys greater than + fromKey should be included.
            +
            toKey - is the upper bound of the key range, or null if the range + has no upper bound.
            +
            toInclusive - is true if keys less than or equal to toKey should be + included in the key range, or false if only keys less than toKey should + be included.
            +
            config - the cursor configuration that determines the default lock + mode used for all cursor operations, or null to implicitly use CursorConfig.DEFAULT.
            +
            Returns:
            +
            the cursor.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/StoreConfig.html b/docs/java/com/sleepycat/persist/StoreConfig.html new file mode 100644 index 0000000..fe4dd17 --- /dev/null +++ b/docs/java/com/sleepycat/persist/StoreConfig.html @@ -0,0 +1,889 @@ + + + + + +StoreConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class StoreConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.StoreConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class StoreConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Configuration properties used with an EntityStore or RawStore. + +

        StoreConfig objects are thread-safe. Multiple threads may safely + call the methods of a shared StoreConfig object.

        + +

        See the package + summary example for an example of using a StoreConfig.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static StoreConfigDEFAULT +
          The default store configuration containing properties as if the + configuration were constructed and not modified.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          StoreConfig() +
          Creates an entity store configuration object with default properties.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT

            +
            public static final StoreConfig DEFAULT
            +
            The default store configuration containing properties as if the + configuration were constructed and not modified.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            StoreConfig

            +
            public StoreConfig()
            +
            Creates an entity store configuration object with default properties.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            cloneConfig

            +
            public StoreConfig cloneConfig()
            +
            Deprecated. As of JE 4.0.13, replaced by clone().
            +
            Returns a shallow copy of the configuration.
            +
            +
            Returns:
            +
            the clone.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public StoreConfig clone()
            +
            Returns a shallow copy of the configuration.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            setAllowCreate

            +
            public StoreConfig setAllowCreate(boolean allowCreate)
            +
            Specifies whether creation of a new store is allowed. By default this + property is false. + +

            If this property is false and the internal store metadata database + does not exist, DatabaseException will be thrown when the store + is opened.

            +
            +
            Parameters:
            +
            allowCreate - whether creation of a new store is allowed.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getAllowCreate

            +
            public boolean getAllowCreate()
            +
            Returns whether creation of a new store is allowed.
            +
            +
            Returns:
            +
            whether creation of a new store is allowed.
            +
            +
          • +
          + + + +
            +
          • +

            setExclusiveCreate

            +
            public StoreConfig setExclusiveCreate(boolean exclusiveCreate)
            +
            Specifies whether opening an existing store is prohibited. By default + this property is false. + +

            If this property is true and the internal store metadata database + already exists, DatabaseException will be thrown when the store + is opened.

            +
            +
            Parameters:
            +
            exclusiveCreate - whether opening an existing store is prohibited.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getExclusiveCreate

            +
            public boolean getExclusiveCreate()
            +
            Returns whether opening an existing store is prohibited.
            +
            +
            Returns:
            +
            whether opening an existing store is prohibited.
            +
            +
          • +
          + + + +
            +
          • +

            setTransactional

            +
            public StoreConfig setTransactional(boolean transactional)
            +
            Sets the transactional configuration property. By default this property + is false. + +

            This property is true to open all store indices for transactional + access. True may not be specified if the environment is not also + transactional.

            +
            +
            Parameters:
            +
            transactional - whether the store is transactional.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getTransactional

            +
            public boolean getTransactional()
            +
            Returns the transactional configuration property.
            +
            +
            Returns:
            +
            whether the store is transactional.
            +
            +
          • +
          + + + +
            +
          • +

            setReadOnly

            +
            public StoreConfig setReadOnly(boolean readOnly)
            +
            Sets the read-only configuration property. By default this property is + false. + +

            This property is true to open all store indices for read-only access, + or false to open them for read-write access. False may not be specified + if the environment is read-only.

            +
            +
            Parameters:
            +
            readOnly - whether the store is read-only.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getReadOnly

            +
            public boolean getReadOnly()
            +
            Returns the read-only configuration property.
            +
            +
            Returns:
            +
            whether the store is read-only.
            +
            +
          • +
          + + + +
            +
          • +

            setReplicated

            +
            public StoreConfig setReplicated(boolean replicated)
            +
            Configures a store to be replicated or non-replicated, in a replicated + Environment. By default this property is true, meaning that by default + a store is replicated in a replicated Environment. +

            + In a non-replicated Environment, this property is ignored. All stores + are non-replicated in a non-replicated Environment.

            +
            +
            Parameters:
            +
            replicated - whether the store is replicated.
            +
            Returns:
            +
            'this'.
            +
            See Also:
            +
            Non-replicated + Databases in a Replicated Environment
            +
            +
          • +
          + + + +
            +
          • +

            getReplicated

            +
            public boolean getReplicated()
            +
            Returns the replicated property for the store. +

            + This method returns true by default. However, in a non-replicated + Environment, this property is ignored. All stores are non-replicated + in a non-replicated Environment.

            +
            +
            Returns:
            +
            whether the store is replicated.
            +
            See Also:
            +
            setReplicated(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            setDeferredWrite

            +
            public StoreConfig setDeferredWrite(boolean deferredWrite)
            +
            Sets the deferred-write configuration property. By default this + property is false. + +

            This property is true to open all store index databases for + deferred-write access. True may not be specified if the store is + transactional.

            + +

            Deferred write stores avoid disk I/O and are not guaranteed to be + persistent until EntityStore.sync() or Environment.sync() is + called or the store is closed normally. This mode is particularly geared + toward stores that frequently modify and delete data records. See the + Getting Started Guide, Database chapter for a full description of the + mode.

            +
            +
            Parameters:
            +
            deferredWrite - whether the store is deferred-write.
            +
            Returns:
            +
            'this'.
            +
            See Also:
            +
            setTransactional(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            getDeferredWrite

            +
            public boolean getDeferredWrite()
            +
            Returns the deferred-write configuration property.
            +
            +
            Returns:
            +
            whether the store is deferred-write.
            +
            +
          • +
          + + + +
            +
          • +

            setTemporary

            +
            public StoreConfig setTemporary(boolean temporary)
            +
            Sets the temporary configuration property. By default this property is + false. + +

            This property is true to open all store databases as temporary + databases. True may not be specified if the store is transactional.

            + +

            Temporary stores avoid disk I/O and are not persistent -- they are + deleted when the store is closed or after a crash. This mode is + particularly geared toward in-memory stores. See the Getting Started + Guide, Database chapter for a full description of the mode.

            +
            +
            Parameters:
            +
            temporary - whether the store is temporary.
            +
            Returns:
            +
            'this'.
            +
            See Also:
            +
            setTransactional(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            getTemporary

            +
            public boolean getTemporary()
            +
            Returns the temporary configuration property.
            +
            +
            Returns:
            +
            whether the store is temporary.
            +
            +
          • +
          + + + +
            +
          • +

            setSecondaryBulkLoad

            +
            public StoreConfig setSecondaryBulkLoad(boolean secondaryBulkLoad)
            +
            Sets the bulk-load-secondaries configuration property. By default this + property is false. + +

            This property is true to cause the initial creation of secondary + indices to be performed as a bulk load. If this property is true and + EntityStore.getSecondaryIndex has + never been called for a secondary index, that secondary index will not + be created or written as records are written to the primary index. In + addition, if that secondary index defines a foreign key constraint, the + constraint will not be enforced.

            + +

            The secondary index will be populated later when the getSecondaryIndex method is called for the first time for that index, + or when the store is closed and re-opened with this property set to + false and the primary index is obtained. In either case, the secondary + index is populated by reading through the entire primary index and + adding records to the secondary index as needed. While populating the + secondary, foreign key constraints will be enforced and an exception is + thrown if a constraint is violated.

            + +

            When loading a primary index along with secondary indexes from a + large input data set, configuring a bulk load of the secondary indexes + is sometimes more performant than updating the secondary indexes each + time the primary index is updated. The absence of foreign key + constraints during the load also provides more flexibility.

            +
            +
            Parameters:
            +
            secondaryBulkLoad - whether bulk-load-secondaries is used.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryBulkLoad

            +
            public boolean getSecondaryBulkLoad()
            +
            Returns the bulk-load-secondaries configuration property.
            +
            +
            Returns:
            +
            whether bulk-load-secondaries is used.
            +
            +
          • +
          + + + +
            +
          • +

            setModel

            +
            public StoreConfig setModel(EntityModel model)
            +
            Sets the entity model that defines entity classes and index keys. + +

            If null is specified or this method is not called, an AnnotationModel instance is used by default.

            +
            +
            Parameters:
            +
            model - the EntityModel.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getModel

            +
            public EntityModel getModel()
            +
            Returns the entity model that defines entity classes and index keys.
            +
            +
            Returns:
            +
            the EntityModel.
            +
            +
          • +
          + + + +
            +
          • +

            setMutations

            +
            public StoreConfig setMutations(Mutations mutations)
            +
            Configures mutations for performing lazy evolution of stored instances. + Existing mutations for this store are not cleared, so the mutations + required are only those changes that have been made since the store was + last opened. Some new mutations may override existing specifications, + and some may be supplemental. + +

            If null is specified and the store already exists, the previously + specified mutations are used. The mutations are stored persistently in + serialized form.

            + +

            Mutations must be available to handle all changes to classes that are + incompatible with the class definitions known to this store. See Mutations and Class Evolution for + more information.

            + +

            If an incompatible class change has been made and mutations are not + available for handling the change, IncompatibleClassException + will be thrown when creating an EntityStore.

            +
            +
            Parameters:
            +
            mutations - the Mutations.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getMutations

            +
            public Mutations getMutations()
            +
            Returns the configured mutations for performing lazy evolution of stored + instances.
            +
            +
            Returns:
            +
            the Mutations.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/StoreConfigBeanInfo.html b/docs/java/com/sleepycat/persist/StoreConfigBeanInfo.html new file mode 100644 index 0000000..5ead0b9 --- /dev/null +++ b/docs/java/com/sleepycat/persist/StoreConfigBeanInfo.html @@ -0,0 +1,351 @@ + + + + + +StoreConfigBeanInfo (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class StoreConfigBeanInfo

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.beans.BeanInfo
        +
        +
        +
        +
        public class StoreConfigBeanInfo
        +extends ConfigBeanInfoBase
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            StoreConfigBeanInfo

            +
            public StoreConfigBeanInfo()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getBeanDescriptor

            +
            public java.beans.BeanDescriptor getBeanDescriptor()
            +
            +
            Specified by:
            +
            getBeanDescriptor in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getBeanDescriptor in class java.beans.SimpleBeanInfo
            +
            +
          • +
          + + + +
            +
          • +

            getPropertyDescriptors

            +
            public java.beans.PropertyDescriptor[] getPropertyDescriptors()
            +
            +
            Specified by:
            +
            getPropertyDescriptors in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getPropertyDescriptors in class java.beans.SimpleBeanInfo
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/StoreExistsException.html b/docs/java/com/sleepycat/persist/StoreExistsException.html new file mode 100644 index 0000000..d41eea6 --- /dev/null +++ b/docs/java/com/sleepycat/persist/StoreExistsException.html @@ -0,0 +1,253 @@ + + + + + +StoreExistsException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class StoreExistsException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class StoreExistsException
        +extends OperationFailureException
        +
        Thrown by the EntityStore constructor when the ExclusiveCreate configuration parameter is + true and the store's internal catalog database already exists.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/StoreNotFoundException.html b/docs/java/com/sleepycat/persist/StoreNotFoundException.html new file mode 100644 index 0000000..36196b9 --- /dev/null +++ b/docs/java/com/sleepycat/persist/StoreNotFoundException.html @@ -0,0 +1,253 @@ + + + + + +StoreNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist
      +

      Class StoreNotFoundException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class StoreNotFoundException
        +extends OperationFailureException
        +
        Thrown by the EntityStore constructor when the AllowCreate configuration parameter is false and + the store's internal catalog database does not exist.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/EntityCursor.html b/docs/java/com/sleepycat/persist/class-use/EntityCursor.html new file mode 100644 index 0000000..cc264b3 --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/EntityCursor.html @@ -0,0 +1,240 @@ + + + + + +Uses of Interface com.sleepycat.persist.EntityCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.EntityCursor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/EntityIndex.html b/docs/java/com/sleepycat/persist/class-use/EntityIndex.html new file mode 100644 index 0000000..0d5cc10 --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/EntityIndex.html @@ -0,0 +1,202 @@ + + + + + +Uses of Interface com.sleepycat.persist.EntityIndex (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.EntityIndex

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/EntityJoin.html b/docs/java/com/sleepycat/persist/class-use/EntityJoin.html new file mode 100644 index 0000000..3767cae --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/EntityJoin.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.EntityJoin (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.EntityJoin

      +
      +
      No usage of com.sleepycat.persist.EntityJoin
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/EntityResult.html b/docs/java/com/sleepycat/persist/class-use/EntityResult.html new file mode 100644 index 0000000..2d62f5d --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/EntityResult.html @@ -0,0 +1,200 @@ + + + + + +Uses of Class com.sleepycat.persist.EntityResult (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.EntityResult

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/EntityStore.html b/docs/java/com/sleepycat/persist/class-use/EntityStore.html new file mode 100644 index 0000000..0402ed3 --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/EntityStore.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.EntityStore (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.EntityStore

      +
      +
      No usage of com.sleepycat.persist.EntityStore
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/ForwardCursor.html b/docs/java/com/sleepycat/persist/class-use/ForwardCursor.html new file mode 100644 index 0000000..35eba5f --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/ForwardCursor.html @@ -0,0 +1,212 @@ + + + + + +Uses of Interface com.sleepycat.persist.ForwardCursor (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.ForwardCursor

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/IndexNotAvailableException.html b/docs/java/com/sleepycat/persist/class-use/IndexNotAvailableException.html new file mode 100644 index 0000000..11d595a --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/IndexNotAvailableException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.IndexNotAvailableException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.IndexNotAvailableException

      +
      +
      No usage of com.sleepycat.persist.IndexNotAvailableException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/PrimaryIndex.html b/docs/java/com/sleepycat/persist/class-use/PrimaryIndex.html new file mode 100644 index 0000000..002756f --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/PrimaryIndex.html @@ -0,0 +1,258 @@ + + + + + +Uses of Class com.sleepycat.persist.PrimaryIndex (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.PrimaryIndex

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/SecondaryIndex.html b/docs/java/com/sleepycat/persist/class-use/SecondaryIndex.html new file mode 100644 index 0000000..7f30b66 --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/SecondaryIndex.html @@ -0,0 +1,231 @@ + + + + + +Uses of Class com.sleepycat.persist.SecondaryIndex (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.SecondaryIndex

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/StoreConfig.html b/docs/java/com/sleepycat/persist/class-use/StoreConfig.html new file mode 100644 index 0000000..0306d4c --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/StoreConfig.html @@ -0,0 +1,321 @@ + + + + + +Uses of Class com.sleepycat.persist.StoreConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.StoreConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/StoreConfigBeanInfo.html b/docs/java/com/sleepycat/persist/class-use/StoreConfigBeanInfo.html new file mode 100644 index 0000000..799f85b --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/StoreConfigBeanInfo.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.StoreConfigBeanInfo (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.StoreConfigBeanInfo

      +
      +
      No usage of com.sleepycat.persist.StoreConfigBeanInfo
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/StoreExistsException.html b/docs/java/com/sleepycat/persist/class-use/StoreExistsException.html new file mode 100644 index 0000000..95d203a --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/StoreExistsException.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.persist.StoreExistsException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.StoreExistsException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/class-use/StoreNotFoundException.html b/docs/java/com/sleepycat/persist/class-use/StoreNotFoundException.html new file mode 100644 index 0000000..85a303e --- /dev/null +++ b/docs/java/com/sleepycat/persist/class-use/StoreNotFoundException.html @@ -0,0 +1,200 @@ + + + + + +Uses of Class com.sleepycat.persist.StoreNotFoundException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.StoreNotFoundException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/Conversion.html b/docs/java/com/sleepycat/persist/evolve/Conversion.html new file mode 100644 index 0000000..f9b0ca2 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/Conversion.html @@ -0,0 +1,682 @@ + + + + + +Conversion (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Interface Conversion

      +
      +
      +
      +
        +
      • +
        +
        All Superinterfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public interface Conversion
        +extends java.io.Serializable
        +
        Converts an old version of an object value to conform to the current class + or field definition. + +

        The Conversion interface is implemented by the user. A + Conversion instance is passed to the Converter.Converter(java.lang.String, int, java.lang.String, com.sleepycat.persist.evolve.Conversion) + constructor.

        + +

        The Conversion interface extends Serializable and the + Conversion instance is serialized for storage using standard Java + serialization. Normally, the Conversion class should only have + transient fields that are initialized in the initialize(com.sleepycat.persist.model.EntityModel) method. + While non-transient fields are allowed, care must be taken to only include + fields that are serializable and will not pull in large amounts of data.

        + +

        When a class conversion is specified, two special considerations + apply:

        +
          +
        1. A class conversion is only applied when to instances of that class. The + conversion will not be applied when the class when it appears as a + superclass of the instance's class. In this case, a conversion for the + instance's class must also be specified.
        2. +
        3. Although field renaming (as well as all other changes) is handled by the + conversion method, a field Renamer is still needed when a secondary key + field is renamed and field Deleter is still needed when a secondary key + field is deleted. This is necessary for evolution of the metadata; + specifically, if the key name changes the database must be renamed and if + the key field is deleted the secondary database must be deleted.
        4. +
        + +

        The Conversion class must implement the standard equals method. + See equals(java.lang.Object) for more information.

        + +

        Conversions of simple types are generally simple. For example, a String field that contains only integer values can be easily converted to + an int field:

        +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Persistent
        +  class Address {
        +      String zipCode;
        +      ...
        +  }
        +
        +  // The new class.  A new version number must be assigned.
        +  //
        +  @Persistent(version=1)
        +  class Address {
        +      int zipCode;
        +      ...
        +  }
        +
        +  // The conversion class.
        +  //
        +  class MyConversion1 implements Conversion {
        +
        +      public void initialize(EntityModel model) {
        +          // No initialization needed.
        +      }
        +
        +      public Object convert(Object fromValue) {
        +          return Integer.valueOf((String) fromValue);
        +      }
        +
        +      @Override
        +      public boolean equals(Object o) {
        +          return o instanceof MyConversion1;
        +      }
        +  }
        +
        +  // Create a field converter mutation.
        +  //
        +  Converter converter = new Converter(Address.class.getName(), 0,
        +                                      "zipCode", new MyConversion1());
        +
        +  // Configure the converter as described here.
        + +

        A conversion may perform arbitrary transformations on an object. For + example, a conversion may transform a single String address field into an + Address object containing four fields for street, city, state and zip + code.

        +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Entity
        +  class Person {
        +      String address;
        +      ...
        +  }
        +
        +  // The new class.  A new version number must be assigned.
        +  //
        +  @Entity(version=1)
        +  class Person {
        +      Address address;
        +      ...
        +  }
        +
        +  // The new address class.
        +  //
        +  @Persistent
        +  class Address {
        +      String street;
        +      String city;
        +      String state;
        +      int zipCode;
        +      ...
        +  }
        +
        +  class MyConversion2 implements Conversion {
        +      private transient RawType addressType;
        +
        +      public void initialize(EntityModel model) {
        +          addressType = model.getRawType(Address.class.getName());
        +      }
        +
        +      public Object convert(Object fromValue) {
        +
        +          // Parse the old address and populate the new address fields
        +          //
        +          String oldAddress = (String) fromValue;
        +          Map<String, Object> addressValues = new HashMap<String, Object>();
        +          addressValues.put("street", parseStreet(oldAddress));
        +          addressValues.put("city", parseCity(oldAddress));
        +          addressValues.put("state", parseState(oldAddress));
        +          addressValues.put("zipCode", parseZipCode(oldAddress));
        +
        +          // Return new raw Address object
        +          //
        +          return new RawObject(addressType, addressValues, null);
        +      }
        +
        +      @Override
        +      public boolean equals(Object o) {
        +          return o instanceof MyConversion2;
        +      }
        +
        +      private String parseStreet(String oldAddress) { ... }
        +      private String parseCity(String oldAddress) { ... }
        +      private String parseState(String oldAddress) { ... }
        +      private Integer parseZipCode(String oldAddress) { ... }
        +  }
        +
        +  // Create a field converter mutation.
        +  //
        +  Converter converter = new Converter(Person.class.getName(), 0,
        +                                      "address", new MyConversion2());
        +
        +  // Configure the converter as described here.
        + +

        Note that when a conversion returns a RawObject, it must return + it with a RawType that is current as defined by the current class + definitions. The proper types can be obtained from the EntityModel + in the conversion's initialize method.

        + +

        A variation on the example above is where several fields in a class + (street, city, state and zipCode) are converted to a single field (address). + In this case a class converter rather than a field converter is used.

        + +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Entity
        +  class Person {
        +      String street;
        +      String city;
        +      String state;
        +      int zipCode;
        +      ...
        +  }
        +
        +  // The new class.  A new version number must be assigned.
        +  //
        +  @Entity(version=1)
        +  class Person {
        +      Address address;
        +      ...
        +  }
        +
        +  // The new address class.
        +  //
        +  @Persistent
        +  class Address {
        +      String street;
        +      String city;
        +      String state;
        +      int zipCode;
        +      ...
        +  }
        +
        +  class MyConversion3 implements Conversion {
        +      private transient RawType newPersonType;
        +      private transient RawType addressType;
        +
        +      public void initialize(EntityModel model) {
        +          newPersonType = model.getRawType(Person.class.getName());
        +          addressType = model.getRawType(Address.class.getName());
        +      }
        +
        +      public Object convert(Object fromValue) {
        +
        +          // Get field value maps for old and new objects.
        +          //
        +          RawObject person = (RawObject) fromValue;
        +          Map<String, Object> personValues = person.getValues();
        +          Map<String, Object> addressValues = new HashMap<String, Object>();
        +          RawObject address = new RawObject(addressType, addressValues, null);
        +
        +          // Remove the old address fields and insert the new one.
        +          //
        +          addressValues.put("street", personValues.remove("street"));
        +          addressValues.put("city", personValues.remove("city"));
        +          addressValues.put("state", personValues.remove("state"));
        +          addressValues.put("zipCode", personValues.remove("zipCode"));
        +          personValues.put("address", address);
        +
        +          return new RawObject(newPersonType, personValues, person.getSuper());
        +      }
        +
        +      @Override
        +      public boolean equals(Object o) {
        +          return o instanceof MyConversion3;
        +      }
        +  }
        +
        +  // Create a class converter mutation.
        +  //
        +  Converter converter = new Converter(Person.class.getName(), 0,
        +                                      new MyConversion3());
        +
        +  // Configure the converter as described here.
        + + +

        A conversion can also handle changes to class hierarchies. For example, + if a "name" field originally declared in class A is moved to its superclass + B, a conversion can move the field value accordingly:

        + +
        +  // The old classes.  Version 0 is implied.
        +  //
        +  @Persistent
        +  class A extends B {
        +      String name;
        +      ...
        +  }
        +  @Persistent
        +  abstract class B {
        +      ...
        +  }
        +
        +  // The new classes.  A new version number must be assigned.
        +  //
        +  @Persistent(version=1)
        +  class A extends B {
        +      ...
        +  }
        +  @Persistent(version=1)
        +  abstract class B {
        +      String name;
        +      ...
        +  }
        +
        +  class MyConversion4 implements Conversion {
        +      private transient RawType newAType;
        +      private transient RawType newBType;
        +
        +      public void initialize(EntityModel model) {
        +          newAType = model.getRawType(A.class.getName());
        +          newBType = model.getRawType(B.class.getName());
        +      }
        +
        +      public Object convert(Object fromValue) {
        +          RawObject oldA = (RawObject) fromValue;
        +          RawObject oldB = oldA.getSuper();
        +          Map<String, Object> aValues = oldA.getValues();
        +          Map<String, Object> bValues = oldB.getValues();
        +          bValues.put("name", aValues.remove("name"));
        +          RawObject newB = new RawObject(newBType, bValues, oldB.getSuper());
        +          RawObject newA = new RawObject(newAType, aValues, newB);
        +          return newA;
        +      }
        +
        +      @Override
        +      public boolean equals(Object o) {
        +          return o instanceof MyConversion4;
        +      }
        +  }
        +
        +  // Create a class converter mutation.
        +  //
        +  Converter converter = new Converter(A.class.getName(), 0,
        +                                      new MyConversion4());
        +
        +  // Configure the converter as described here.
        + +

        A conversion may return an instance of a different class entirely, as + long as it conforms to current class definitions and is the type expected + in the given context (a subtype of the old type, or a type compatible with + the new field type). For example, a field that is used to discriminate + between two types of objects could be removed and replaced by two new + subclasses:

        +  // The old class.  Version 0 is implied.
        +  //
        +  @Persistent
        +  class Pet {
        +      boolean isCatNotDog;
        +      ...
        +  }
        +
        +  // The new classes.  A new version number must be assigned to the Pet class.
        +  //
        +  @Persistent(version=1)
        +  class Pet {
        +      ...
        +  }
        +  @Persistent
        +  class Cat extends Pet {
        +      ...
        +  }
        +  @Persistent
        +  class Dog extends Pet {
        +      ...
        +  }
        +
        +  class MyConversion5 implements Conversion {
        +      private transient RawType newPetType;
        +      private transient RawType dogType;
        +      private transient RawType catType;
        +
        +      public void initialize(EntityModel model) {
        +          newPetType = model.getRawType(Pet.class.getName());
        +          dogType = model.getRawType(Dog.class.getName());
        +          catType = model.getRawType(Cat.class.getName());
        +      }
        +
        +      public Object convert(Object fromValue) {
        +          RawObject pet = (RawObject) fromValue;
        +          Map<String, Object> petValues = pet.getValues();
        +          Boolean isCat = (Boolean) petValues.remove("isCatNotDog");
        +          RawObject newPet = new RawObject(newPetType, petValues,
        +                                           pet.getSuper());
        +          RawType newSubType = isCat ? catType : dogType;
        +          return new RawObject(newSubType, Collections.emptyMap(), newPet);
        +      }
        +
        +      @Override
        +      public boolean equals(Object o) {
        +          return o instanceof MyConversion5;
        +      }
        +  }
        +
        +  // Create a class converter mutation.
        +  //
        +  Converter converter = new Converter(Pet.class.getName(), 0,
        +                                      new MyConversion5());
        +
        +  // Configure the converter as described here.
        + +

        The primary limitation of a conversion is that it may access at most a + single entity instance at one time. Conversions involving multiple entities + at once may be made by performing a store conversion.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          java.lang.Objectconvert(java.lang.Object fromValue) +
          Converts an old version of an object value to conform to the current + class or field definition.
          +
          booleanequals(java.lang.Object other) +
          The standard equals method that must be implemented by + conversion class.
          +
          voidinitialize(EntityModel model) +
          Initializes the conversion, allowing it to obtain raw type information + from the entity model.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            initialize

            +
            void initialize(EntityModel model)
            +
            Initializes the conversion, allowing it to obtain raw type information + from the entity model.
            +
            +
            Parameters:
            +
            model - the EntityModel.
            +
            +
          • +
          + + + +
            +
          • +

            convert

            +
            java.lang.Object convert(java.lang.Object fromValue)
            +
            Converts an old version of an object value to conform to the current + class or field definition. + +

            If a RuntimeException is thrown by this method, it will be + thrown to the original caller. Similarly, a IllegalArgumentException will be thrown to the original caller if the + object returned by this method does not conform to current class + definitions.

            + +

            The class of the input and output object may be one of the simple + types or RawObject. For primitive types, the primitive wrapper + class is used.

            +
            +
            Parameters:
            +
            fromValue - the object value being converted. The type of this + value is defined by the old class version that is being converted.
            +
            Returns:
            +
            the converted object. The type of this value must conform to + a current class definition. If this is a class conversion, it must + be the current version of the class. If this is a field conversion, it + must be of a type compatible with the current declared type of the + field.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            boolean equals(java.lang.Object other)
            +
            The standard equals method that must be implemented by + conversion class. + +

            When mutations are specified when opening a store, the specified and + previously stored mutations are compared for equality. If they are + equal, there is no need to replace the existing mutations in the stored + catalog. To accurately determine equality, the conversion class must + implement the equals method.

            + +

            If the equals method is not explicitly implemented by the + conversion class or a superclass other than Object, IllegalArgumentException will be thrown when the store is opened.

            + +

            Normally whenever equals is implemented the hashCode + method should also be implemented to support hash sets and maps. + However, hash sets and maps containing Conversion objects + are not used by the DPL and therefore the DPL does not require + hashCode to be implemented.

            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/Converter.html b/docs/java/com/sleepycat/persist/evolve/Converter.html new file mode 100644 index 0000000..d7fdf15 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/Converter.html @@ -0,0 +1,446 @@ + + + + + +Converter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class Converter

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        EntityConverter
        +
        +
        +
        +
        public class Converter
        +extends Mutation
        +
        A mutation for converting an old version of an object value to conform to + the current class or field definition. For example: + +
        +  package my.package;
        +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Entity
        +  class Person {
        +      // ...
        +  }
        +
        +  // The new class.  A new version number must be assigned.
        +  //
        +  @Entity(version=1)
        +  class Person {
        +      // Incompatible changes were made here...
        +  }
        +
        +  // Add a converter mutation.
        +  //
        +  Mutations mutations = new Mutations();
        +
        +  mutations.addConverter(new Converter(Person.class.getName(), 0,
        +                                       new MyConversion()));
        +
        +  // Configure the mutations as described here.
        + +

        See Conversion for more information.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          Converter(java.lang.String className, + int classVersion, + Conversion conversion) +
          Creates a mutation for converting all instances of the given class + version to the current version of the class.
          +
          Converter(java.lang.String declaringClassName, + int declaringClassVersion, + java.lang.String fieldName, + Conversion conversion) +
          Creates a mutation for converting all values of the given field in the + given class version to a type compatible with the current declared type + of the field.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Converter

            +
            public Converter(java.lang.String className,
            +                 int classVersion,
            +                 Conversion conversion)
            +
            Creates a mutation for converting all instances of the given class + version to the current version of the class.
            +
            +
            Parameters:
            +
            className - the class to which this mutation applies.
            +
            classVersion - the class version to which this mutation applies.
            +
            conversion - converter instance.
            +
            +
          • +
          + + + +
            +
          • +

            Converter

            +
            public Converter(java.lang.String declaringClassName,
            +                 int declaringClassVersion,
            +                 java.lang.String fieldName,
            +                 Conversion conversion)
            +
            Creates a mutation for converting all values of the given field in the + given class version to a type compatible with the current declared type + of the field.
            +
            +
            Parameters:
            +
            declaringClassName - the class to which this mutation applies.
            +
            declaringClassVersion - the class version to which this mutation + applies.
            +
            fieldName - field name to which this mutation applies.
            +
            conversion - converter instance.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getConversion

            +
            public Conversion getConversion()
            +
            Returns the converter instance specified to the constructor.
            +
            +
            Returns:
            +
            the converter instance.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            Returns true if the conversion objects are equal in this object and + given object, and if the Mutation.equals(java.lang.Object) superclass method + returns true.
            +
            +
            Overrides:
            +
            equals in class Mutation
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class Mutation
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class Mutation
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/DeletedClassException.html b/docs/java/com/sleepycat/persist/evolve/DeletedClassException.html new file mode 100644 index 0000000..ac1c8b6 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/DeletedClassException.html @@ -0,0 +1,254 @@ + + + + + +DeletedClassException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class DeletedClassException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class DeletedClassException
        +extends OperationFailureException
        +
        While reading from an index, an instance of a deleted class version was + encountered.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/Deleter.html b/docs/java/com/sleepycat/persist/evolve/Deleter.html new file mode 100644 index 0000000..32c26ea --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/Deleter.html @@ -0,0 +1,396 @@ + + + + + +Deleter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class Deleter

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class Deleter
        +extends Mutation
        +
        A mutation for deleting an entity class or field. + +

        WARNING: The data for the deleted class or field will be + destroyed and will be recoverable only by restoring from backup. If you + wish to convert the instance data to a different type or format, use a + Conversion mutation instead.

        + +

        For example, to delete a field:

        + +
        +  package my.package;
        +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Entity
        +  class Person {
        +      String name;
        +      String favoriteColors;
        +  }
        +
        +  // The new class.  A new version number must be assigned.
        +  //
        +  @Entity(version=1)
        +  class Person {
        +      String name;
        +  }
        +
        +  // Add the mutation for deleting a field.
        +  //
        +  Mutations mutations = new Mutations();
        +
        +  mutations.addDeleter(new Deleter(Person.class.getName(), 0,
        +                                   "favoriteColors");
        +
        +  // Configure the mutations as described here.
        + +

        To delete an entity class:

        + +
        +  package my.package;
        +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Entity
        +  class Statistics {
        +      ...
        +  }
        +
        +  // Add the mutation for deleting a class.
        +  //
        +  Mutations mutations = new Mutations();
        +
        +  mutations.addDeleter(new Deleter("my.package.Statistics", 0));
        +
        +  // Configure the mutations as described here.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          Deleter(java.lang.String className, + int classVersion) +
          Creates a mutation for deleting an entity class.
          +
          Deleter(java.lang.String declaringClass, + int declaringClassVersion, + java.lang.String fieldName) +
          Creates a mutation for deleting the given field from all instances of + the given class version.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Deleter

            +
            public Deleter(java.lang.String className,
            +               int classVersion)
            +
            Creates a mutation for deleting an entity class.
            +
            +
            Parameters:
            +
            className - the class to which this mutation applies.
            +
            classVersion - the class version to which this mutation applies.
            +
            +
          • +
          + + + +
            +
          • +

            Deleter

            +
            public Deleter(java.lang.String declaringClass,
            +               int declaringClassVersion,
            +               java.lang.String fieldName)
            +
            Creates a mutation for deleting the given field from all instances of + the given class version.
            +
            +
            Parameters:
            +
            declaringClass - the class to which this mutation applies.
            +
            declaringClassVersion - the class version to which this mutation + applies.
            +
            fieldName - field name to which this mutation applies.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class Mutation
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/EntityConverter.html b/docs/java/com/sleepycat/persist/evolve/EntityConverter.html new file mode 100644 index 0000000..8a8fcb4 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/EntityConverter.html @@ -0,0 +1,405 @@ + + + + + +EntityConverter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class EntityConverter

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class EntityConverter
        +extends Converter
        +
        A subclass of Converter that allows specifying keys to be deleted. + +

        When a Converter is used with an entity class, secondary keys cannot be + automatically deleted based on field deletion, because field Deleter objects + are not used in conjunction with a Converter mutation. The EntityConverter + can be used instead of a plain Converter to specify the key names to be + deleted.

        + +

        It is not currently possible to rename or insert secondary keys when + using a Converter mutation with an entity class.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Converter, +Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          EntityConverter(java.lang.String entityClassName, + int classVersion, + Conversion conversion, + java.util.Set<java.lang.String> deletedKeys) +
          Creates a mutation for converting all instances of the given entity + class version to the current version of the class.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EntityConverter

            +
            public EntityConverter(java.lang.String entityClassName,
            +                       int classVersion,
            +                       Conversion conversion,
            +                       java.util.Set<java.lang.String> deletedKeys)
            +
            Creates a mutation for converting all instances of the given entity + class version to the current version of the class.
            +
            +
            Parameters:
            +
            entityClassName - the entity class to which this mutation applies.
            +
            classVersion - the class version to which this mutation applies.
            +
            conversion - converter instance.
            +
            deletedKeys - the set of key names that are to be deleted.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDeletedKeys

            +
            public java.util.Set<java.lang.String> getDeletedKeys()
            +
            Returns the set of key names that are to be deleted.
            +
            +
            Returns:
            +
            the set of key names that are to be deleted.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            Returns true if the deleted and renamed keys are equal in this object + and given object, and if the Converter.equals(java.lang.Object) superclass method + returns true.
            +
            +
            Overrides:
            +
            equals in class Converter
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class Converter
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class Converter
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/EvolveConfig.html b/docs/java/com/sleepycat/persist/evolve/EvolveConfig.html new file mode 100644 index 0000000..468aaf0 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/EvolveConfig.html @@ -0,0 +1,409 @@ + + + + + +EvolveConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class EvolveConfig

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.evolve.EvolveConfig
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class EvolveConfig
        +extends java.lang.Object
        +implements java.lang.Cloneable
        +
        Configuration properties for eager conversion of unevolved objects. This + configuration is used with EntityStore.evolve.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EvolveConfig

            +
            public EvolveConfig()
            +
            Creates an evolve configuration with default properties.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            cloneConfig

            +
            public EvolveConfig cloneConfig()
            +
            Deprecated. As of JE 4.0.13, replaced by clone().
            +
            Returns a shallow copy of the configuration.
            +
            +
            Returns:
            +
            a shallow copy of the configuration.
            +
            +
          • +
          + + + +
            +
          • +

            clone

            +
            public EvolveConfig clone()
            +
            Returns a shallow copy of the configuration.
            +
            +
            Overrides:
            +
            clone in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            addClassToEvolve

            +
            public EvolveConfig addClassToEvolve(java.lang.String entityClass)
            +
            Adds an entity class for a primary index to be converted. If no classes + are added, all indexes that require evolution will be converted.
            +
            +
            Parameters:
            +
            entityClass - the entity class name.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getClassesToEvolve

            +
            public java.util.Set<java.lang.String> getClassesToEvolve()
            +
            Returns an unmodifiable set of the entity classes to be evolved.
            +
            +
            Returns:
            +
            an unmodifiable set of the entity classes to be evolved.
            +
            +
          • +
          + + + +
            +
          • +

            setEvolveListener

            +
            public EvolveConfig setEvolveListener(EvolveListener listener)
            +
            Sets a progress listener that is notified each time an entity is read.
            +
            +
            Parameters:
            +
            listener - the EvolveListener.
            +
            Returns:
            +
            'this'.
            +
            +
          • +
          + + + +
            +
          • +

            getEvolveListener

            +
            public EvolveListener getEvolveListener()
            +
            Returns the progress listener that is notified each time an entity is + read.
            +
            +
            Returns:
            +
            the EvolveListener.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/EvolveConfigBeanInfo.html b/docs/java/com/sleepycat/persist/evolve/EvolveConfigBeanInfo.html new file mode 100644 index 0000000..5109ece --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/EvolveConfigBeanInfo.html @@ -0,0 +1,351 @@ + + + + + +EvolveConfigBeanInfo (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class EvolveConfigBeanInfo

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.beans.BeanInfo
        +
        +
        +
        +
        public class EvolveConfigBeanInfo
        +extends ConfigBeanInfoBase
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EvolveConfigBeanInfo

            +
            public EvolveConfigBeanInfo()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getBeanDescriptor

            +
            public java.beans.BeanDescriptor getBeanDescriptor()
            +
            +
            Specified by:
            +
            getBeanDescriptor in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getBeanDescriptor in class java.beans.SimpleBeanInfo
            +
            +
          • +
          + + + +
            +
          • +

            getPropertyDescriptors

            +
            public java.beans.PropertyDescriptor[] getPropertyDescriptors()
            +
            +
            Specified by:
            +
            getPropertyDescriptors in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getPropertyDescriptors in class java.beans.SimpleBeanInfo
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/EvolveEvent.html b/docs/java/com/sleepycat/persist/evolve/EvolveEvent.html new file mode 100644 index 0000000..a978ec5 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/EvolveEvent.html @@ -0,0 +1,277 @@ + + + + + +EvolveEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class EvolveEvent

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.evolve.EvolveEvent
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class EvolveEvent
        +extends java.lang.Object
        +
        The event passed to the EvolveListener interface during eager entity + evolution.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetEntityClassName() +
          The class name of the current entity class being converted.
          +
          EvolveStatsgetStats() +
          The cumulative statistics gathered during eager evolution.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getStats

            +
            public EvolveStats getStats()
            +
            The cumulative statistics gathered during eager evolution.
            +
            +
            Returns:
            +
            the cumulative statistics.
            +
            +
          • +
          + + + +
            +
          • +

            getEntityClassName

            +
            public java.lang.String getEntityClassName()
            +
            The class name of the current entity class being converted.
            +
            +
            Returns:
            +
            the class name.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/EvolveListener.html b/docs/java/com/sleepycat/persist/evolve/EvolveListener.html new file mode 100644 index 0000000..b6a6f92 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/EvolveListener.html @@ -0,0 +1,242 @@ + + + + + +EvolveListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Interface EvolveListener

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface EvolveListener
        +
        The listener interface called during eager entity evolution.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            evolveProgress

            +
            boolean evolveProgress(EvolveEvent event)
            +
            The listener method called during eager entity evolution.
            +
            +
            Parameters:
            +
            event - the EvolveEvent.
            +
            Returns:
            +
            true to continue evolution or false to stop.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/EvolveStats.html b/docs/java/com/sleepycat/persist/evolve/EvolveStats.html new file mode 100644 index 0000000..4d29e8e --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/EvolveStats.html @@ -0,0 +1,276 @@ + + + + + +EvolveStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class EvolveStats

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.evolve.EvolveStats
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class EvolveStats
        +extends java.lang.Object
        +
        Statistics accumulated during eager entity evolution.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intgetNConverted() +
          The total number of entities converted during eager evolution.
          +
          intgetNRead() +
          The total number of entities read during eager evolution.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNRead

            +
            public int getNRead()
            +
            The total number of entities read during eager evolution.
            +
            +
            Returns:
            +
            the number of entities read.
            +
            +
          • +
          + + + +
            +
          • +

            getNConverted

            +
            public int getNConverted()
            +
            The total number of entities converted during eager evolution.
            +
            +
            Returns:
            +
            the number of entities converted.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/IncompatibleClassException.html b/docs/java/com/sleepycat/persist/evolve/IncompatibleClassException.html new file mode 100644 index 0000000..01a62fa --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/IncompatibleClassException.html @@ -0,0 +1,305 @@ + + + + + +IncompatibleClassException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class IncompatibleClassException

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class IncompatibleClassException
        +extends OperationFailureException
        +
        A class has been changed incompatibly and no mutation has been configured to + handle the change or a new class version number has not been assigned. + + +

        In a replicated environment, this exception is also thrown when upgrading + an application (persistent classes have been changed) and an upgraded node + is elected Master before all of the Replica nodes have been upgraded. See + Upgrading a Replication Group + for more information.

        +
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        EntityStore.EntityStore, +Entity.version(), +Persistent.version(), +Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + + + +
          +
        • + + +

          Method Summary

          + +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            IncompatibleClassException

            +
            public IncompatibleClassException(java.lang.String message)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/Mutation.html b/docs/java/com/sleepycat/persist/evolve/Mutation.html new file mode 100644 index 0000000..1985cfd --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/Mutation.html @@ -0,0 +1,364 @@ + + + + + +Mutation (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class Mutation

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.evolve.Mutation
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        Converter, Deleter, Renamer
        +
        +
        +
        +
        public abstract class Mutation
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        The base class for all mutations.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object other) +
          Returns true if the class name, class version and field name are equal + in this object and given object.
          +
          java.lang.StringgetClassName() +
          Returns the class to which this mutation applies.
          +
          intgetClassVersion() +
          Returns the class version to which this mutation applies.
          +
          java.lang.StringgetFieldName() +
          Returns the field name to which this mutation applies, or null if this + mutation applies to the class itself.
          +
          inthashCode() 
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getClassName

            +
            public java.lang.String getClassName()
            +
            Returns the class to which this mutation applies.
            +
            +
            Returns:
            +
            the class to which this mutation applies.
            +
            +
          • +
          + + + +
            +
          • +

            getClassVersion

            +
            public int getClassVersion()
            +
            Returns the class version to which this mutation applies.
            +
            +
            Returns:
            +
            the class version to which this mutation applies.
            +
            +
          • +
          + + + +
            +
          • +

            getFieldName

            +
            public java.lang.String getFieldName()
            +
            Returns the field name to which this mutation applies, or null if this + mutation applies to the class itself.
            +
            +
            Returns:
            +
            the field name to which this mutation applies, or null.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            Returns true if the class name, class version and field name are equal + in this object and given object.
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/Mutations.html b/docs/java/com/sleepycat/persist/evolve/Mutations.html new file mode 100644 index 0000000..d177eee --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/Mutations.html @@ -0,0 +1,587 @@ + + + + + +Mutations (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class Mutations

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.evolve.Mutations
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class Mutations
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        A collection of mutations for configuring class evolution. + +

        Mutations are configured when a store is opened via StoreConfig.setMutations. For example:

        + +
        +  Mutations mutations = new Mutations();
        +  // Add mutations...
        +  StoreConfig config = new StoreConfig();
        +  config.setMutations(mutations);
        +  EntityStore store = new EntityStore(env, "myStore", config);
        + +

        Mutations cause data conversion to occur lazily as instances are read + from the store. The EntityStore.evolve method + may also be used to perform eager conversion.

        + +

        Not all incompatible class changes can be handled via mutations. For + example, complex refactoring may require a transformation that manipulates + multiple entity instances at once. Such changes are not possible with + mutations but can made by performing a store conversion.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          Mutations() +
          Creates an empty set of mutations.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidaddConverter(Converter converter) +
          Adds a converter mutation.
          +
          voidaddDeleter(Deleter deleter) +
          Adds a deleter mutation.
          +
          voidaddRenamer(Renamer renamer) +
          Adds a renamer mutation.
          +
          booleanequals(java.lang.Object other) +
          Returns true if this collection has the same set of mutations as the + given collection and all mutations are equal.
          +
          ConvertergetConverter(java.lang.String className, + int classVersion, + java.lang.String fieldName) +
          Returns the converter mutation for the given class, version and field, + or null if none exists.
          +
          java.util.Collection<Converter>getConverters() +
          Returns an unmodifiable collection of all converter mutations.
          +
          DeletergetDeleter(java.lang.String className, + int classVersion, + java.lang.String fieldName) +
          Returns the deleter mutation for the given class, version and field, or + null if none exists.
          +
          java.util.Collection<Deleter>getDeleters() +
          Returns an unmodifiable collection of all deleter mutations.
          +
          RenamergetRenamer(java.lang.String className, + int classVersion, + java.lang.String fieldName) +
          Returns the renamer mutation for the given class, version and field, or + null if none exists.
          +
          java.util.Collection<Renamer>getRenamers() +
          Returns an unmodifiable collection of all renamer mutations.
          +
          inthashCode() 
          booleanisEmpty() +
          Returns true if no mutations are present.
          +
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Mutations

            +
            public Mutations()
            +
            Creates an empty set of mutations.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            isEmpty

            +
            public boolean isEmpty()
            +
            Returns true if no mutations are present.
            +
            +
            Returns:
            +
            true if no mutations are present.
            +
            +
          • +
          + + + +
            +
          • +

            addRenamer

            +
            public void addRenamer(Renamer renamer)
            +
            Adds a renamer mutation.
            +
            +
            Parameters:
            +
            renamer - the Renamer.
            +
            +
          • +
          + + + +
            +
          • +

            getRenamer

            +
            public Renamer getRenamer(java.lang.String className,
            +                          int classVersion,
            +                          java.lang.String fieldName)
            +
            Returns the renamer mutation for the given class, version and field, or + null if none exists. A null field name should be specified to get a + class renamer.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            classVersion - the class version.
            +
            fieldName - the field name in the given class version.
            +
            Returns:
            +
            the Renamer, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getRenamers

            +
            public java.util.Collection<Renamer> getRenamers()
            +
            Returns an unmodifiable collection of all renamer mutations.
            +
            +
            Returns:
            +
            the renamers.
            +
            +
          • +
          + + + +
            +
          • +

            addDeleter

            +
            public void addDeleter(Deleter deleter)
            +
            Adds a deleter mutation.
            +
            +
            Parameters:
            +
            deleter - the Deleter.
            +
            +
          • +
          + + + +
            +
          • +

            getDeleter

            +
            public Deleter getDeleter(java.lang.String className,
            +                          int classVersion,
            +                          java.lang.String fieldName)
            +
            Returns the deleter mutation for the given class, version and field, or + null if none exists. A null field name should be specified to get a + class deleter.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            classVersion - the class version.
            +
            fieldName - the field name.
            +
            Returns:
            +
            the Deleter, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getDeleters

            +
            public java.util.Collection<Deleter> getDeleters()
            +
            Returns an unmodifiable collection of all deleter mutations.
            +
            +
            Returns:
            +
            the deleters.
            +
            +
          • +
          + + + +
            +
          • +

            addConverter

            +
            public void addConverter(Converter converter)
            +
            Adds a converter mutation.
            +
            +
            Parameters:
            +
            converter - the Converter.
            +
            +
          • +
          + + + +
            +
          • +

            getConverter

            +
            public Converter getConverter(java.lang.String className,
            +                              int classVersion,
            +                              java.lang.String fieldName)
            +
            Returns the converter mutation for the given class, version and field, + or null if none exists. A null field name should be specified to get a + class converter.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            classVersion - the class version.
            +
            fieldName - the field name.
            +
            Returns:
            +
            the Converter, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getConverters

            +
            public java.util.Collection<Converter> getConverters()
            +
            Returns an unmodifiable collection of all converter mutations.
            +
            +
            Returns:
            +
            the converters.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            Returns true if this collection has the same set of mutations as the + given collection and all mutations are equal.
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/Renamer.html b/docs/java/com/sleepycat/persist/evolve/Renamer.html new file mode 100644 index 0000000..665624d --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/Renamer.html @@ -0,0 +1,446 @@ + + + + + +Renamer (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.evolve
      +

      Class Renamer

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class Renamer
        +extends Mutation
        +
        A mutation for renaming a class or field without changing the instance or + field value. For example: +
        +  package my.package;
        +
        +  // The old class.  Version 0 is implied.
        +  //
        +  @Entity
        +  class Person {
        +      String name;
        +  }
        +
        +  // The new class.  A new version number must be assigned.
        +  //
        +  @Entity(version=1)
        +  class Human {
        +      String fullName;
        +  }
        +
        +  // Add the mutations.
        +  //
        +  Mutations mutations = new Mutations();
        +
        +  mutations.addRenamer(new Renamer("my.package.Person", 0,
        +                                   Human.class.getName()));
        +
        +  mutations.addRenamer(new Renamer("my.package.Person", 0,
        +                                   "name", "fullName"));
        +
        +  // Configure the mutations as described here.
        + + +

        In a replicated environment, renaming an entity class or secondary key + field may require handling the DatabasePreemptedException during the upgrade process. + See + Upgrading a Replication Group + for more information.

        +
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Class Evolution, +Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          Renamer(java.lang.String fromClass, + int fromVersion, + java.lang.String toClass) +
          Creates a mutation for renaming the class of all instances of the given + class version.
          +
          Renamer(java.lang.String declaringClass, + int declaringClassVersion, + java.lang.String fromField, + java.lang.String toField) +
          Creates a mutation for renaming the given field for all instances of the + given class version.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Renamer

            +
            public Renamer(java.lang.String fromClass,
            +               int fromVersion,
            +               java.lang.String toClass)
            +
            Creates a mutation for renaming the class of all instances of the given + class version.
            +
            +
            Parameters:
            +
            fromClass - the class to rename.
            +
            fromVersion - the class version to rename.
            +
            toClass - the new class name.
            +
            +
          • +
          + + + +
            +
          • +

            Renamer

            +
            public Renamer(java.lang.String declaringClass,
            +               int declaringClassVersion,
            +               java.lang.String fromField,
            +               java.lang.String toField)
            +
            Creates a mutation for renaming the given field for all instances of the + given class version.
            +
            +
            Parameters:
            +
            declaringClass - the class to which this mutation applies.
            +
            declaringClassVersion - the class version to which this mutation + applies.
            +
            fromField - field name in the given class version.
            +
            toField - the new field name.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getNewName

            +
            public java.lang.String getNewName()
            +
            Returns the new class or field name specified in the constructor.
            +
            +
            Returns:
            +
            the new name.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            Returns true if the new class name is equal in this object and given + object, and if the Mutation.equals(java.lang.Object) method returns true.
            +
            +
            Overrides:
            +
            equals in class Mutation
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class Mutation
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class Mutation
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/Conversion.html b/docs/java/com/sleepycat/persist/evolve/class-use/Conversion.html new file mode 100644 index 0000000..e76cb35 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/Conversion.html @@ -0,0 +1,208 @@ + + + + + +Uses of Interface com.sleepycat.persist.evolve.Conversion (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.evolve.Conversion

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use Conversion 
        PackageDescription
        com.sleepycat.persist.evolve +
        Utilities for managing class evolution of persistent objects.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of Conversion in com.sleepycat.persist.evolve

          + + + + + + + + + + + + +
          Methods in com.sleepycat.persist.evolve that return Conversion 
          Modifier and TypeMethod and Description
          ConversionConverter.getConversion() +
          Returns the converter instance specified to the constructor.
          +
          + + + + + + + + + + + + + + + + +
          Constructors in com.sleepycat.persist.evolve with parameters of type Conversion 
          Constructor and Description
          Converter(java.lang.String className, + int classVersion, + Conversion conversion) +
          Creates a mutation for converting all instances of the given class + version to the current version of the class.
          +
          Converter(java.lang.String declaringClassName, + int declaringClassVersion, + java.lang.String fieldName, + Conversion conversion) +
          Creates a mutation for converting all values of the given field in the + given class version to a type compatible with the current declared type + of the field.
          +
          EntityConverter(java.lang.String entityClassName, + int classVersion, + Conversion conversion, + java.util.Set<java.lang.String> deletedKeys) +
          Creates a mutation for converting all instances of the given entity + class version to the current version of the class.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/Converter.html b/docs/java/com/sleepycat/persist/evolve/class-use/Converter.html new file mode 100644 index 0000000..52313f2 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/Converter.html @@ -0,0 +1,221 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.Converter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.Converter

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/DeletedClassException.html b/docs/java/com/sleepycat/persist/evolve/class-use/DeletedClassException.html new file mode 100644 index 0000000..13dde5e --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/DeletedClassException.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.DeletedClassException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.DeletedClassException

      +
      +
      No usage of com.sleepycat.persist.evolve.DeletedClassException
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/Deleter.html b/docs/java/com/sleepycat/persist/evolve/class-use/Deleter.html new file mode 100644 index 0000000..287881d --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/Deleter.html @@ -0,0 +1,206 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.Deleter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.Deleter

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/EntityConverter.html b/docs/java/com/sleepycat/persist/evolve/class-use/EntityConverter.html new file mode 100644 index 0000000..b2b3c6b --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/EntityConverter.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.EntityConverter (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.EntityConverter

      +
      +
      No usage of com.sleepycat.persist.evolve.EntityConverter
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfig.html b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfig.html new file mode 100644 index 0000000..ee4cf38 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfig.html @@ -0,0 +1,221 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.EvolveConfig (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.EvolveConfig

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfigBeanInfo.html b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfigBeanInfo.html new file mode 100644 index 0000000..a08ae58 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveConfigBeanInfo.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.EvolveConfigBeanInfo (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.EvolveConfigBeanInfo

      +
      +
      No usage of com.sleepycat.persist.evolve.EvolveConfigBeanInfo
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/EvolveEvent.html b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveEvent.html new file mode 100644 index 0000000..9fbcba1 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveEvent.html @@ -0,0 +1,173 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.EvolveEvent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.EvolveEvent

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/EvolveListener.html b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveListener.html new file mode 100644 index 0000000..acd733e --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveListener.html @@ -0,0 +1,189 @@ + + + + + +Uses of Interface com.sleepycat.persist.evolve.EvolveListener (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.evolve.EvolveListener

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/EvolveStats.html b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveStats.html new file mode 100644 index 0000000..2a8bebe --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/EvolveStats.html @@ -0,0 +1,201 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.EvolveStats (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.EvolveStats

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/IncompatibleClassException.html b/docs/java/com/sleepycat/persist/evolve/class-use/IncompatibleClassException.html new file mode 100644 index 0000000..361c44e --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/IncompatibleClassException.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.IncompatibleClassException (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.IncompatibleClassException

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/Mutation.html b/docs/java/com/sleepycat/persist/evolve/class-use/Mutation.html new file mode 100644 index 0000000..0fd2948 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/Mutation.html @@ -0,0 +1,193 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.Mutation (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.Mutation

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use Mutation 
        PackageDescription
        com.sleepycat.persist.evolve +
        Utilities for managing class evolution of persistent objects.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of Mutation in com.sleepycat.persist.evolve

          + + + + + + + + + + + + + + + + + + + + + + + + +
          Subclasses of Mutation in com.sleepycat.persist.evolve 
          Modifier and TypeClass and Description
          class Converter +
          A mutation for converting an old version of an object value to conform to + the current class or field definition.
          +
          class Deleter +
          A mutation for deleting an entity class or field.
          +
          class EntityConverter +
          A subclass of Converter that allows specifying keys to be deleted.
          +
          class Renamer +
          A mutation for renaming a class or field without changing the instance or + field value.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/Mutations.html b/docs/java/com/sleepycat/persist/evolve/class-use/Mutations.html new file mode 100644 index 0000000..eb84296 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/Mutations.html @@ -0,0 +1,224 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.Mutations (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.Mutations

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/class-use/Renamer.html b/docs/java/com/sleepycat/persist/evolve/class-use/Renamer.html new file mode 100644 index 0000000..dc8c935 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/class-use/Renamer.html @@ -0,0 +1,206 @@ + + + + + +Uses of Class com.sleepycat.persist.evolve.Renamer (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.evolve.Renamer

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/package-frame.html b/docs/java/com/sleepycat/persist/evolve/package-frame.html new file mode 100644 index 0000000..106d22e --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/package-frame.html @@ -0,0 +1,39 @@ + + + + + +com.sleepycat.persist.evolve (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.persist.evolve

      + + + diff --git a/docs/java/com/sleepycat/persist/evolve/package-summary.html b/docs/java/com/sleepycat/persist/evolve/package-summary.html new file mode 100644 index 0000000..49a0cb6 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/package-summary.html @@ -0,0 +1,624 @@ + + + + + +com.sleepycat.persist.evolve (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.persist.evolve

      +
      +
      Utilities for managing class evolution of persistent objects.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        Conversion +
        Converts an old version of an object value to conform to the current class + or field definition.
        +
        EvolveListener +
        The listener interface called during eager entity evolution.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        Converter +
        A mutation for converting an old version of an object value to conform to + the current class or field definition.
        +
        Deleter +
        A mutation for deleting an entity class or field.
        +
        EntityConverter +
        A subclass of Converter that allows specifying keys to be deleted.
        +
        EvolveConfig +
        Configuration properties for eager conversion of unevolved objects.
        +
        EvolveConfigBeanInfo 
        EvolveEvent +
        The event passed to the EvolveListener interface during eager entity + evolution.
        +
        EvolveStats +
        Statistics accumulated during eager entity evolution.
        +
        Mutation +
        The base class for all mutations.
        +
        Mutations +
        A collection of mutations for configuring class evolution.
        +
        Renamer +
        A mutation for renaming a class or field without changing the instance or + field value.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + +
        Exception Summary 
        ExceptionDescription
        DeletedClassException +
        While reading from an index, an instance of a deleted class version was + encountered.
        +
        IncompatibleClassException +
        A class has been changed incompatibly and no mutation has been configured to + handle the change or a new class version number has not been assigned.
        +
        +
      • +
      + + + +

      Package com.sleepycat.persist.evolve Description

      +
      Utilities for managing class evolution of persistent objects. + +

      Class Evolution

      + +

      For persistent data that is not short lived, changes to persistent classes +are almost inevitable. Some changes are compatible with existing types, and +data conversion for these changes is performed automatically and transparently. +Other changes are not compatible with existing types. Mutations can be used to +explicitly manage many types of incompatible changes.

      + +

      Not all incompatible class changes can be handled via mutations. For +example, complex refactoring may require a transformation that manipulates +multiple entity instances at once. Such changes are not possible with +mutations but can be made by performing a store +conversion.

      + +

      The different categories of type changes are described below.

      + +

      Key Field Changes

      + +

      Unlike entity data, key data is not versioned. Therefore, the physical key +format for an index is fixed once the index has been opened, and the changes +allowed for key fields are very limited. The only changes allowed for key +fields are:

      +
        +
      • The name of a key field may be changed, as long as this change is +accompanied by a Renamer mutation.
      • +
      • A primitive type may be changed to its corresponding primitive wrapper +type. This is a compatible change.
      • +
      • For primary key fields and fields of a composite key class, a primitive +wrapper type may be changed to its corresponding primitive type. This is +allowed because these key fields with reference types may never have null +values. This is a compatible change.
      • +
      + +

      Any other changes to a key field are incompatible and may be made only by +performing a store conversion.

      + +

      Key ordering, including the behavior of a custom Comparable, is also fixed, since keys are stored in order in the +index. The specifications for key ordering may not be changed, and the +developer is responsible for not changing the behavior of a Comparable +key class. WARNING:: Changing the behavior of a Comparable key class is likely to make the index unusable.

      + +

      Compatible Type Changes

      + +

      Entity data, unlike key data, is versioned. Therefore, some changes can be +made compatibly and other changes can be handled via mutations. Compatible +changes are defined below. To make a compatible class change, a mutation is +not required; however, the class version must be assigned a new (greater) +integer value.

      + +

      Changes to a class hierarchy are compatible in some cases. A new class may +be inserted in the hierarchy. A class may be deleted from the hierarchy as +long as one of the following is true: 1) it contains no persistent fields, 2) +any persistent fields are deleted with field Deleter mutations, or 3) the class +is deleted with a class Deleter mutation. Classes in an existing hierarchy may +not be reordered compatibly, and fields may not moved from one class to another +compatibly; for such changes a class Converter mutation is required.

      + +

      Changes to field types in entity class definitions are compatible when they +conform to the Java Language Specification definitions for Widening +Primitive Conversions and Widening +Reference Conversions. For example, a smaller integer +type may be changed to a larger integer type, and a reference type may be +changed to one of its supertypes. Automatic widening conversions are performed +as described in the Java Language Specification.

      + +

      Primitive types may also be compatibly changed to their corresponding +primitive wrapper types, or to the wrapper type for a widened primitive type. +However, changing from a primitive wrapper type to a primitive type is not a +compatible change since existing null values could not be represented.

      + +

      Integer primitive types (byte, short, char, int, long) and their primitive +wrapper types may be compatibly changed to the BigInteger type.

      + +

      Enum values may be added compatibly, but may not be deleted or renamed. As +long as new values are declared after existing values, the default sort order +for enum key fields will match the declaration order, i.e, the default sort +order will match the enum ordinal order. If a new value is inserted (declared +before an existing value), it will be sorted after all existing values but +before newly added values. However, these ordering rules are only guaranteed +for enums containing up to 631 values and only if existing values are not +reordered. If more than 631 values are declared or the declarations of +existing values are reordered, then the default sort order will be arbitrary +and will not match the declaration (ordinal) order.

      + +

      In addition, adding fields to a class is a compatible change. When a +persistent instance of a class is read that does not contain the new field, the +new field is initialized by the default constructor.

      + +

      All other changes to instance fields are considered incompatible. +Incompatible changes may be handled via mutations, as described next.

      + +

      Note that whenever a class is changed, either compatibly or incompatibly, a +new (higher) class version number must be assigned. See Entity.version() and Persistent.version() for information on assigning +class version numbers.

      + +

      Mutations

      + +

      There are three types of mutations: Renamer, Deleter and Converter.

      + +

      A class or field can be renamed using a Renamer. Renaming is not expensive, since it +does not involve conversion of instance data.

      + +

      A class or field can be deleted using a Deleter.

      +
        +
      • Deleting an entity class causes removal of the primary and secondary +indices for the store, on other words, removal of all store entities for that +class and its subclasses. Removal is performed when the store is opened. A +Deleter should be used for an entity class +in all of the following circumstances: +
          +
        • When removing the entity class itself.
        • +
        • When removing Entity from the class + to make it non-persistent.
        • +
        • When removing Entity from the class + and adding Persistent, to use it as an + embedded persistent class but not an entity class. The version of the class + must be incremented in this case.
        • +
        +
      • + +
      • Deleting a non-entity class does not itself cause deletion of instance +data, but is needed to inform DPL that the deleted class will not be used. +Instances of the deleted class must be handled (discarded or converted to +another class) by Deleter or Converter mutations for the field or enclosing +class that contain embedded instances of the deleted class. A Deleter should be used for a non-entity class in +all of the following circumstances: +
          +
        • When removing the persistent class itself.
        • +
        • When removing Persistent from the + class to make it non-persistent.
        • +
        • When removing Persistent from the + class and adding Entity, to use it as an + entity class but not an embedded persistent class. The version of the class + must be incremented in this case.
        • +
        +
      • + +
      • Deleting a field causes automatic conversion of the instances containing +that field, in order to discard the field values.
      • +
      + +

      Other incompatible changes are handled by creating a Converter mutation and implementing a Conversion.convert method that +manipulates the raw objects and/or simple values directly. The convert +method is passed an object of the old incompatible type and it returns an +object of a current type.

      + +

      Conversions can be specified in two ways: for specific fields or for all +instances of a class. A different Converter constructor is used in each case. +Field-specific conversions are used instead of class conversions when both are +applicable.

      + +

      Note that a class conversion may be not specified for an enum class. A +field conversion, or a class conversion for the class declaring the field, may +be used.

      + +

      Note that each mutation is applied to a specific class version number. The +class version must be explicitly specified in a mutation for two reasons:

      +
        +
      1. This provides safety in the face of multiple unconverted versions of a +given type. Without a version, a single conversion method would have to handle +multiple input types, and would have to distinguish between them by examining +the data or type information.
      2. +
      3. This allows arbitrary changes to be made. For example, a series of name +changes may reuse a given name for more than one version. To identify the +specific type being converted or renamed, a version number is needed.
      4. +
      +

      See Entity.version() and Persistent.version() for information on assigning +class version numbers.

      + +

      Mutations are therefore responsible for converting each existing +incompatible class version to the current version as defined by a current class +definition. For example, consider that class-version A-1 is initially changed +to A-2 and a mutation is added for converting A-1 to A-2. If later changes in +version A-3 occur before converting all A-1 instances to version A-2, the +converter for A-1 will have to be changed. Instead of converting from A-1 to +A-2 it will need to convert from A-1 to A-3. In addition, a mutation +converting A-2 to A-3 will be needed.

      + +

      When a Converter mutation applies to a +given object, other mutations that may apply to that object are not +automatically performed. It is the responsibility of the Converter to return an object that conforms to +the current class definition, including renaming fields and classes. If the +input object has nested objects or superclasses that also need conversion, the +converter must perform these nested conversions before returning the final +converted object. This rule avoids the complexity and potential errors that +could result if a converter mutation were automatically combined with other +mutations in an arbitrary manner.

      + +

      The EntityStore.evolve +method may optionally be used to ensure that all instances of an old class +version are converted to the current version.

      + +

      Other Metadata Changes

      + +

      When a class that happens to be an entity class is renamed, it remains an +entity class. When a field that happens to be a primary or +secondary key field is renamed, its metadata remains intact as well.

      + +

      When the SecondaryKey annotation is +added to an existing field, a new index is created automatically. The +new index will be populated by reading the entire primary index when the +primary index is opened.

      + +

      When the SecondaryKey annotation is +included with a new field, a new index is created automatically. The +new field is required to be a reference type (not a primitive) and must be +initialized to null (the default behavior) in the default constructor. +Entities will be indexed by the field when they are stored with a non-null key +value.

      + +

      When a field with the SecondaryKey +annotation is deleted, or when the SecondaryKey annotation is removed from a field +without deleting it, the secondary index is removed (dropped). Removal occurs +when the store is opened.

      + +

      The SecondaryKey.relate property may NOT be changed. All other properties of a +SecondaryKey may be changed, although +avoiding changes that cause foreign key integrity errors is the responsibility +of the application developer. For example, if the SecondaryKey.relatedEntity() property is added but +not all existing secondary keys reference existing primary keys for the related +entity, foreign key integrity errors may occur.

      + +

      The PrimaryKey annotation may NOT be +removed from a field in an entity class.

      + +

      The PrimaryKey.sequence() property may be +added, removed, or changed to a different name.

      + +

      The Persistent.proxyFor() property may NOT +be added, removed, or changed to a different class.

      + +

      Warnings on Testing and Backups

      + +

      The application developer is responsible for verifying that class evolution +works properly before deploying with a changed set of persistent classes. The +DPL will report errors when old class definitions cannot be evolved, for +example, when a mutation is missing. To test that no such errors will occur, +application test cases must include instances of all persistent classes.

      + +

      Converter mutations require special testing. Since the application +conversion method is allowed to return instances of any type, the DPL cannot +check that the proper type is returned until the data is accessed. To avoid +data access errors, application test cases must cover converter mutations for +all potential input and output types.

      + +

      When secondary keys are dropped or entity classes are deleted, the +underlying databases are deleted and cannot be recovered from the store. This +takes place when the store is opened. It is strongly recommended that a backup +of the entire store is made before opening the store and causing class +evolution to proceed.

      + +

      Store Conversion

      + +

      When mutations are not sufficient for handling class changes, a full store +conversion may be performed. This is necessary for two particular types of +class changes:

      +
        +
      • A change to a physical key format, for example, a change from type +int to type long.
      • +
      • A conversion that involves multiple entities at once, for example, +combining two separate entity classes into a new single entity class.
      • +
      + +

      To perform a full store conversion, a program is written that performs the +following steps to copy the data from the old store to a new converted +store:

      +
        +
      1. The old store is opened as a RawStore and +the new store is opened as an EntityStore.
      2. +
      3. All entities are read from the old store. Entities are read using a RawStore to allow access to entities for which no +compatible class exists.
      4. +
      5. The RawObject entities are then converted +to the format desired. Raw objects can be arbitrarily manipulated as needed. +The updated raw objects must conform to the new evolved class definitions.
      6. +
      7. The updated raw entities are converted to live objects by calling the +EntityModel.convertRawObject method of the new store. This method converts +raw objects obtained from a different store, as long as they conform to the new +evolved class definitions.
      8. +
      9. The new live objects are written to the new EntityStore using a PrimaryIndex as usual.
      10. +
      + +

      To perform such a conversion, two separate stores must be open at once. +Both stores may be in the same Environment, if +desired, by giving them different store names. But since all data is being +rewritten, there are performance advantages to creating the new store in a new +fresh environment: the data will be compacted as it is written, and the old +store can be removed very quickly by deleting the old environment directory +after the conversion is complete.

      + + + +

      Upgrading a Replication Group

      + +

      When changes to persistent classes are made in a ReplicatedEnvironment, special handling is necessary when +the application is upgraded on the nodes in the replication group. Upgraded +means that the application on a node is stopped, the updated application +classes are installed, and the application is started again.

      + +

      As usual in any sort of replication group upgrade, the Replica nodes must be +upgraded first and the Master node must be upgraded last. If an upgraded node +is elected Master before all of the Replica nodes have been upgraded, either +because of a user error or an unexpected failover, the IncompatibleClassException will be thrown.

      + +

      There are two considerations that must be taken into account during the +upgrade process: new indexes that are temporarily unavailable on a Replica, +and exceptions that result from renamed entity classes and secondary keys.

      + +

      Note that these considerations only apply when a hot upgrade is performed, +i.e., when the replication group will contain a mix of upgraded and +non-upgraded nodes. If all nodes in the group are first taken down and then +the nodes are upgraded and restarted, then no special considerations are +necessary and this documentation is not applicable.

      + +

      Defining New Indexes in a Replication Group

      + +

      When a new entity class is added, which defines a new PrimaryIndex, or a new secondary key is added, which defines a new SecondaryIndex, the indexes will not be immediately available on an upgraded +node. A new index will not be fully available (i.e., on every node) until all +the nodes have been upgraded, the index has been created (and populated, in the +case of a secondary index) on the Master node, and the index has been +replicated to each Replica node via the replication stream.

      + +

      When a node is first upgraded it will start out as a Replica node, and any +newly defined indexes will not be available. The application has two choices +for handling this condition.

      +
        +
      1. An application may be able to coordinate among its nodes, by its own means, +to inform all nodes when an index has been created and populated on the Master. +Such an application can choose to access a new index only after it knows the +index is available. Such coordination is not directly supported by JE, +although a transaction with a CommitToken may be used +to simplify the coordination process.
      2. + +
      3. An application may call getPrimaryIndex or getSecondaryIndex to +determine whether an index is available. An IndexNotAvailableException is thrown by these methods +when the index has not yet been created or when a secondary index is currently +being populated via the replication stream.
      4. +
      + +

      When an upgraded node is elected Master (this is typically near the end of +the the upgrade process), it must call getPrimaryIndex to create +each new primary index, and getSecondaryIndex to +create and populate each new secondary index. A newly elected Master node that +was just upgraded should be prepared for a delay when getSecondaryIndex is +called to create and populate a new secondary index.

      + +

      Renaming Entity Classes and Keys in a Replication Group

      + +

      When a DPL entity class or secondary key field is renamed by an application +using a Renamer mutation, this will result +internally in the underlying database for that entity class or secondary key +being renamed. The actual renaming of the database first occurs on the +upgraded Master node and is then replicated to each Replica node.

      + +

      When the application on a Master or Replica node first accesses the store +after the database has been renamed, a DatabasePreemptedException will be thrown. When this +happens, the application must close any cursors and transactions that are open +for that store, and then close the store and reopen it.

      + +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/package-tree.html b/docs/java/com/sleepycat/persist/evolve/package-tree.html new file mode 100644 index 0000000..ad92793 --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/package-tree.html @@ -0,0 +1,196 @@ + + + + + +com.sleepycat.persist.evolve Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.persist.evolve

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/evolve/package-use.html b/docs/java/com/sleepycat/persist/evolve/package-use.html new file mode 100644 index 0000000..1cfc4cd --- /dev/null +++ b/docs/java/com/sleepycat/persist/evolve/package-use.html @@ -0,0 +1,273 @@ + + + + + +Uses of Package com.sleepycat.persist.evolve (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.persist.evolve

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/AnnotationModel.html b/docs/java/com/sleepycat/persist/model/AnnotationModel.html new file mode 100644 index 0000000..af6defa --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/AnnotationModel.html @@ -0,0 +1,400 @@ + + + + + +AnnotationModel (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class AnnotationModel

      +
      +
      + +
      +
        +
      • +
        +
        +
        public class AnnotationModel
        +extends EntityModel
        +
        The default annotation-based entity model. An AnnotationModel + is based on annotations that are specified for entity classes and their key + fields. + +

        AnnotationModel objects are thread-safe. Multiple threads may + safely call the methods of a shared AnnotationModel object.

        + +

        The set of persistent classes in the annotation model is the set of all + classes with the Persistent or Entity annotation.

        + +

        The annotations used to define persistent classes are: Entity, + Persistent, PrimaryKey, SecondaryKey and KeyField. A good starting point is Entity.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            AnnotationModel

            +
            public AnnotationModel()
            +
            Constructs a model for annotated entity classes.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getKnownClasses

            +
            public java.util.Set<java.lang.String> getKnownClasses()
            +
            Description copied from class: EntityModel
            +
            Returns the names of all known persistent classes. A type becomes known + when an instance of the type is stored for the first time or metadata or + type information is queried for a specific class name.
            +
            +
            Specified by:
            +
            getKnownClasses in class EntityModel
            +
            Returns:
            +
            an unmodifiable set of class names.
            +
            +
          • +
          + + + +
            +
          • +

            getKnownSpecialClasses

            +
            public java.util.Set<java.lang.String> getKnownSpecialClasses()
            +
            Description copied from class: EntityModel
            +
            Returns the names of all known persistent enum and array classes that + may be used to store persistent data. This differs from + EntityModel.getKnownClasses(), which does not return enum and array classes + because they have no metadata.
            +
            +
            Overrides:
            +
            getKnownSpecialClasses in class EntityModel
            +
            Returns:
            +
            an unmodifiable set of enum and array class names.
            +
            +
          • +
          + + + +
            +
          • +

            getEntityMetadata

            +
            public EntityMetadata getEntityMetadata(java.lang.String className)
            +
            Description copied from class: EntityModel
            +
            Returns the metadata for a given entity class name.
            +
            +
            Specified by:
            +
            getEntityMetadata in class EntityModel
            +
            Parameters:
            +
            className - the class name.
            +
            Returns:
            +
            the metadata or null if the class is not an entity class or does + not exist.
            +
            +
          • +
          + + + +
            +
          • +

            getClassMetadata

            +
            public ClassMetadata getClassMetadata(java.lang.String className)
            +
            Description copied from class: EntityModel
            +
            Returns the metadata for a given persistent class name, including proxy + classes and entity classes.
            +
            +
            Specified by:
            +
            getClassMetadata in class EntityModel
            +
            Parameters:
            +
            className - the class name.
            +
            Returns:
            +
            the metadata or null if the class is not persistent or does not + exist.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/ClassEnhancer.html b/docs/java/com/sleepycat/persist/model/ClassEnhancer.html new file mode 100644 index 0000000..f02dca8 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/ClassEnhancer.html @@ -0,0 +1,487 @@ + + + + + +ClassEnhancer (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class ClassEnhancer

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.model.ClassEnhancer
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.instrument.ClassFileTransformer
        +
        +
        +
        +
        public class ClassEnhancer
        +extends java.lang.Object
        +implements java.lang.instrument.ClassFileTransformer
        +
        Enhances the bytecode of persistent classes to provide efficient access to + fields and constructors, and to avoid special security policy settings for + accessing non-public members. Classes are enhanced if they are annotated + with Entity or Persistent. + +

        ClassEnhancer objects are thread-safe. Multiple threads may + safely call the methods of a shared ClassEnhancer object.

        + +

        As described in the package summary, bytecode + enhancement may be used either at runtime or offline (at build time).

        + +

        To use enhancement offline, this class may be used as a main + program. + + It may also be used via an ant task. + +

        + +

        For enhancement at runtime, this class provides the low level support + needed to transform class bytes during class loading. To configure runtime + enhancement you may use one of the following approaches:

        +
          +
        1. The BDB je-<version>.jar or db.jar file may be used as + an instrumentation agent as follows: +
          java -javaagent:<BDB-JAR-FILE>=enhance:packageNames ...
          + packageNames is a comma separated list of packages containing + persistent classes. Sub-packages of these packages are also searched. If + packageNames is omitted then all packages known to the current + classloader are searched. +

          The "-v" option may be included in the comma separated list to print the + name of each class that is enhanced.

        2. +
        3. The enhance(java.lang.String, byte[]) method may be called to implement a class loader + that performs enhancement. Using this approach, it is the developer's + responsibility to implement and configure the class loader.
        4. +
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          ClassEnhancer() +
          Creates a class enhancer that searches all packages.
          +
          ClassEnhancer(java.util.Set<java.lang.String> packageNames) +
          Creates a class enhancer that searches a given set of packages.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          byte[]enhance(java.lang.String className, + byte[] classBytes) +
          Enhances the given class bytes if the class is annotated with Entity or Persistent.
          +
          booleangetVerbose() +
          Gets verbose mode.
          +
          static voidmain(java.lang.String[] args) +
          Enhances classes in the directories specified.
          +
          static voidpremain(java.lang.String args, + java.lang.instrument.Instrumentation inst) +
          Enhances classes as specified by a JVM -javaagent argument.
          +
          voidsetVerbose(boolean verbose) +
          Sets verbose mode.
          +
          byte[]transform(java.lang.ClassLoader loader, + java.lang.String className, + java.lang.Class<?> classBeingRedefined, + java.security.ProtectionDomain protectionDomain, + byte[] classfileBuffer) 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ClassEnhancer

            +
            public ClassEnhancer()
            +
            Creates a class enhancer that searches all packages.
            +
          • +
          + + + +
            +
          • +

            ClassEnhancer

            +
            public ClassEnhancer(java.util.Set<java.lang.String> packageNames)
            +
            Creates a class enhancer that searches a given set of packages.
            +
            +
            Parameters:
            +
            packageNames - a set of packages to search for persistent + classes. Sub-packages of these packages are also searched. If empty or + null, all packages known to the current classloader are searched.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            main

            +
            public static void main(java.lang.String[] args)
            +                 throws java.lang.Exception
            +
            Enhances classes in the directories specified. The class files are + replaced when they are enhanced, without changing the file modification + date. For example: + +
            java -cp je-<version>.jar com.sleepycat.persist.model.ClassEnhancer ./classes
            + +

            The "-v" argument may be specified to print the name of each class + file that is enhanced. The total number of class files enhanced will + always be printed.

            +
            +
            Parameters:
            +
            args - one or more directories containing classes to be enhanced. + Subdirectories of these directories will also be searched. Optionally, + -v may be included to print the name of every class file enhanced.
            +
            Throws:
            +
            java.lang.Exception - if a problem occurs.
            +
            +
          • +
          + + + +
            +
          • +

            premain

            +
            public static void premain(java.lang.String args,
            +                           java.lang.instrument.Instrumentation inst)
            +
            Enhances classes as specified by a JVM -javaagent argument.
            +
            +
            Parameters:
            +
            args - see java.lang.instrument.Instrumentation.
            +
            inst - see java.lang.instrument.Instrumentation.
            +
            See Also:
            +
            Instrumentation
            +
            +
          • +
          + + + +
            +
          • +

            setVerbose

            +
            public void setVerbose(boolean verbose)
            +
            Sets verbose mode. + +

            True may be specified to print the name of each class file that is + enhanced. This property is false by default.

            +
            +
            Parameters:
            +
            verbose - whether to use verbose mode.
            +
            +
          • +
          + + + +
            +
          • +

            getVerbose

            +
            public boolean getVerbose()
            +
            Gets verbose mode.
            +
            +
            Returns:
            +
            whether to use verbose mode.
            +
            See Also:
            +
            setVerbose(boolean)
            +
            +
          • +
          + + + +
            +
          • +

            transform

            +
            public byte[] transform(java.lang.ClassLoader loader,
            +                        java.lang.String className,
            +                        java.lang.Class<?> classBeingRedefined,
            +                        java.security.ProtectionDomain protectionDomain,
            +                        byte[] classfileBuffer)
            +
            +
            Specified by:
            +
            transform in interface java.lang.instrument.ClassFileTransformer
            +
            +
          • +
          + + + +
            +
          • +

            enhance

            +
            public byte[] enhance(java.lang.String className,
            +                      byte[] classBytes)
            +
            Enhances the given class bytes if the class is annotated with Entity or Persistent.
            +
            +
            Parameters:
            +
            className - the class name in binary format; for example, + "my.package.MyClass$Name", or null if no filtering by class name + should be performed.
            +
            classBytes - are the class file bytes to be enhanced.
            +
            Returns:
            +
            the enhanced bytes, or null if no enhancement was performed.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/ClassEnhancerTask.html b/docs/java/com/sleepycat/persist/model/ClassEnhancerTask.html new file mode 100644 index 0000000..e1f8d9f --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/ClassEnhancerTask.html @@ -0,0 +1,404 @@ + + + + + +ClassEnhancerTask (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class ClassEnhancerTask

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • org.apache.tools.ant.ProjectComponent
        • +
        • +
            +
          • org.apache.tools.ant.Task
          • +
          • +
              +
            • com.sleepycat.persist.model.ClassEnhancerTask
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.lang.Cloneable
        +
        +
        +
        +
        public class ClassEnhancerTask
        +extends org.apache.tools.ant.Task
        +
        An ant task for running the ClassEnhancer. + +

        ClassEnhancerTask objects are thread-safe. Multiple threads may + safely call the methods of a shared ClassEnhancerTask object.

        + +

        Note that in the BDB Java Edition product, the ClassEnhancerTask + class is included in je-<version>.jar. However, in the BDB + (C-based) product, it is not included in db.jar because the build is + not dependent on the Ant libraries. Therefore, in the BDB product, the + application must compile the java/src/com/sleepycat/persist/model/ClassEnhancerTask.java source file and + ensure that the compiled class is available to the Ant task. For example + the following Ant task definitions could be used.

        + +

        For BDB Java Edition product:

        +
        + <taskdef name="enhance-persistent-classes"
        +          classname="com.sleepycat.persist.model.ClassEnhancerTask"
        +          classpath="${je.home}/lib/je-<version>.jar"/>
        + +

        For BDB (C-based Edition) product:

        +
        + <taskdef name="enhance-persistent-classes"
        +          classname="com.sleepycat.persist.model.ClassEnhancerTask"
        +          classpath="/path-to-jar/db.jar:/path-to-ClassEnhancerTask-class"/>
        + +

        The class enhancer task element has no attributes. It may contain one or + more nested fileset elements specifying the classes to be enhanced. + The class files are replaced when they are enhanced, without changing the + file modification date. For example:

        + +
        + <target name="main">
        +     <enhance-persistent-classes verbose="no">
        +         <fileset dir="classes"/>
        +     </enhance-persistent-classes>
        + </target>
        + +

        The verbose attribute may be specified as "true", "yes" or "on" (like + other Ant boolean attributes) to print the name of each class file that is + enhanced. The total number of class files enhanced will always be + printed.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          +
            +
          • + + +

            Fields inherited from class org.apache.tools.ant.Task

            +target, taskName, taskType, wrapper
          • +
          +
            +
          • + + +

            Fields inherited from class org.apache.tools.ant.ProjectComponent

            +description, location, project
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ClassEnhancerTask() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidaddConfiguredFileset(org.apache.tools.ant.types.FileSet files) 
          voidexecute() 
          voidsetVerbose(boolean verbose) 
          +
            +
          • + + +

            Methods inherited from class org.apache.tools.ant.Task

            +bindToOwner, getOwningTarget, getRuntimeConfigurableWrapper, getTaskName, getTaskType, getWrapper, handleErrorFlush, handleErrorOutput, handleFlush, handleInput, handleOutput, init, isInvalid, log, log, log, log, maybeConfigure, perform, reconfigure, setOwningTarget, setRuntimeConfigurableWrapper, setTaskName, setTaskType
          • +
          +
            +
          • + + +

            Methods inherited from class org.apache.tools.ant.ProjectComponent

            +clone, getDescription, getLocation, getProject, setDescription, setLocation, setProject
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ClassEnhancerTask

            +
            public ClassEnhancerTask()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            execute

            +
            public void execute()
            +             throws org.apache.tools.ant.BuildException
            +
            +
            Overrides:
            +
            execute in class org.apache.tools.ant.Task
            +
            Throws:
            +
            org.apache.tools.ant.BuildException
            +
            +
          • +
          + + + +
            +
          • +

            addConfiguredFileset

            +
            public void addConfiguredFileset(org.apache.tools.ant.types.FileSet files)
            +
          • +
          + + + +
            +
          • +

            setVerbose

            +
            public void setVerbose(boolean verbose)
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/ClassMetadata.html b/docs/java/com/sleepycat/persist/model/ClassMetadata.html new file mode 100644 index 0000000..6443d07 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/ClassMetadata.html @@ -0,0 +1,569 @@ + + + + + +ClassMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class ClassMetadata

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.model.ClassMetadata
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class ClassMetadata
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        The metadata for a persistent class. A persistent class may be specified + with the Entity or Persistent annotation. + +

        ClassMetadata objects are thread-safe. Multiple threads may + safely call the methods of a shared ClassMetadata object.

        + +

        This and other metadata classes are classes rather than interfaces to + allow adding properties to the model at a future date without causing + incompatibilities. Any such property will be given a default value and + its use will be optional.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          ClassMetadata(java.lang.String className, + int version, + java.lang.String proxiedClassName, + boolean entityClass, + PrimaryKeyMetadata primaryKey, + java.util.Map<java.lang.String,SecondaryKeyMetadata> secondaryKeys, + java.util.List<FieldMetadata> compositeKeyFields) +
          Used by an EntityModel to construct persistent class metadata.
          +
          ClassMetadata(java.lang.String className, + int version, + java.lang.String proxiedClassName, + boolean entityClass, + PrimaryKeyMetadata primaryKey, + java.util.Map<java.lang.String,SecondaryKeyMetadata> secondaryKeys, + java.util.List<FieldMetadata> compositeKeyFields, + java.util.Collection<FieldMetadata> persistentFields) +
          Used by an EntityModel to construct persistent class metadata.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object other) 
          java.lang.StringgetClassName() +
          Returns the name of the persistent class.
          +
          java.util.List<FieldMetadata>getCompositeKeyFields() +
          Returns an unmodifiable list of metadata for the fields making up a + composite key, or null if this is a not a composite key class.
          +
          java.util.Collection<FieldMetadata>getPersistentFields() +
          Returns an unmodifiable list of metadata for the persistent fields in + this class, or null if the default rules for persistent fields should be + used.
          +
          PrimaryKeyMetadatagetPrimaryKey() +
          Returns the primary key metadata for a key declared in this class, or + null if none is declared.
          +
          java.lang.StringgetProxiedClassName() +
          Returns the class name of the proxied class if this class is a PersistentProxy, or null otherwise.
          +
          java.util.Map<java.lang.String,SecondaryKeyMetadata>getSecondaryKeys() +
          Returns an unmodifiable map of key name (which may be different from + field name) to secondary key metadata for all secondary keys declared in + this class, or null if no secondary keys are declared in this class.
          +
          intgetVersion() +
          Returns the version of this persistent class.
          +
          inthashCode() 
          booleanisEntityClass() +
          Returns whether this class is an entity class.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ClassMetadata

            +
            public ClassMetadata(java.lang.String className,
            +                     int version,
            +                     java.lang.String proxiedClassName,
            +                     boolean entityClass,
            +                     PrimaryKeyMetadata primaryKey,
            +                     java.util.Map<java.lang.String,SecondaryKeyMetadata> secondaryKeys,
            +                     java.util.List<FieldMetadata> compositeKeyFields)
            +
            Used by an EntityModel to construct persistent class metadata. + The optional getPersistentFields() property will be set to null.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            version - the version.
            +
            proxiedClassName - the proxied class name.
            +
            entityClass - whether the class is an entity class.
            +
            primaryKey - the primary key metadata.
            +
            secondaryKeys - the secondary key metadata.
            +
            compositeKeyFields - the composite key field metadata.
            +
            +
          • +
          + + + +
            +
          • +

            ClassMetadata

            +
            public ClassMetadata(java.lang.String className,
            +                     int version,
            +                     java.lang.String proxiedClassName,
            +                     boolean entityClass,
            +                     PrimaryKeyMetadata primaryKey,
            +                     java.util.Map<java.lang.String,SecondaryKeyMetadata> secondaryKeys,
            +                     java.util.List<FieldMetadata> compositeKeyFields,
            +                     java.util.Collection<FieldMetadata> persistentFields)
            +
            Used by an EntityModel to construct persistent class metadata.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            version - the version.
            +
            proxiedClassName - the proxied class name.
            +
            entityClass - whether the class is an entity class.
            +
            primaryKey - the primary key metadata.
            +
            secondaryKeys - the secondary key metadata.
            +
            compositeKeyFields - the composite key field metadata.
            +
            persistentFields - the persistent field metadata.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getClassName

            +
            public java.lang.String getClassName()
            +
            Returns the name of the persistent class.
            +
            +
            Returns:
            +
            the name of the persistent class.
            +
            +
          • +
          + + + +
            +
          • +

            getVersion

            +
            public int getVersion()
            +
            Returns the version of this persistent class. This may be specified + using the Entity.version() or Persistent.version() + annotation.
            +
            +
            Returns:
            +
            the version of this persistent class.
            +
            +
          • +
          + + + +
            +
          • +

            getProxiedClassName

            +
            public java.lang.String getProxiedClassName()
            +
            Returns the class name of the proxied class if this class is a PersistentProxy, or null otherwise.
            +
            +
            Returns:
            +
            the class name of the proxied class, or null.
            +
            +
          • +
          + + + +
            +
          • +

            isEntityClass

            +
            public boolean isEntityClass()
            +
            Returns whether this class is an entity class.
            +
            +
            Returns:
            +
            whether this class is an entity class.
            +
            +
          • +
          + + + +
            +
          • +

            getPrimaryKey

            +
            public PrimaryKeyMetadata getPrimaryKey()
            +
            Returns the primary key metadata for a key declared in this class, or + null if none is declared. This may be specified using the PrimaryKey annotation.
            +
            +
            Returns:
            +
            the primary key metadata, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryKeys

            +
            public java.util.Map<java.lang.String,SecondaryKeyMetadata> getSecondaryKeys()
            +
            Returns an unmodifiable map of key name (which may be different from + field name) to secondary key metadata for all secondary keys declared in + this class, or null if no secondary keys are declared in this class. + This metadata may be specified using SecondaryKey annotations.
            +
            +
            Returns:
            +
            the unmodifiable map, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getCompositeKeyFields

            +
            public java.util.List<FieldMetadata> getCompositeKeyFields()
            +
            Returns an unmodifiable list of metadata for the fields making up a + composite key, or null if this is a not a composite key class. The + order of the fields in the returned list determines their stored order + and may be specified using the KeyField annotation. When the + composite key class does not implement Comparable, the order of + the fields is the relative sort order.
            +
            +
            Returns:
            +
            the unmodifiable list, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getPersistentFields

            +
            public java.util.Collection<FieldMetadata> getPersistentFields()
            +
            Returns an unmodifiable list of metadata for the persistent fields in + this class, or null if the default rules for persistent fields should be + used. All fields returned must be declared in this class and must be + non-static. + +

            By default (if null is returned) the persistent fields of a class + will be all declared instance fields that are non-transient (are not + declared with the transient keyword). The default rules + may be overridden by an EntityModel. For example, the AnnotationModel overrides the default rules when the NotPersistent or NotTransient annotation is specified.

            +
            +
            Returns:
            +
            the unmodifiable list, or null.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/DeleteAction.html b/docs/java/com/sleepycat/persist/model/DeleteAction.html new file mode 100644 index 0000000..d99add2 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/DeleteAction.html @@ -0,0 +1,390 @@ + + + + + +DeleteAction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Enum DeleteAction

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<DeleteAction>
        • +
        • +
            +
          • com.sleepycat.persist.model.DeleteAction
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<DeleteAction>
        +
        +
        +
        +
        public enum DeleteAction
        +extends java.lang.Enum<DeleteAction>
        +
        Specifies the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity. + This can be specified using a SecondaryKey.onRelatedEntityDelete() + annotation.
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          ABORT +
          The default action, ABORT, means that an exception is thrown in + order to abort the current transaction.
          +
          CASCADE +
          If CASCADE is specified, then this entity will be deleted also, + which could in turn trigger further deletions, causing a cascading + effect.
          +
          NULLIFY +
          If NULLIFY is specified, then the secondary key in this entity + is set to null and this entity is updated.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static DeleteActionvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static DeleteAction[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            ABORT

            +
            public static final DeleteAction ABORT
            +
            The default action, ABORT, means that an exception is thrown in + order to abort the current transaction. + + On BDB JE, a DeleteConstraintException is + thrown. +
            +
          • +
          + + + +
            +
          • +

            CASCADE

            +
            public static final DeleteAction CASCADE
            +
            If CASCADE is specified, then this entity will be deleted also, + which could in turn trigger further deletions, causing a cascading + effect.
            +
          • +
          + + + +
            +
          • +

            NULLIFY

            +
            public static final DeleteAction NULLIFY
            +
            If NULLIFY is specified, then the secondary key in this entity + is set to null and this entity is updated. For a secondary key field + that has an array or collection type, the array or collection element + will be removed by this action. The secondary key field must have a + reference (not a primitive) type in order to specify this action.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static DeleteAction[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (DeleteAction c : DeleteAction.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static DeleteAction valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/Entity.html b/docs/java/com/sleepycat/persist/model/Entity.html new file mode 100644 index 0000000..7358a4c --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/Entity.html @@ -0,0 +1,447 @@ + + + + + +Entity (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type Entity

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=TYPE)
        +public @interface Entity
        +
        Indicates a persistent entity class. For each entity class, a PrimaryIndex can be used to store and access instances of that class. + Optionally, one or more SecondaryIndex objects may be used to access + entity instances by secondary key. + +

        Entity Subclasses and Superclasses

        + +

        An entity class may have any number of subclasses and superclasses; + however, none of these may themselves be entity classes (annotated with + Entity).

        + +

        Entity superclasses (which must be annotated with Persistent, not + Entity) are used to share common definitions among entity classes. + Fields in an entity superclass may be defined as primary or secondary keys. + For example, the following BaseClass defines the primary key for any + number of entity classes, using a single sequence to assign primary key + values that will be unique across all entity classes that use it. The + entity class Pet extends the base class, implicitly defining a + primary index

        + +
        +  @Persistent
        +  class BaseClass {
        +      @PrimaryKey(sequence="ID")
        +      long id;
        +  }
        +
        +  @Entity
        +  class Pet extends BaseClass {
        +      @SecondaryKey(relate=ONE_TO_ONE)
        +      String name;
        +      float height;
        +      float weight;
        +  }
        + +

        Entity subclasses (which must be annotated with Persistent, not + Entity) are used to provide polymorphism within a single PrimaryIndex. Instances of the entity class and its subclasses are stored + in the same PrimaryIndex. For example, the entity class Pet + defines a primary index that will contain instances of it and its + subclasses, including Cat which is defined below.

        + +

        Fields in an entity subclass may be defined as secondary keys, and such + secondary keys can only be used to query instances of the subclass. For + example, although the primary key (id) and secondary key (name) can be used to retrieve any Pet instance, the entity subclass + Cat defines a secondary key (finickyness) that only applies + to Cat instances. Querying by this key will never retrieve a Dog instance, if such a subclass existed, because a Dog instance + will never contain a finickyness key.

        + +
        +  @Persistent
        +  class Cat extends Pet {
        +      @SecondaryKey(relate=MANY_TO_ONE)
        +      int finickyness;
        +  }
        + +

        WARNING: Entity subclasses that define secondary keys must be + registered prior to storing an instance of the class. This can be done in + two ways:

        +
          +
        1. The registerClass method may be called + to register the subclass before opening the entity store.
        2. +
        3. The getSubclassIndex method may be + called to implicitly register the subclass after opening the entity + store.
        4. +
        + +

        Persistent Fields and Types

        + +

        All non-transient instance fields of an entity class, as well as its + superclasses and subclasses, are persistent. static and transient fields are not persistent. The persistent fields of a class may + be private, package-private (default access), protected or + public.

        + +

        It is worthwhile to note the reasons that object persistence is defined + in terms of fields rather than properties (getters and setters). This + allows business methods (getters and setters) to be defined independently of + the persistent state of an object; for example, a setter method may perform + validation that could not be performed if it were called during object + deserialization. Similarly, this allows public methods to evolve somewhat + independently of the (typically non-public) persistent fields.

        + +

        Simple Types

        + +

        Persistent types are divided into simple types, enum types, complex + types, and array types. Simple types and enum types are single valued, + while array types may contain multiple elements and complex types may + contain one or more named fields.

        + +

        Simple types include:

        +
          +
        • Java primitive types: boolean, char, byte, short, int, long, + float, double
        • +
        • The wrapper classes for Java primitive types
        • +
        • BigDecimal
        • +
        • BigInteger
        • +
        • String
        • +
        • Date
        • +
        + +

        When null values are required (for optional key fields, for example), + primitive wrapper classes must be used instead of primitive types.

        + +

        Simple types, enum types and array types do not require annotations to + make them persistent.

        + +

        Complex and Proxy Types

        + +

        Complex persistent classes must be annotated with Entity or + Persistent, or must be proxied by a persistent proxy class + (described below). This includes entity classes, subclasses and + superclasses, and all other complex classes referenced via fields of these + classes.

        + +

        All complex persistent classes must have a default constructor. The + default constructor may be private, package-private (default + access), protected, or public. Other constructors are + allowed but are not used by the persistence mechanism.

        + +

        It is sometimes desirable to store instances of a type that is externally + defined and cannot be annotated or does not have a default constructor; for + example, a class defined in the Java standard libraries or a 3rd party + library. In this case, a PersistentProxy class may be used to + represent the stored values for the externally defined type. The proxy + class itself must be annotated with Persistent like other persistent + classes, and the Persistent.proxyFor() property must be specified.

        + +

        For convenience, built-in proxy classes are included for several common + classes (listed below) in the Java library. If you wish, you may define + your own PersistentProxy to override these built-in proxies.

        +
          +
        • HashSet
        • +
        • TreeSet
        • +
        • HashMap
        • +
        • TreeMap
        • +
        • ArrayList
        • +
        • LinkedList
        • +
        + +

        Complex persistent types should in general be application-defined + classes. This gives the application control over the persistent state and + its evolution over time.

        + +

        Other Type Restrictions

        + +

        Entity classes and subclasses may not be used in field declarations for + persistent types. Fields of entity classes and subclasses must be simple + types or non-entity persistent types (annotated with Persistent not + with Entity).

        + +

        Entity classes, subclasses and superclasses may be abstract and + may implement arbitrary interfaces. Interfaces do not need to be annotated + with Persistent in order to be used in a persistent class, since + interfaces do not contain instance fields.

        + +

        Persistent instances of static nested classes are allowed, but the nested + class must be annotated with Persistent or Entity. Inner + classes (non-static nested classes, including anonymous classes) are not + currently allowed as persistent types.

        + +

        Arrays of simple and persistent complex types are allowed as fields of + persistent types. Arrays may be multidimensional. However, an array may + not be stored as a top level instance in a primary index. Only instances of + entity classes and subclasses may be top level instances in a primary + index.

        + +

        Embedded Objects

        + +

        As stated above, the embedded (or member) non-transient non-static fields + of an entity class are themselves persistent and are stored along with their + parent entity object. This allows embedded objects to be stored in an + entity to an arbitrary depth.

        + +

        There is no arbitrary limit to the nesting depth of embedded objects + within an entity; however, there is a practical limit. When an entity is + marshalled, each level of nesting is implemented internally via recursive + method calls. If the nesting depth is large enough, a StackOverflowError can occur. In practice, this has been observed with a + nesting depth of 12,000, using the default Java stack size.

        + +

        This restriction on the nesting depth of embedded objects does not apply + to cyclic references, since these are handled specially as described + below.

        + +

        Object Graphs

        + +

        When an entity instance is stored, the graph of objects referenced via + its fields is stored and retrieved as a graph. In other words, if a single + instance is referenced by two or more fields when the entity is stored, the + same will be true when the entity is retrieved.

        + +

        When a reference to a particular object is stored as a member field + inside that object or one of its embedded objects, this is called a cyclic + reference. Because multiple references to a single object are stored as + such, cycles are also represented correctly and do not cause infinite + recursion or infinite processing loops. If an entity containing a cyclic + reference is stored, the cyclic reference will be present when the entity is + retrieved.

        + +

        Note that the stored object graph is restricted in scope to a single + entity instance. This is because each entity instance is stored separately. + If two entities have a reference to the same object when stored, they will + refer to two separate instances when the entities are retrieved.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Persistent, +PrimaryKey, +SecondaryKey, +KeyField
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Optional Element Summary

          + + + + + + + + + + +
          Optional Elements 
          Modifier and TypeOptional Element and Description
          intversion +
          Identifies a new version of a class when an incompatible class change + has been made.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Element Detail

          + + + +
            +
          • +

            version

            +
            public abstract int version
            +
            Identifies a new version of a class when an incompatible class change + has been made. Prior versions of a class are referred to by version + number to perform class evolution and conversion using Mutations. + +

            The first version of a class is version zero, if version() is + not specified. When an incompatible class change is made, a version + number must be assigned using version() that is higher than the + previous version number for the class. If this is not done, an IncompatibleClassException will be thrown when the store is opened.

            +
            +
            Returns:
            +
            the version.
            +
            +
            +
            Default:
            +
            0
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/EntityMetadata.html b/docs/java/com/sleepycat/persist/model/EntityMetadata.html new file mode 100644 index 0000000..8bd81fe --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/EntityMetadata.html @@ -0,0 +1,393 @@ + + + + + +EntityMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class EntityMetadata

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.model.EntityMetadata
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class EntityMetadata
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        The metadata for a persistent entity class. An entity class may be + specified with the Entity annotation. + +

        EntityMetadata objects are thread-safe. Multiple threads may + safely call the methods of a shared EntityMetadata object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          EntityMetadata(java.lang.String className, + PrimaryKeyMetadata primaryKey, + java.util.Map<java.lang.String,SecondaryKeyMetadata> secondaryKeys) +
          Used by an EntityModel to construct entity metadata.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object other) 
          java.lang.StringgetClassName() +
          Returns the name of the entity class.
          +
          PrimaryKeyMetadatagetPrimaryKey() +
          Returns the primary key metadata for this entity.
          +
          java.util.Map<java.lang.String,SecondaryKeyMetadata>getSecondaryKeys() +
          Returns an unmodifiable map of key name to secondary key metadata, or + an empty map if no secondary keys are defined for this entity.
          +
          inthashCode() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EntityMetadata

            +
            public EntityMetadata(java.lang.String className,
            +                      PrimaryKeyMetadata primaryKey,
            +                      java.util.Map<java.lang.String,SecondaryKeyMetadata> secondaryKeys)
            +
            Used by an EntityModel to construct entity metadata.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            primaryKey - the primary key metadata.
            +
            secondaryKeys - the secondary key metadata.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getClassName

            +
            public java.lang.String getClassName()
            +
            Returns the name of the entity class.
            +
            +
            Returns:
            +
            the name of the entity class.
            +
            +
          • +
          + + + +
            +
          • +

            getPrimaryKey

            +
            public PrimaryKeyMetadata getPrimaryKey()
            +
            Returns the primary key metadata for this entity. Note that the primary + key field may be declared in this class or in a subclass. This metadata + may be specified using the PrimaryKey annotation.
            +
            +
            Returns:
            +
            the primary key metadata.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryKeys

            +
            public java.util.Map<java.lang.String,SecondaryKeyMetadata> getSecondaryKeys()
            +
            Returns an unmodifiable map of key name to secondary key metadata, or + an empty map if no secondary keys are defined for this entity. The + returned map contains a mapping for each secondary key of this entity, + including secondary keys declared in subclasses and superclasses. This + metadata may be specified using SecondaryKey annotations.
            +
            +
            Returns:
            +
            the secondary key metadata.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/EntityModel.html b/docs/java/com/sleepycat/persist/model/EntityModel.html new file mode 100644 index 0000000..ab2a65c --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/EntityModel.html @@ -0,0 +1,681 @@ + + + + + +EntityModel (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class EntityModel

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.model.EntityModel
        • +
        +
      • +
      +
      +
        +
      • +
        +
        Direct Known Subclasses:
        +
        AnnotationModel
        +
        +
        +
        +
        public abstract class EntityModel
        +extends java.lang.Object
        +
        The base class for classes that provide entity model metadata. An EntityModel defines entity classes, primary keys, secondary keys, and + relationships between entities. For each entity class that is part of the + model, a single PrimaryIndex object and zero or more SecondaryIndex objects may be accessed via an EntityStore. + +

        The built-in entity model, the AnnotationModel, is based on + annotations that are added to entity classes and their key fields. + Annotations are used in the examples in this package, and it is expected + that annotations will normally be used; most readers should therefore skip + to the AnnotationModel class. However, a custom entity model class + may define its own metadata. This can be used to define entity classes and + keys using mechanisms other than annotations.

        + +

        A concrete entity model class should extend this class and implement the + getClassMetadata(java.lang.String), getEntityMetadata(java.lang.String) and getKnownClasses() methods.

        + +

        This is an abstract class rather than an interface to allow adding + capabilities to the model at a future date without causing + incompatibilities. For example, a method may be added in the future for + returning new information about the model and subclasses may override this + method to return the new information. Any new methods will have default + implementations that return default values, and the use of the new + information will be optional.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + +
          Constructors 
          ModifierConstructor and Description
          protected EntityModel() +
          The default constructor for use by subclasses.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          static java.lang.ClassclassForName(java.lang.String className) +
          Deprecated.  +
          use resolveClass(java.lang.String) instead. This method does not + use the environment's ClassLoader property.
          +
          +
          java.lang.ObjectconvertRawObject(RawObject raw) +
          Converts a given raw object to a live object according to the current + class definitions.
          +
          java.util.List<RawType>getAllRawTypes() +
          Returns all versions of all known types.
          +
          java.util.List<RawType>getAllRawTypeVersions(java.lang.String className) +
          Returns all known versions of type information for a given class name, + or null if no persistent version of the class is known.
          +
          abstract ClassMetadatagetClassMetadata(java.lang.String className) +
          Returns the metadata for a given persistent class name, including proxy + classes and entity classes.
          +
          abstract EntityMetadatagetEntityMetadata(java.lang.String className) +
          Returns the metadata for a given entity class name.
          +
          abstract java.util.Set<java.lang.String>getKnownClasses() +
          Returns the names of all known persistent classes.
          +
          java.util.Set<java.lang.String>getKnownSpecialClasses() +
          Returns the names of all known persistent enum and array classes that + may be used to store persistent data.
          +
          RawTypegetRawType(java.lang.String className) +
          Returns the type information for the current version of a given class, + or null if the class is not currently persistent.
          +
          RawTypegetRawTypeVersion(java.lang.String className, + int version) +
          Returns the type information for a given version of a given class, + or null if the given version of the class is unknown.
          +
          booleanisOpen() +
          Returns whether the model is associated with an open store.
          +
          voidregisterClass(java.lang.Class persistentClass) +
          Registers a persistent class, most importantly, a PersistentProxy class or entity subclass.
          +
          java.lang.ClassresolveClass(java.lang.String className) +
          Should be called by entity model implementations instead of calling + Class.forName whenever loading an application class.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            EntityModel

            +
            protected EntityModel()
            +
            The default constructor for use by subclasses.
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + + + + + +
            +
          • +

            registerClass

            +
            public final void registerClass(java.lang.Class persistentClass)
            +
            Registers a persistent class, most importantly, a PersistentProxy class or entity subclass. Also registers an enum or + array class. + +

            Any persistent class , enum class or array may be registered in + advance of using it, to avoid the overhead of updating the catalog + database when an instance of the class is first stored. This method + must be called in three cases:

            +
              +
            1. to register all PersistentProxy classes, and
            2. +
            3. to register an entity subclass defining a secondary key, if getSubclassIndex is not called for the + subclass, and
            4. +
            5. to register all new enum or array classes, if the these enum or + array classes are unknown for DPL but will be used in a Converter + mutation. +
            6. +
            + +

            For example:

            + +
            + EntityModel model = new AnnotationModel();
            + model.registerClass(MyProxy.class);
            + model.registerClass(MyEntitySubclass.class);
            + model.registerClass(MyEnum.class);
            + model.registerClass(MyArray[].class);
            +
            + StoreConfig config = new StoreConfig();
            + ...
            + config.setModel(model);
            +
            + EntityStore store = new EntityStore(..., config);
            + +

            This method must be called before opening a store based on this + model.

            +
            +
            Parameters:
            +
            persistentClass - the class to register.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is associated with an open store.
            +
            java.lang.IllegalArgumentException - if the given class is not persistent + or has a different class loader than previously registered classes.
            +
            +
          • +
          + + + +
            +
          • +

            getClassMetadata

            +
            public abstract ClassMetadata getClassMetadata(java.lang.String className)
            +
            Returns the metadata for a given persistent class name, including proxy + classes and entity classes.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            Returns:
            +
            the metadata or null if the class is not persistent or does not + exist.
            +
            +
          • +
          + + + +
            +
          • +

            getEntityMetadata

            +
            public abstract EntityMetadata getEntityMetadata(java.lang.String className)
            +
            Returns the metadata for a given entity class name.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            Returns:
            +
            the metadata or null if the class is not an entity class or does + not exist.
            +
            +
          • +
          + + + +
            +
          • +

            getKnownClasses

            +
            public abstract java.util.Set<java.lang.String> getKnownClasses()
            +
            Returns the names of all known persistent classes. A type becomes known + when an instance of the type is stored for the first time or metadata or + type information is queried for a specific class name.
            +
            +
            Returns:
            +
            an unmodifiable set of class names.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is not associated with an open store.
            +
            +
          • +
          + + + +
            +
          • +

            getKnownSpecialClasses

            +
            public java.util.Set<java.lang.String> getKnownSpecialClasses()
            +
            Returns the names of all known persistent enum and array classes that + may be used to store persistent data. This differs from + getKnownClasses(), which does not return enum and array classes + because they have no metadata.
            +
            +
            Returns:
            +
            an unmodifiable set of enum and array class names.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is not associated with an open store.
            +
            +
          • +
          + + + +
            +
          • +

            getRawType

            +
            public final RawType getRawType(java.lang.String className)
            +
            Returns the type information for the current version of a given class, + or null if the class is not currently persistent.
            +
            +
            Parameters:
            +
            className - the name of the current version of the class.
            +
            Returns:
            +
            the RawType.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is not associated with an open store.
            +
            +
          • +
          + + + +
            +
          • +

            getRawTypeVersion

            +
            public final RawType getRawTypeVersion(java.lang.String className,
            +                                       int version)
            +
            Returns the type information for a given version of a given class, + or null if the given version of the class is unknown.
            +
            +
            Parameters:
            +
            className - the name of the latest version of the class.
            +
            version - the desired version of the class.
            +
            Returns:
            +
            the RawType.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is not associated with an open store.
            +
            +
          • +
          + + + +
            +
          • +

            getAllRawTypeVersions

            +
            public final java.util.List<RawType> getAllRawTypeVersions(java.lang.String className)
            +
            Returns all known versions of type information for a given class name, + or null if no persistent version of the class is known.
            +
            +
            Parameters:
            +
            className - the name of the latest version of the class.
            +
            Returns:
            +
            an unmodifiable list of types for the given class name in order + from most recent to least recent.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is not associated with an open store.
            +
            +
          • +
          + + + +
            +
          • +

            getAllRawTypes

            +
            public final java.util.List<RawType> getAllRawTypes()
            +
            Returns all versions of all known types.
            +
            +
            Returns:
            +
            an unmodifiable list of types.
            +
            Throws:
            +
            java.lang.IllegalStateException - if this method is called for a model that + is not associated with an open store.
            +
            +
          • +
          + + + +
            +
          • +

            convertRawObject

            +
            public final java.lang.Object convertRawObject(RawObject raw)
            +
            Converts a given raw object to a live object according to the current + class definitions. + +

            The given raw object must conform to the current class definitions. + However, the raw type (RawObject.getType()) is allowed to be from + a different store, as long as the class names and the value types match. + This allows converting raw objects that are read from one store to live + objects in another store, for example, in a conversion program.

            +
            +
            Parameters:
            +
            raw - the RawObject.
            +
            Returns:
            +
            the live object.
            +
            +
          • +
          + + + +
            +
          • +

            resolveClass

            +
            public java.lang.Class resolveClass(java.lang.String className)
            +                             throws java.lang.ClassNotFoundException
            +
            Should be called by entity model implementations instead of calling + Class.forName whenever loading an application class. This method honors + the BDB JE environment's ClassLoader property and uses ClassResolver to implement the class loading policy.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            Returns:
            +
            the Class.
            +
            Throws:
            +
            java.lang.ClassNotFoundException - if the class is not found.
            +
            +
          • +
          + + + +
            +
          • +

            classForName

            +
            public static java.lang.Class classForName(java.lang.String className)
            +                                    throws java.lang.ClassNotFoundException
            +
            Deprecated. use resolveClass(java.lang.String) instead. This method does not + use the environment's ClassLoader property.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            Returns:
            +
            the Class.
            +
            Throws:
            +
            java.lang.ClassNotFoundException - if the class is not found.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/FieldMetadata.html b/docs/java/com/sleepycat/persist/model/FieldMetadata.html new file mode 100644 index 0000000..27063cb --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/FieldMetadata.html @@ -0,0 +1,408 @@ + + + + + +FieldMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class FieldMetadata

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.model.FieldMetadata
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        Direct Known Subclasses:
        +
        PrimaryKeyMetadata, SecondaryKeyMetadata
        +
        +
        +
        +
        public class FieldMetadata
        +extends java.lang.Object
        +implements java.io.Serializable
        +
        The metadata for a key field. This class defines common properties for + singular and composite key fields. + +

        FieldMetadata objects are thread-safe. Multiple threads may + safely call the methods of a shared FieldMetadata object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          FieldMetadata(java.lang.String name, + java.lang.String className, + java.lang.String declaringClassName) +
          Used by an EntityModel to construct field metadata.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object other) 
          java.lang.StringgetClassName() +
          Returns the class name of the field type.
          +
          java.lang.StringgetDeclaringClassName() +
          Returns the name of the class where the field is declared.
          +
          java.lang.StringgetName() +
          Returns the field name.
          +
          inthashCode() 
          java.lang.StringtoString() 
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            FieldMetadata

            +
            public FieldMetadata(java.lang.String name,
            +                     java.lang.String className,
            +                     java.lang.String declaringClassName)
            +
            Used by an EntityModel to construct field metadata.
            +
            +
            Parameters:
            +
            name - the field name.
            +
            className - the class name.
            +
            declaringClassName - the name of the class where the field is + declared.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getName

            +
            public java.lang.String getName()
            +
            Returns the field name.
            +
            +
            Returns:
            +
            the field name.
            +
            +
          • +
          + + + +
            +
          • +

            getClassName

            +
            public java.lang.String getClassName()
            +
            Returns the class name of the field type.
            +
            +
            Returns:
            +
            the class name.
            +
            +
          • +
          + + + +
            +
          • +

            getDeclaringClassName

            +
            public java.lang.String getDeclaringClassName()
            +
            Returns the name of the class where the field is declared.
            +
            +
            Returns:
            +
            the name of the class where the field is declared.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/KeyField.html b/docs/java/com/sleepycat/persist/model/KeyField.html new file mode 100644 index 0000000..0b23a92 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/KeyField.html @@ -0,0 +1,323 @@ + + + + + +KeyField (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type KeyField

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=FIELD)
        +public @interface KeyField
        +
        Indicates the sorting position of a key field in a composite key class when + the Comparable interface is not implemented. The KeyField + integer value specifies the sort order of this field within the set of + fields in the composite key. + +

        If the field type of a PrimaryKey or SecondaryKey is a + composite key class containing more than one key field, then a KeyField annotation must be present on each non-transient instance field of + the composite key class. The KeyField value must be a number + between one and the number of non-transient instance fields declared in the + composite key class.

        + +

        Note that a composite key class is a flat container for one or more + simple type fields. All non-transient instance fields in the composite key + class are key fields, and its superclass must be Object.

        + +

        For example:

        +
        +  @Entity
        +  class Animal {
        +      @PrimaryKey
        +      Classification classification;
        +      ...
        +  }
        +
        +  @Persistent
        +  class Classification {
        +      @KeyField(1) String kingdom;
        +      @KeyField(2) String phylum;
        +      @KeyField(3) String clazz;
        +      @KeyField(4) String order;
        +      @KeyField(5) String family;
        +      @KeyField(6) String genus;
        +      @KeyField(7) String species;
        +      @KeyField(8) String subspecies;
        +      ...
        +  }
        + +

        This causes entities to be sorted first by kingdom, then by + phylum within kingdom, and so on.

        + +

        The fields in a composite key class may not be null.

        + +

        Custom Sort Order

        + +

        To override the default sort order, a composite key class may implement + the Comparable interface. This allows overriding the sort order and + is therefore useful even when there is only one key field in the composite + key class. For example, the following class sorts Strings using a Canadian + collator:

        + +
        +  import java.text.Collator;
        +  import java.util.Locale;
        +
        +  @Entity
        +  class Animal {
        +      ...
        +      @SecondaryKey(relate=ONE_TO_ONE)
        +      CollatedString canadianName;
        +      ...
        +  }
        +
        +  @Persistent
        +  class CollatedString implements Comparable<CollatedString> {
        +
        +      static Collator collator = Collator.getInstance(Locale.CANADA);
        +
        +      @KeyField(1)
        +      String value;
        +
        +      CollatedString(String value) { this.value = value; }
        +
        +      private CollatedString() {}
        +
        +      public int compareTo(CollatedString o) {
        +          return collator.compare(value, o.value);
        +      }
        +  }
        + +

        Several important rules should be considered when implementing a custom + comparison method. Failure to follow these rules may result in the primary + or secondary index becoming unusable; in other words, the store will not be + able to function.

        +
          +
        1. The comparison method must always return the same result, given the same + inputs. The behavior of the comparison method must not change over + time.
        2. +
        3. A corollary to the first rule is that the behavior of the comparison + method must not be dependent on state which may change over time. For + example, if the above collation method used the default Java locale, and the + default locale is changed, then the sort order will change.
        4. +
        5. The comparison method must not assume that it is called after the store + has been opened. With Berkeley DB Java Edition, the comparison method is + called during database recovery, which occurs in the Environment + constructor.
        6. +
        7. The comparison method must not assume that it will only be called with + keys that are currently present in the database. The comparison method will + occasionally be called with deleted keys or with keys for records that were + not part of a committed transaction.
        8. +
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Required Element Summary

          + + + + + + + + + + +
          Required Elements 
          Modifier and TypeRequired Element and Description
          intvalue 
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Element Detail

          + + + +
            +
          • +

            value

            +
            public abstract int value
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/NotPersistent.html b/docs/java/com/sleepycat/persist/model/NotPersistent.html new file mode 100644 index 0000000..da3449c --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/NotPersistent.html @@ -0,0 +1,194 @@ + + + + + +NotPersistent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type NotPersistent

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=FIELD)
        +public @interface NotPersistent
        +
        Overrides the default rules for field persistence and defines a field as + being non-persistent even when it is not declared with the + transient keyword. + +

        By default, the persistent fields of a class are all declared instance + fields that are non-transient (are not declared with the + transient keyword). The default rules may be overridden by + specifying the NotPersistent or NotTransient annotation.

        + +

        For example, the following field is non-transient (persistent) with + respect to Java serialization but is transient with respect to the DPL.

        + +
        +      @NotPersistent
        +      int myField;
        + }
        + 
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        NotTransient
        +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/NotTransient.html b/docs/java/com/sleepycat/persist/model/NotTransient.html new file mode 100644 index 0000000..f1d0b02 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/NotTransient.html @@ -0,0 +1,194 @@ + + + + + +NotTransient (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type NotTransient

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=FIELD)
        +public @interface NotTransient
        +
        Overrides the default rules for field persistence and defines a field as + being persistent even when it is declared with the transient + keyword. + +

        By default, the persistent fields of a class are all declared instance + fields that are non-transient (are not declared with the + transient keyword). The default rules may be overridden by + specifying the NotPersistent or NotTransient annotation.

        + +

        For example, the following field is transient with respect to Java + serialization but is persistent with respect to the DPL.

        + +
        +      @NotTransient
        +      transient int myField;
        + }
        + 
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        NotPersistent
        +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/Persistent.html b/docs/java/com/sleepycat/persist/model/Persistent.html new file mode 100644 index 0000000..6af077a --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/Persistent.html @@ -0,0 +1,271 @@ + + + + + +Persistent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type Persistent

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=TYPE)
        +public @interface Persistent
        +
        Identifies a persistent class that is not an Entity class or a + simple type.
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Optional Element Summary

          + + + + + + + + + + + + + + +
          Optional Elements 
          Modifier and TypeOptional Element and Description
          java.lang.ClassproxyFor +
          Specifies the class that is proxied by this PersistentProxy + instance.
          +
          intversion +
          Identifies a new version of a class when an incompatible class change + has been made.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Element Detail

          + + + +
            +
          • +

            version

            +
            public abstract int version
            +
            Identifies a new version of a class when an incompatible class change + has been made.
            +
            +
            Returns:
            +
            the version.
            +
            See Also:
            +
            Entity.version()
            +
            +
            +
            Default:
            +
            0
            +
            +
          • +
          +
        • +
        +
          +
        • + + +
            +
          • +

            proxyFor

            +
            public abstract java.lang.Class proxyFor
            +
            Specifies the class that is proxied by this PersistentProxy + instance.
            +
            +
            Returns:
            +
            the Class.
            +
            See Also:
            +
            PersistentProxy
            +
            +
            +
            Default:
            +
            void.class
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/PersistentProxy.html b/docs/java/com/sleepycat/persist/model/PersistentProxy.html new file mode 100644 index 0000000..1b0702d --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/PersistentProxy.html @@ -0,0 +1,356 @@ + + + + + +PersistentProxy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Interface PersistentProxy<T>

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface PersistentProxy<T>
        +
        Implemented by a proxy class to represent the persistent state of a + (non-persistent) proxied class. Normally classes that are outside the scope + of the developer's control must be proxied since they cannot be annotated, + and because it is desirable to insulate the stored format from changes to + the instance fields of the proxied class. This is useful for classes in the + standard Java libraries, for example. + +

        PersistentProxy objects are not required to be thread-safe. A + single thread will create and call the methods of a given PersistentProxy object.

        + +

        There are three requirements for a proxy class:

        +
          +
        1. It must implement the PersistentProxy interface.
        2. +
        3. It must be specified as a persistent proxy class in the entity model. + When using the AnnotationModel, a proxy class is indicated by the + Persistent annotation with the Persistent.proxyFor() + property.
        4. +
        5. It must be explicitly registered by calling EntityModel.registerClass(java.lang.Class) before opening the store.
        6. +
        + +

        In order to serialize an instance of the proxied class before it is + stored, an instance of the proxy class is created. The proxied instance is + then passed to the proxy's initializeProxy method. + When this method returns, the proxy instance contains the state of the + proxied instance. The proxy instance is then serialized and stored in the + same way as for any persistent object.

        + +

        When an instance of the proxy object is deserialized after it is + retrieved from storage, its convertProxy() method is called. The + instance of the proxied class returned by this method is then returned as a + field in the persistent instance.

        + +

        For example:

        +
        +  import java.util.Locale;
        +
        +  @Persistent(proxyFor=Locale.class)
        +  class LocaleProxy implements PersistentProxy<Locale> {
        +
        +      String language;
        +      String country;
        +      String variant;
        +
        +      private LocaleProxy() {}
        +
        +      public void initializeProxy(Locale object) {
        +          language = object.getLanguage();
        +          country = object.getCountry();
        +          variant = object.getVariant();
        +      }
        +
        +      public Locale convertProxy() {
        +          return new Locale(language, country, variant);
        +      }
        +  }
        + +

        The above definition allows the Locale class to be used in any + persistent class, for example:

        +
        +  @Persistent
        +  class LocalizedText {
        +      String text;
        +      Locale locale;
        +  }
        + +

        A proxied class may not be used as a superclass for a persistent class or + entity class. For example, the following is not allowed.

        +
        +  @Persistent
        +  class LocalizedText extends Locale { // NOT ALLOWED
        +      String text;
        +  }
        + +

        A proxy for proxied class P does not handle instances of subclasses of P. + To proxy a subclass of P, a separate proxy class is needed.

        + +

        Several built in proxy types + are used implicitly. An application defined proxy will be used instead of a + built-in proxy, if both exist for the same proxied class.

        + +

        With respect to class evolution, a proxy instance is no different than + any other persistent instance. When using a RawStore or Converter, only the raw data of the proxy instance will be visible. Raw + data for the proxied instance never exists.

        + +

        Currently a proxied object may not contain a reference to itself. For + simple proxied objects such as the Locale class shown above, this naturally + won't occur. But for proxied objects that are containers -- the built-in + Collection and Map classes for example -- this can occur if the container is + added as an element of itself. This should be avoided. If an attempt to + store such an object is made, an IllegalArgumentException will be + thrown.

        + +

        Note that a proxy class may not be a subclass of an entity class.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          TconvertProxy() +
          Returns a new proxied class instance to which the state of this proxy + instance has been copied.
          +
          voidinitializeProxy(T object) +
          Copies the state of a given proxied class instance to this proxy + instance.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + + + +
            +
          • +

            initializeProxy

            +
            void initializeProxy(T object)
            +
            Copies the state of a given proxied class instance to this proxy + instance.
            +
            +
            Parameters:
            +
            object - the proxied class instance.
            +
            +
          • +
          + + + +
            +
          • +

            convertProxy

            +
            T convertProxy()
            +
            Returns a new proxied class instance to which the state of this proxy + instance has been copied.
            +
            +
            Returns:
            +
            the new proxied class instance.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/PrimaryKey.html b/docs/java/com/sleepycat/persist/model/PrimaryKey.html new file mode 100644 index 0000000..717be1a --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/PrimaryKey.html @@ -0,0 +1,376 @@ + + + + + +PrimaryKey (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type PrimaryKey

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=FIELD)
        +public @interface PrimaryKey
        +
        Indicates the primary key field of an entity class. The value of the + primary key field is the unique identifier for the entity in a PrimaryIndex. + +

        PrimaryKey may appear on at most one declared field per + class.

        + +

        Primary key values may be automatically assigned as sequential integers + using a sequence(). In this case the type of the key field is + restricted to a simple integer type.

        + +

        A primary key field may not be null, unless it is being assigned from a + sequence.

        + +

        Key Field Types

        + +

        The type of a key field must either be one of the following:

        +
          +
        • Any of the simple types.
        • +
        • An enum type.
        • +
        • A composite key class containing one or more simple type or enum + fields.
        • +
        +

        Array types are not allowed.

        + +

        When using a composite key class, each field of the composite key class + must be annotated with KeyField to identify the storage order and + default sort order. See KeyField for an example and more + information on composite keys.

        + +

        Key Sort Order

        + +

        Key field types, being simple types, have a well defined and reasonable + default sort order, described below. This sort order is based on a storage + encoding that allows a fast byte-by-byte comparison.

        +
          +
        • All simple types except for String are encoded so that they are + sorted as expected, that is, as if the Comparable.compareTo(T) method + of their class (or, for primitives, their wrapper class) is called.
        • +
        • Strings are encoded as UTF-8 byte arrays. Zero (0x0000) character + values are UTF encoded as non-zero values, and therefore embedded zeros in + the string are supported. The sequence {0xC0,0x80} is used to + encode a zero character. This UTF encoding is the same one used by native + Java UTF libraries. However, this encoding of zero does impact the + lexicographical ordering, and zeros will not be sorted first (the natural + order) or last. For all character values other than zero, the default UTF + byte ordering is the same as the Unicode lexicographical character + ordering.
        • +
        + +

        When using a composite key class with more than one field, the sorting + order among fields is determined by the KeyField annotations. To + override the default sort order, you can use a composite key class that + implements Comparable. This allows overriding the sort order and is + therefore useful even when there is only one key field in the composite key + class. See Custom Sort Order + for more information on sorting of composite keys.

        + +

        Inherited Primary Key

        + +

        If it does not appear on a declared field in the entity class, PrimaryKey must appear on a field of an entity superclass. In the + following example, the primary key on the base class is used:

        + +
        + @Persistent
        + class BaseClass {
        +     @PrimaryKey
        +     long id;
        +     ...
        + }
        + @Entity
        + class Employee extends BaseClass {
        +     // inherits id primary key
        +     ...
        + }
        + +

        If more than one class with PrimaryKey is present in a class + hierarchy, the key in the most derived class is used. In this case, primary + key fields in superclasses are "shadowed" and are not persistent. In the + following example, the primary key in the base class is not used and is not + persistent:

        +
        + @Persistent
        + class BaseClass {
        +     @PrimaryKey
        +     long id;
        +     ...
        + }
        + @Entity
        + class Employee extends BaseClass {
        +     // overrides id primary key
        +     @PrimaryKey
        +     String uuid;
        +     ...
        + }
        + +

        Note that a PrimaryKey is not allowed on entity subclasses. The + following is illegal and will cause an IllegalArgumentException when + trying to store an Employee instance:

        +
        + @Entity
        + class Person {
        +     @PrimaryKey
        +     long id;
        +     ...
        + }
        + @Persistent
        + class Employee extends Person {
        +     @PrimaryKey
        +     String uuid;
        +     ...
        + }
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Optional Element Summary

          + + + + + + + + + + +
          Optional Elements 
          Modifier and TypeOptional Element and Description
          java.lang.Stringsequence +
          The name of a sequence from which to assign primary key values + automatically.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Element Detail

          + + + +
            +
          • +

            sequence

            +
            public abstract java.lang.String sequence
            +
            The name of a sequence from which to assign primary key values + automatically. If a non-empty string is specified, sequential integers + will be assigned from the named sequence. + +

            A single sequence may be used for more than one entity class by + specifying the same sequence name for each PrimaryKey. For + each named sequence, a Sequence will be used to + assign key values. For more information on configuring sequences, see + EntityStore.setSequenceConfig.

            + +

            To use a sequence, the type of the key field must be a primitive + integer type (byte, short, int or long) + or the primitive wrapper class for one of these types. A composite key + class may also be used to override sort order, but it may contain only a + single key field, and this field must have one of the types previously + mentioned.

            + +

            When an entity with a primary key sequence is stored using one of the + put methods in the PrimaryIndex, a new key will be + assigned if the primary key field in the entity instance is null (for a + reference type) or zero (for a primitive integer type). Specifying zero + for a primitive integer key field is allowed because the initial value + of the sequence is one (not zero) by default. If the sequence + configuration is changed such that zero is part of the sequence, then + the field type must be a primitive wrapper class and the field value + must be null to cause a new key to be assigned.

            + +

            When one of the put methods in the PrimaryIndex + is called and a new key is assigned, the assigned value is returned to + the caller via the key field of the entity object that is passed as a + parameter.

            +
            +
            Returns:
            +
            the sequence name or an empty string.
            +
            +
            +
            Default:
            +
            ""
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/PrimaryKeyMetadata.html b/docs/java/com/sleepycat/persist/model/PrimaryKeyMetadata.html new file mode 100644 index 0000000..37dad2c --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/PrimaryKeyMetadata.html @@ -0,0 +1,362 @@ + + + + + +PrimaryKeyMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class PrimaryKeyMetadata

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class PrimaryKeyMetadata
        +extends FieldMetadata
        +
        The metadata for a primary key field. A primary key may be specified with + the PrimaryKey annotation. + +

        PrimaryKeyMetadata objects are thread-safe. Multiple threads may + safely call the methods of a shared PrimaryKeyMetadata object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          PrimaryKeyMetadata(java.lang.String name, + java.lang.String className, + java.lang.String declaringClassName, + java.lang.String sequenceName) +
          Used by an EntityModel to construct primary key metadata.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            PrimaryKeyMetadata

            +
            public PrimaryKeyMetadata(java.lang.String name,
            +                          java.lang.String className,
            +                          java.lang.String declaringClassName,
            +                          java.lang.String sequenceName)
            +
            Used by an EntityModel to construct primary key metadata.
            +
            +
            Parameters:
            +
            name - the field name.
            +
            className - the class name.
            +
            declaringClassName - the name of the class where the field is + declared.
            +
            sequenceName - the sequence name.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getSequenceName

            +
            public java.lang.String getSequenceName()
            +
            Returns the name of the sequence for assigning key values. This may be + specified using the PrimaryKey.sequence() annotation.
            +
            +
            Returns:
            +
            the sequence name.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            +
            Overrides:
            +
            equals in class FieldMetadata
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/Relationship.html b/docs/java/com/sleepycat/persist/model/Relationship.html new file mode 100644 index 0000000..2dd70fb --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/Relationship.html @@ -0,0 +1,411 @@ + + + + + +Relationship (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Enum Relationship

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Enum<Relationship>
        • +
        • +
            +
          • com.sleepycat.persist.model.Relationship
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable, java.lang.Comparable<Relationship>
        +
        +
        +
        +
        public enum Relationship
        +extends java.lang.Enum<Relationship>
        +
        Defines the relationship between instances of the entity class and the + secondary keys. This can be specified using a SecondaryKey.relate() + annotation.
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Summary

          + + + + + + + + + + + + + + + + + +
          Enum Constants 
          Enum Constant and Description
          MANY_TO_MANY +
          Relates many entities to many secondary keys.
          +
          MANY_TO_ONE +
          Relates many entities to one secondary key.
          +
          ONE_TO_MANY +
          Relates one entity to many secondary keys.
          +
          ONE_TO_ONE +
          Relates one entity to one secondary key.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static RelationshipvalueOf(java.lang.String name) +
          Returns the enum constant of this type with the specified name.
          +
          static Relationship[]values() +
          Returns an array containing the constants of this enum type, in +the order they are declared.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Enum

            +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Enum Constant Detail

          + + + +
            +
          • +

            MANY_TO_ONE

            +
            public static final Relationship MANY_TO_ONE
            +
            Relates many entities to one secondary key. + +

            The secondary index will have non-unique keys; in other words, + duplicates will be allowed.

            + +

            The secondary key field is singular, in other words, it may not be an + array or collection type.

            +
          • +
          + + + +
            +
          • +

            ONE_TO_MANY

            +
            public static final Relationship ONE_TO_MANY
            +
            Relates one entity to many secondary keys. + +

            The secondary index will have unique keys, in other words, duplicates + will not be allowed.

            + +

            The secondary key field must be an array or collection type.

            +
          • +
          + + + +
            +
          • +

            MANY_TO_MANY

            +
            public static final Relationship MANY_TO_MANY
            +
            Relates many entities to many secondary keys. + +

            The secondary index will have non-unique keys, in other words, + duplicates will be allowed.

            + +

            The secondary key field must be an array or collection type.

            +
          • +
          + + + +
            +
          • +

            ONE_TO_ONE

            +
            public static final Relationship ONE_TO_ONE
            +
            Relates one entity to one secondary key. + +

            The secondary index will have unique keys, in other words, duplicates + will not be allowed.

            + +

            The secondary key field is singular, in other words, it may not be an + array or collection type.

            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            values

            +
            public static Relationship[] values()
            +
            Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
            +for (Relationship c : Relationship.values())
            +    System.out.println(c);
            +
            +
            +
            Returns:
            +
            an array containing the constants of this enum type, in the order they are declared
            +
            +
          • +
          + + + +
            +
          • +

            valueOf

            +
            public static Relationship valueOf(java.lang.String name)
            +
            Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
            +
            +
            Parameters:
            +
            name - the name of the enum constant to be returned.
            +
            Returns:
            +
            the enum constant with the specified name
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
            +
            java.lang.NullPointerException - if the argument is null
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/SecondaryKey.html b/docs/java/com/sleepycat/persist/model/SecondaryKey.html new file mode 100644 index 0000000..1fd84e9 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/SecondaryKey.html @@ -0,0 +1,495 @@ + + + + + +SecondaryKey (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Annotation Type SecondaryKey

      +
      +
      +
      +
        +
      • +
        +
        +
        @Documented
        + @Retention(value=RUNTIME)
        + @Target(value=FIELD)
        +public @interface SecondaryKey
        +
        Indicates a secondary key field of an entity class. The value of the + secondary key field is a unique or non-unique identifier for the entity and + is accessed via a SecondaryIndex. + +

        SecondaryKey may appear on any number of fields in an entity + class, subclasses and superclasses. For a secondary key field in the entity + class or one of its superclasses, all entity instances will be indexed by + that field (if it is non-null). For a secondary key field in an entity + subclass, only instances of that subclass will be indexed by that field (if + it is non-null).

        + +

        If a secondary key field is null, the entity will not be indexed by that + key. In other words, the entity cannot be queried by that secondary key nor + can the entity be found by iterating through the secondary index.

        + +

        For a given entity class and its superclasses and subclasses, no two + secondary keys may have the same name. By default, the field name + identifies the secondary key and the secondary index for a given entity + class. name() may be specified to override this default.

        + +

        Using relate(), instances of the entity class are related to + secondary keys in a many-to-one, one-to-many, many-to-many, or one-to-one + relationship. This required property specifies the cardinality of + each side of the relationship.

        + +

        A secondary key may optionally be used to form a relationship with + instances of another entity class using relatedEntity() and onRelatedEntityDelete(). This establishes foreign key constraints + for the secondary key.

        + +

        The secondary key field type must be a Set, Collection or array type when + a x-to-many relationship is used or a singular type when an + x-to-one relationship is used; see relate().

        + +

        The field type (or element type, when a Set, Collection or array type is + used) of a secondary key field must follow the same rules as for a + primary key type. The key sort order is also the same.

        + +

        For a secondary key field with a collection type, a type parameter must + be used to specify the element type. For example Collection<String> + is allowed but Collection is not.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Required Element Summary

          + + + + + + + + + + +
          Required Elements 
          Modifier and TypeRequired Element and Description
          Relationshiprelate +
          Defines the relationship between instances of the entity class and the + secondary keys.
          +
          +
        • +
        + +
          +
        • + + +

          Optional Element Summary

          + + + + + + + + + + + + + + + + + + +
          Optional Elements 
          Modifier and TypeOptional Element and Description
          java.lang.Stringname +
          Specifies the name of the key in order to use a name that is different + than the field name.
          +
          DeleteActiononRelatedEntityDelete +
          Specifies the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity.
          +
          java.lang.ClassrelatedEntity +
          Specifies the entity to which this entity is related, for establishing + foreign key constraints.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Element Detail

          + + + +
            +
          • +

            relate

            +
            public abstract Relationship relate
            +
            Defines the relationship between instances of the entity class and the + secondary keys. + +

            The table below summarizes how to create all four variations of + relationships.

            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + +
            RelationshipField typeKey typeExample
            Relationship.ONE_TO_ONESingularUniqueA person record with a unique social security number + key.
            Relationship.MANY_TO_ONESingularDuplicatesA person record with a non-unique employer key.
            Relationship.ONE_TO_MANYSet/Collection/arrayUniqueA person record with multiple unique email address keys.
            Relationship.MANY_TO_MANYSet/Collection/arrayDuplicatesA person record with multiple non-unique organization + keys.
            +
            + +

            For a many-to-x relationship, the secondary index will + have non-unique keys; in other words, duplicates will be allowed. + Conversely, for one-to-x relationship, the secondary index + will have unique keys.

            + +

            For a x-to-one relationship, the secondary key field is + singular; in other words, it may not be a Set, Collection or array type. + Conversely, for a x-to-many relationship, the secondary key + field must be a Set, Collection or array type. A collection type is any + implementation of Collection.

            + +

            For a x-to-many relationship, the field type should normally + be Set (or a subtype of this interface). This + accurately expresses the fact that an Entity may not have two identical + secondary keys. For flexibility, a Collection (or a + subtype of this interface) or an array type may also be used. In that + case, any duplicate key values in the Collection or array are + ignored.

            +
            +
            Returns:
            +
            the Relationship.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +
            +
          • +

            relatedEntity

            +
            public abstract java.lang.Class relatedEntity
            +
            Specifies the entity to which this entity is related, for establishing + foreign key constraints. Values of this secondary key will be + constrained to the set of primary key values for the given entity class. + +

            The given class must be an entity class. This class is called the + related entity or foreign entity.

            + +

            When a related entity class is specified, a check (foreign key + constraint) is made every time a new secondary key value is stored for + this entity, and every time a related entity is deleted.

            + +

            Whenever a new secondary key value is stored for this entity, it is + checked to ensure it exists as a primary key value of the related + entity. If it does not, an exception is thrown by the PrimaryIndex put method. + + On BDB JE, a ForeignConstraintException will be + thrown. + +

            + +

            Whenever a related entity is deleted and its primary key value exists + as a secondary key value for this entity, the action is taken that is + specified using the onRelatedEntityDelete() property.

            + +

            Together, these two checks guarantee that a secondary key value for + this entity will always exist as a primary key value for the related + entity. Note, however, that a transactional store must be configured + to guarantee this to be true in the face of a crash; see StoreConfig.setTransactional(boolean).

            +
            +
            Returns:
            +
            the related entity class, or void.class if none is specified.
            +
            +
            +
            Default:
            +
            void.class
            +
            +
          • +
          +
        • +
        +
          +
        • + + +
            +
          • +

            onRelatedEntityDelete

            +
            public abstract DeleteAction onRelatedEntityDelete
            +
            Specifies the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity. + +

            Note: This property only applies when relatedEntity() + is specified to define the related entity.

            + +

            The default action, ABORT, means that an + exception is thrown in order to abort the current transaction. + + On BDB JE, a DeleteConstraintException is + thrown. + +

            + +

            If CASCADE is specified, then this + entity will be deleted also. This in turn could trigger further + deletions, causing a cascading effect.

            + +

            If NULLIFY is specified, then the + secondary key in this entity is set to null and this entity is updated. + If the key field type is singular, the field value is set to null; + therefore, to specify NULLIFY for a singular key field type, a + primitive wrapper type must be used instead of a primitive type. If the + key field type is an array or collection type, the key is deleted from + the array (the array is resized) or from the collection (using Collection.remove).

            +
            +
            Returns:
            +
            the DeleteAction, or DeleteAction.ABORT if none is + specified.
            +
            +
            +
            Default:
            +
            com.sleepycat.persist.model.DeleteAction.ABORT
            +
            +
          • +
          +
        • +
        +
          +
        • + + +
            +
          • +

            name

            +
            public abstract java.lang.String name
            +
            Specifies the name of the key in order to use a name that is different + than the field name. + +

            This is convenient when prefixes or suffices are used on field names. + For example:

            +
            +  class Person {
            +      @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Person.class, name="parentSsn")
            +      String m_parentSsn;
            +  }
            + +

            It can also be used to uniquely name a key when multiple secondary + keys for a single entity class have the same field name. For example, + an entity class and its subclass may both have a field named 'date', + and both fields are used as secondary keys. The name property + can be specified for one or both fields to give each key a unique + name.

            +
            +
            Returns:
            +
            the key name that overrides the field name, or empty string if + none is specified.
            +
            +
            +
            Default:
            +
            ""
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/SecondaryKeyMetadata.html b/docs/java/com/sleepycat/persist/model/SecondaryKeyMetadata.html new file mode 100644 index 0000000..b47b1a8 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/SecondaryKeyMetadata.html @@ -0,0 +1,463 @@ + + + + + +SecondaryKeyMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.model
      +

      Class SecondaryKeyMetadata

      +
      +
      + +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Serializable
        +
        +
        +
        +
        public class SecondaryKeyMetadata
        +extends FieldMetadata
        +
        The metadata for a secondary key field. A secondary key may be specified + with the SecondaryKey annotation. + +

        SecondaryKeyMetadata objects are thread-safe. Multiple threads + may safely call the methods of a shared SecondaryKeyMetadata + object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          SecondaryKeyMetadata(java.lang.String name, + java.lang.String className, + java.lang.String declaringClassName, + java.lang.String elementClassName, + java.lang.String keyName, + Relationship relationship, + java.lang.String relatedEntity, + DeleteAction deleteAction) +
          Used by an EntityModel to construct secondary key metadata.
          +
          +
        • +
        + + +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            SecondaryKeyMetadata

            +
            public SecondaryKeyMetadata(java.lang.String name,
            +                            java.lang.String className,
            +                            java.lang.String declaringClassName,
            +                            java.lang.String elementClassName,
            +                            java.lang.String keyName,
            +                            Relationship relationship,
            +                            java.lang.String relatedEntity,
            +                            DeleteAction deleteAction)
            +
            Used by an EntityModel to construct secondary key metadata.
            +
            +
            Parameters:
            +
            name - the field name.
            +
            className - the class name.
            +
            declaringClassName - the name of the class where the field is + declared.
            +
            elementClassName - the element class name.
            +
            keyName - the key name.
            +
            relationship - the Relationship.
            +
            relatedEntity - the class name of the related (foreign) entity.
            +
            deleteAction - the DeleteAction.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getElementClassName

            +
            public java.lang.String getElementClassName()
            +
            Returns the class name of the array or collection element for a ONE_TO_MANY or MANY_TO_MANY relationship, or null for a + Relationship#ONE_TO_ONE ONE_TO_ONE} or MANY_TO_ONE relationship.
            +
            +
            Returns:
            +
            the element class name.
            +
            +
          • +
          + + + +
            +
          • +

            getKeyName

            +
            public java.lang.String getKeyName()
            +
            Returns the key name, which may be different from the field name.
            +
            +
            Returns:
            +
            the key name.
            +
            +
          • +
          + + + +
            +
          • +

            getRelationship

            +
            public Relationship getRelationship()
            +
            Returns the relationship between instances of the entity class and the + secondary keys. This may be specified using the SecondaryKey.relate() annotation.
            +
            +
            Returns:
            +
            the Relationship.
            +
            +
          • +
          + + + +
            +
          • +

            getRelatedEntity

            +
            public java.lang.String getRelatedEntity()
            +
            Returns the class name of the related (foreign) entity, for which + foreign key constraints are specified using the SecondaryKey.relatedEntity() annotation.
            +
            +
            Returns:
            +
            the class name of the related (foreign) entity.
            +
            +
          • +
          + + + +
            +
          • +

            getDeleteAction

            +
            public DeleteAction getDeleteAction()
            +
            Returns the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity. + This may be specified using the SecondaryKey.onRelatedEntityDelete() annotation.
            +
            +
            Returns:
            +
            the DeleteAction.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            +
            Overrides:
            +
            equals in class FieldMetadata
            +
            +
          • +
          + + + + +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/AnnotationModel.html b/docs/java/com/sleepycat/persist/model/class-use/AnnotationModel.html new file mode 100644 index 0000000..c2c03f1 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/AnnotationModel.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.AnnotationModel (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.AnnotationModel

      +
      +
      No usage of com.sleepycat.persist.model.AnnotationModel
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/ClassEnhancer.html b/docs/java/com/sleepycat/persist/model/class-use/ClassEnhancer.html new file mode 100644 index 0000000..310d8d3 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/ClassEnhancer.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.ClassEnhancer (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.ClassEnhancer

      +
      +
      No usage of com.sleepycat.persist.model.ClassEnhancer
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/ClassEnhancerTask.html b/docs/java/com/sleepycat/persist/model/class-use/ClassEnhancerTask.html new file mode 100644 index 0000000..88e1e8f --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/ClassEnhancerTask.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.ClassEnhancerTask (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.ClassEnhancerTask

      +
      +
      No usage of com.sleepycat.persist.model.ClassEnhancerTask
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/ClassMetadata.html b/docs/java/com/sleepycat/persist/model/class-use/ClassMetadata.html new file mode 100644 index 0000000..3cc85e1 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/ClassMetadata.html @@ -0,0 +1,205 @@ + + + + + +Uses of Class com.sleepycat.persist.model.ClassMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.ClassMetadata

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/DeleteAction.html b/docs/java/com/sleepycat/persist/model/class-use/DeleteAction.html new file mode 100644 index 0000000..8b17909 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/DeleteAction.html @@ -0,0 +1,207 @@ + + + + + +Uses of Class com.sleepycat.persist.model.DeleteAction (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.DeleteAction

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/Entity.html b/docs/java/com/sleepycat/persist/model/class-use/Entity.html new file mode 100644 index 0000000..a2d896b --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/Entity.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.Entity (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.Entity

      +
      +
      No usage of com.sleepycat.persist.model.Entity
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/EntityMetadata.html b/docs/java/com/sleepycat/persist/model/class-use/EntityMetadata.html new file mode 100644 index 0000000..4efa4c2 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/EntityMetadata.html @@ -0,0 +1,204 @@ + + + + + +Uses of Class com.sleepycat.persist.model.EntityMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.EntityMetadata

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/EntityModel.html b/docs/java/com/sleepycat/persist/model/class-use/EntityModel.html new file mode 100644 index 0000000..f0e213b --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/EntityModel.html @@ -0,0 +1,274 @@ + + + + + +Uses of Class com.sleepycat.persist.model.EntityModel (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.EntityModel

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/FieldMetadata.html b/docs/java/com/sleepycat/persist/model/class-use/FieldMetadata.html new file mode 100644 index 0000000..05758bd --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/FieldMetadata.html @@ -0,0 +1,246 @@ + + + + + +Uses of Class com.sleepycat.persist.model.FieldMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.FieldMetadata

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/KeyField.html b/docs/java/com/sleepycat/persist/model/class-use/KeyField.html new file mode 100644 index 0000000..b7a70ee --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/KeyField.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.KeyField (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.KeyField

      +
      +
      No usage of com.sleepycat.persist.model.KeyField
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/NotPersistent.html b/docs/java/com/sleepycat/persist/model/class-use/NotPersistent.html new file mode 100644 index 0000000..508dcd0 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/NotPersistent.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.NotPersistent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.NotPersistent

      +
      +
      No usage of com.sleepycat.persist.model.NotPersistent
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/NotTransient.html b/docs/java/com/sleepycat/persist/model/class-use/NotTransient.html new file mode 100644 index 0000000..6686d9e --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/NotTransient.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.NotTransient (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.NotTransient

      +
      +
      No usage of com.sleepycat.persist.model.NotTransient
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/Persistent.html b/docs/java/com/sleepycat/persist/model/class-use/Persistent.html new file mode 100644 index 0000000..df9bf83 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/Persistent.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.Persistent (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.Persistent

      +
      +
      No usage of com.sleepycat.persist.model.Persistent
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/PersistentProxy.html b/docs/java/com/sleepycat/persist/model/class-use/PersistentProxy.html new file mode 100644 index 0000000..bc79781 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/PersistentProxy.html @@ -0,0 +1,129 @@ + + + + + +Uses of Interface com.sleepycat.persist.model.PersistentProxy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.model.PersistentProxy

      +
      +
      No usage of com.sleepycat.persist.model.PersistentProxy
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/PrimaryKey.html b/docs/java/com/sleepycat/persist/model/class-use/PrimaryKey.html new file mode 100644 index 0000000..dad6284 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/PrimaryKey.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.PrimaryKey (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.PrimaryKey

      +
      +
      No usage of com.sleepycat.persist.model.PrimaryKey
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/PrimaryKeyMetadata.html b/docs/java/com/sleepycat/persist/model/class-use/PrimaryKeyMetadata.html new file mode 100644 index 0000000..1d865a7 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/PrimaryKeyMetadata.html @@ -0,0 +1,218 @@ + + + + + +Uses of Class com.sleepycat.persist.model.PrimaryKeyMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.PrimaryKeyMetadata

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/Relationship.html b/docs/java/com/sleepycat/persist/model/class-use/Relationship.html new file mode 100644 index 0000000..ddfa7d0 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/Relationship.html @@ -0,0 +1,207 @@ + + + + + +Uses of Class com.sleepycat.persist.model.Relationship (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.Relationship

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/SecondaryKey.html b/docs/java/com/sleepycat/persist/model/class-use/SecondaryKey.html new file mode 100644 index 0000000..9175a11 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/SecondaryKey.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.model.SecondaryKey (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.SecondaryKey

      +
      +
      No usage of com.sleepycat.persist.model.SecondaryKey
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/class-use/SecondaryKeyMetadata.html b/docs/java/com/sleepycat/persist/model/class-use/SecondaryKeyMetadata.html new file mode 100644 index 0000000..a2c594c --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/class-use/SecondaryKeyMetadata.html @@ -0,0 +1,220 @@ + + + + + +Uses of Class com.sleepycat.persist.model.SecondaryKeyMetadata (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.model.SecondaryKeyMetadata

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/package-frame.html b/docs/java/com/sleepycat/persist/model/package-frame.html new file mode 100644 index 0000000..a307d15 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/package-frame.html @@ -0,0 +1,47 @@ + + + + + +com.sleepycat.persist.model (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.persist.model

      + + + diff --git a/docs/java/com/sleepycat/persist/model/package-summary.html b/docs/java/com/sleepycat/persist/model/package-summary.html new file mode 100644 index 0000000..838de7b --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/package-summary.html @@ -0,0 +1,310 @@ + + + + + +com.sleepycat.persist.model (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.persist.model

      +
      +
      Annotations for defining a persistent object model.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        PersistentProxy<T> +
        Implemented by a proxy class to represent the persistent state of a + (non-persistent) proxied class.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        AnnotationModel +
        The default annotation-based entity model.
        +
        ClassEnhancer +
        Enhances the bytecode of persistent classes to provide efficient access to + fields and constructors, and to avoid special security policy settings for + accessing non-public members.
        +
        ClassEnhancerTask +
        An ant task for running the ClassEnhancer.
        +
        ClassMetadata +
        The metadata for a persistent class.
        +
        EntityMetadata +
        The metadata for a persistent entity class.
        +
        EntityModel +
        The base class for classes that provide entity model metadata.
        +
        FieldMetadata +
        The metadata for a key field.
        +
        PrimaryKeyMetadata +
        The metadata for a primary key field.
        +
        SecondaryKeyMetadata +
        The metadata for a secondary key field.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + +
        Enum Summary 
        EnumDescription
        DeleteAction +
        Specifies the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity.
        +
        Relationship +
        Defines the relationship between instances of the entity class and the + secondary keys.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Annotation Types Summary 
        Annotation TypeDescription
        Entity +
        Indicates a persistent entity class.
        +
        KeyField +
        Indicates the sorting position of a key field in a composite key class when + the Comparable interface is not implemented.
        +
        NotPersistent +
        Overrides the default rules for field persistence and defines a field as + being non-persistent even when it is not declared with the + transient keyword.
        +
        NotTransient +
        Overrides the default rules for field persistence and defines a field as + being persistent even when it is declared with the transient + keyword.
        +
        Persistent +
        Identifies a persistent class that is not an Entity class or a + simple type.
        +
        PrimaryKey +
        Indicates the primary key field of an entity class.
        +
        SecondaryKey +
        Indicates a secondary key field of an entity class.
        +
        +
      • +
      + + + +

      Package com.sleepycat.persist.model Description

      +
      Annotations for defining a persistent object model.
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/package-tree.html b/docs/java/com/sleepycat/persist/model/package-tree.html new file mode 100644 index 0000000..a2fd4a1 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/package-tree.html @@ -0,0 +1,191 @@ + + + + + +com.sleepycat.persist.model Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.persist.model

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      +
        +
      • java.lang.Object +
          +
        • com.sleepycat.persist.model.ClassEnhancer (implements java.lang.instrument.ClassFileTransformer)
        • +
        • com.sleepycat.persist.model.ClassMetadata (implements java.io.Serializable)
        • +
        • com.sleepycat.persist.model.EntityMetadata (implements java.io.Serializable)
        • +
        • com.sleepycat.persist.model.EntityModel + +
        • +
        • com.sleepycat.persist.model.FieldMetadata (implements java.io.Serializable) + +
        • +
        • org.apache.tools.ant.ProjectComponent (implements java.lang.Cloneable) + +
        • +
        +
      • +
      +

      Interface Hierarchy

      + +

      Annotation Type Hierarchy

      +
        +
      • com.sleepycat.persist.model.NotTransient (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.Entity (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.KeyField (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.PrimaryKey (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.SecondaryKey (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.Persistent (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.NotPersistent (implements java.lang.annotation.Annotation)
      • +
      +

      Enum Hierarchy

      +
        +
      • java.lang.Object +
          +
        • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/model/package-use.html b/docs/java/com/sleepycat/persist/model/package-use.html new file mode 100644 index 0000000..44de216 --- /dev/null +++ b/docs/java/com/sleepycat/persist/model/package-use.html @@ -0,0 +1,283 @@ + + + + + +Uses of Package com.sleepycat.persist.model (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.persist.model

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/package-frame.html b/docs/java/com/sleepycat/persist/package-frame.html new file mode 100644 index 0000000..39a1787 --- /dev/null +++ b/docs/java/com/sleepycat/persist/package-frame.html @@ -0,0 +1,38 @@ + + + + + +com.sleepycat.persist (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.persist

      + + + diff --git a/docs/java/com/sleepycat/persist/package-summary.html b/docs/java/com/sleepycat/persist/package-summary.html new file mode 100644 index 0000000..d82faad --- /dev/null +++ b/docs/java/com/sleepycat/persist/package-summary.html @@ -0,0 +1,837 @@ + + + + + +com.sleepycat.persist (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.persist

      +
      +
      The Direct Persistence Layer (DPL) adds a persistent object model to the +Berkeley DB transactional engine.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        EntityCursor<V> +
        Traverses entity values or key values and allows deleting or updating the + entity at the current cursor position.
        +
        EntityIndex<K,V> +
        The interface for accessing keys and entities via a primary or secondary + index.
        +
        ForwardCursor<V> +
        Cursor operations limited to traversing forward.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        EntityJoin<PK,E> +
        Performs an equality join on two or more secondary keys.
        +
        EntityResult<V> +
        Used to return an entity value from a 'get' operation along with an + OperationResult.
        +
        EntityStore +
        A store for managing persistent entity objects.
        +
        PrimaryIndex<PK,E> +
        The primary index for an entity class and its primary key.
        +
        SecondaryIndex<SK,PK,E> +
        The secondary index for an entity class and a secondary key.
        +
        StoreConfig +
        Configuration properties used with an EntityStore or RawStore.
        +
        StoreConfigBeanInfo 
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + +
        Exception Summary 
        ExceptionDescription
        IndexNotAvailableException +
        Thrown by the getPrimaryIndex, getSecondaryIndex and getSubclassIndex when an index has not yet + been created.
        +
        StoreExistsException +
        Thrown by the EntityStore constructor when the ExclusiveCreate configuration parameter is + true and the store's internal catalog database already exists.
        +
        StoreNotFoundException +
        Thrown by the EntityStore constructor when the AllowCreate configuration parameter is false and + the store's internal catalog database does not exist.
        +
        +
      • +
      + + + +

      Package com.sleepycat.persist Description

      +
      The Direct Persistence Layer (DPL) adds a persistent object model to the +Berkeley DB transactional engine. + +

      Package Specification

      + + + +

      Introduction

      + +

      The Direct Persistence Layer (DPL) was designed to meet the following +requirements.

      +
        +
      • A type safe and convenient API is provided for accessing persistent +objects. The use of Java generic types, although optional, is fully exploited +to provide type safety. For example: +
        +PrimaryIndex<Long,Employer> employerById = ...;
        +long employerId = ...;
        +Employer employer = employerById.get(employerId);
        +
      • +
      • All Java types are allowed to be persistent without requiring that they +implement special interfaces. Persistent fields may be private, +package-private (default access), protected, or public. No +hand-coding of bindings is required. However, each persistent class must have +a default constructor. For example: +
        +@Persistent
        +class Address {
        +    String street;
        +    String city;
        +    String state;
        +    int zipCode;
        +    private Address() {}
        +}
        +
      • +
      • Bytecode enhancement provides fully optimized bindings that do not use Java +reflection.
      • +
      • It is easy to define primary and secondary keys. No external schema is +required and Java annotations may be used for defining all metadata. +Extensions may derive metadata from other sources. For example, the following +Employer class is defined as a persistent entity with a primary key field +id and the secondary key field name:
      • +
        +@Entity
        +class Employer {
        +
        +    @PrimaryKey(sequence="ID")
        +    long id;
        +
        +    @SecondaryKey(relate=ONE_TO_ONE)
        +    String name;
        +
        +    Address address;
        +
        +    private Employer() {}
        +}
        +
      • Interoperability with external components is supported via the Java +collections framework. Any primary or secondary index can be accessed using a +standard java.util collection. For example: +
        java.util.SortedMap<String,Employer> map = employerByName.sortedMap();
        +
      • +
      • Class evolution is explicitly supported. Compatible changes (adding fields +and type widening) are performed automatically and transparently. For example, +without any special configuration a street2 field may be added to the +Address class and the type of the zipCode field may be changed +from int to long: +
        +@Persistent
        +class Address {
        +    String street;
        +    String street2;
        +    String city;
        +    String state;
        +    long zipCode;
        +    private Address() {}
        +}
        +Many incompatible class changes, such as renaming fields or refactoring a +single class, can be performed using Mutations. Mutations are automatically +applied lazily as data is accessed, avoiding downtime to convert large +databases during a software upgrade. +

        Complex refactoring involving multiple classes may be performed using the a +store conversion. The DPL +always provides access to your data via a RawStore, no matter what +changes have been made to persistent classes.

        +
      • +
        +
      • The performance of the Berkeley DB transactional engine is not compromised. +Operations are internally mapped directly to the engine API, object bindings +are lightweight, and all engine tuning parameters are available. For example, +a "dirty read" may be performed using an optional LockMode parameter: +
        Employer employer = employerByName.get(null, "Gizmo Inc", LockMode.READ_UNCOMMITTED);
        +For high performance applications, DatabaseConfig parameters may be used to tune the performance of the Berkeley +DB engine. For example, the size of an internal Btree node can be specified +as follows: +
        +DatabaseConfig config = store.getPrimaryConfig(Employer.class);
        +config.setNodeMaxEntries(64);
        +store.setPrimaryConfig(config);
        +
      • +
      + +

      The Entity Model

      + +

      The DPL is intended for applications that represent persistent domain +objects using Java classes. An entity class is an ordinary Java class +that has a primary key and is stored and accessed using a primary index. It +may also have any number of secondary keys, and entities may be accessed by +secondary key using a secondary index.

      + +

      An entity class may be defined with the Entity annotation. For each entity class, +its primary key may be defined using the PrimaryKey annotation and any number of +secondary keys may be defined using the SecondaryKey annotation.

      + +

      In the following example, the Person.ssn (social security number) +field is the primary key and the Person.employerIds field is a +many-to-many secondary key.

      +
      +@Entity
      +class Person {
      +
      +    @PrimaryKey
      +    String ssn;
      +
      +    String name;
      +    Address address;
      +
      +    @SecondaryKey(relate=MANY_TO_MANY, relatedEntity=Employer.class)
      +    Set<Long> employerIds = new HashSet<Long>();
      +
      +    private Person() {} // For bindings
      +}
      + +

      A set of entity classes constitutes an entity model. In addition +to isolated entity classes, an entity model may contain relationships between +entities. Relationships may be defined using the SecondaryKey annotation. +Many-to-one, one-to-many, many-to-many and one-to-one relationships are +supported, as well as foreign key constraints.

      + +

      In the example above, a relationship between the Person and Employer entities is defined via the Person.employerIds field. The +relatedEntity=Employer.class annotation property establishes foreign +key constraints to guarantee that every element of the employerIds set +is a valid Employer primary key.

      + +

      For more information on the entity model, see the AnnotationModel and the Entity annotation.

      + +

      The root object in the DPL is the EntityStore. An entity store manages any number of objects for each entity +class defined in the model. The store provides access to the primary and +secondary indices for each entity class, for example:

      + +
      +EntityStore store = new EntityStore(...);
      +
      +PrimaryIndex<String,Person> personBySsn =
      +    store.getPrimaryIndex(String.class, Person.class);
      + +

      A brief example

      + +

      The following example shows how to define an entity model and how to store +and access persistent objects. Exception handling is omitted for brevity.

      + +
      +import java.io.File;
      +import java.util.HashSet;
      +import java.util.Set;
      +
      +import com.sleepycat.je.DatabaseException;
      +import com.sleepycat.je.Environment;
      +import com.sleepycat.je.EnvironmentConfig;
      +import com.sleepycat.persist.EntityCursor;
      +import com.sleepycat.persist.EntityIndex;
      +import com.sleepycat.persist.EntityStore;
      +import com.sleepycat.persist.PrimaryIndex;
      +import com.sleepycat.persist.SecondaryIndex;
      +import com.sleepycat.persist.StoreConfig;
      +import com.sleepycat.persist.model.Entity;
      +import com.sleepycat.persist.model.Persistent;
      +import com.sleepycat.persist.model.PrimaryKey;
      +import com.sleepycat.persist.model.SecondaryKey;
      +import static com.sleepycat.persist.model.DeleteAction.NULLIFY;
      +import static com.sleepycat.persist.model.Relationship.ONE_TO_ONE;
      +import static com.sleepycat.persist.model.Relationship.ONE_TO_MANY;
      +import static com.sleepycat.persist.model.Relationship.MANY_TO_ONE;
      +import static com.sleepycat.persist.model.Relationship.MANY_TO_MANY;
      +
      +// An entity class.
      +//
      +@Entity
      +class Person {
      +
      +    @PrimaryKey
      +    String ssn;
      +
      +    String name;
      +    Address address;
      +
      +    @SecondaryKey(relate=MANY_TO_ONE, relatedEntity=Person.class)
      +    String parentSsn;
      +
      +    @SecondaryKey(relate=ONE_TO_MANY)
      +    Set<String> emailAddresses = new HashSet<String>();
      +
      +    @SecondaryKey(relate=MANY_TO_MANY, relatedEntity=Employer.class,
      +                                       onRelatedEntityDelete=NULLIFY)
      +    Set<Long> employerIds = new HashSet<Long>();
      +
      +    Person(String name, String ssn, String parentSsn) {
      +        this.name = name;
      +        this.ssn = ssn;
      +        this.parentSsn = parentSsn;
      +    }
      +
      +    private Person() {} // For bindings
      +}
      +
      +// Another entity class.
      +//
      +@Entity
      +class Employer {
      +
      +    @PrimaryKey(sequence="ID")
      +    long id;
      +
      +    @SecondaryKey(relate=ONE_TO_ONE)
      +    String name;
      +
      +    Address address;
      +
      +    Employer(String name) {
      +        this.name = name;
      +    }
      +
      +    private Employer() {} // For bindings
      +}
      +
      +// A persistent class used in other classes.
      +//
      +@Persistent
      +class Address {
      +    String street;
      +    String city;
      +    String state;
      +    int zipCode;
      +    private Address() {} // For bindings
      +}
      +
      +// The data accessor class for the entity model.
      +//
      +class PersonAccessor {
      +
      +    // Person accessors
      +    //
      +    PrimaryIndex<String,Person> personBySsn;
      +    SecondaryIndex<String,String,Person> personByParentSsn;
      +    SecondaryIndex<String,String,Person> personByEmailAddresses;
      +    SecondaryIndex<Long,String,Person> personByEmployerIds;
      +
      +    // Employer accessors
      +    //
      +    PrimaryIndex<Long,Employer> employerById;
      +    SecondaryIndex<String,Long,Employer> employerByName;
      +
      +    // Opens all primary and secondary indices.
      +    //
      +    public PersonAccessor(EntityStore store)
      +        throws DatabaseException {
      +
      +        personBySsn = store.getPrimaryIndex(
      +            String.class, Person.class);
      +
      +        personByParentSsn = store.getSecondaryIndex(
      +            personBySsn, String.class, "parentSsn");
      +
      +        personByEmailAddresses = store.getSecondaryIndex(
      +            personBySsn, String.class, "emailAddresses");
      +
      +        personByEmployerIds = store.getSecondaryIndex(
      +            personBySsn, Long.class, "employerIds");
      +
      +        employerById = store.getPrimaryIndex(
      +            Long.class, Employer.class);
      +
      +        employerByName = store.getSecondaryIndex(
      +            employerById, String.class, "name"); 
      +    }
      +}
      +
      +// Open a transactional Berkeley DB engine environment.
      +//
      +EnvironmentConfig envConfig = new EnvironmentConfig();
      +envConfig.setAllowCreate(true);
      +envConfig.setTransactional(true);
      +Environment env = new Environment(new File("/my/data"), envConfig);
      +
      +// Open a transactional entity store.
      +//
      +StoreConfig storeConfig = new StoreConfig();
      +storeConfig.setAllowCreate(true);
      +storeConfig.setTransactional(true);
      +EntityStore store = new EntityStore(env, "PersonStore", storeConfig);
      +
      +// Initialize the data access object.
      +//
      +PersonAccessor dao = new PersonAccessor(store);
      +
      +// Add a parent and two children using the Person primary index.  Specifying a
      +// non-null parentSsn adds the child Person to the sub-index of children for
      +// that parent key.
      +//
      +dao.personBySsn.put(new Person("Bob Smith", "111-11-1111", null));
      +dao.personBySsn.put(new Person("Mary Smith", "333-33-3333", "111-11-1111"));
      +dao.personBySsn.put(new Person("Jack Smith", "222-22-2222", "111-11-1111"));
      +
      +// Print the children of a parent using a sub-index and a cursor.
      +//
      +EntityCursor<Person> children =
      +    dao.personByParentSsn.subIndex("111-11-1111").entities();
      +try {
      +    for (Person child : children) {
      +        System.out.println(child.ssn + ' ' + child.name);
      +    }
      +} finally {
      +    children.close();
      +}
      +
      +// Get Bob by primary key using the primary index.
      +//
      +Person bob = dao.personBySsn.get("111-11-1111");
      +assert bob != null;
      +
      +// Create two employers.  Their primary keys are assigned from a sequence.
      +//
      +Employer gizmoInc = new Employer("Gizmo Inc");
      +Employer gadgetInc = new Employer("Gadget Inc");
      +dao.employerById.put(gizmoInc);
      +dao.employerById.put(gadgetInc);
      +
      +// Bob has two jobs and two email addresses.
      +//
      +bob.employerIds.add(gizmoInc.id);
      +bob.employerIds.add(gadgetInc.id);
      +bob.emailAddresses.add("bob@bob.com");
      +bob.emailAddresses.add("bob@gmail.com");
      +
      +// Update Bob's record.
      +//
      +dao.personBySsn.put(bob);
      +
      +// Bob can now be found by both email addresses.
      +//
      +bob = dao.personByEmailAddresses.get("bob@bob.com");
      +assert bob != null;
      +bob = dao.personByEmailAddresses.get("bob@gmail.com");
      +assert bob != null;
      +
      +// Bob can also be found as an employee of both employers.
      +//
      +EntityIndex<String,Person> employees;
      +employees = dao.personByEmployerIds.subIndex(gizmoInc.id);
      +assert employees.contains("111-11-1111");
      +employees = dao.personByEmployerIds.subIndex(gadgetInc.id);
      +assert employees.contains("111-11-1111");
      +
      +// When an employer is deleted, the onRelatedEntityDelete=NULLIFY for the
      +// employerIds key causes the deleted ID to be removed from Bob's employerIds.
      +//
      +dao.employerById.delete(gizmoInc.id);
      +bob = dao.personBySsn.get("111-11-1111");
      +assert !bob.employerIds.contains(gizmoInc.id);
      +
      +store.close();
      +env.close();
      +
      +

      The example illustrates several characteristics of the DPL:

      +
        +
      • Persistent data and keys are defined in terms of instance fields. For +brevity the example does not show getter and setter methods, although these +would normally exist to provide encapsulation. The DPL accesses fields during +object serialization and deserialization, rather than calling getter/setter +methods, leaving business methods free to enforce arbitrary validation rules. +For example: +
        +@Persistent
        +public class ConstrainedValue {
        +
        +    private int min;
        +    private int max;
        +    private int value;
        +
        +    private ConstrainedValue() {} // For bindings
        +
        +    public ConstrainedValue(int min, int max) {
        +        this.min = min;
        +        this.max = max;
        +        value = min;
        +    }
        +
        +    public setValue(int value) {
        +        if (value < min || value > max) {
        +            throw new IllegalArgumentException("out of range");
        +        }
        +        this.value = value;
        +    }
        +}
        +
        +The above setValue method would not work if it were called during +object deserialization, since the order of setting fields is arbitrary. The +min and max fields may not be set before the value is +set. +
      • +
        +
      • The example creates a transactional store and therefore all operations are +transaction protected. Because no explicit transactions are used, auto-commit +is used implicitly. + +

        Explicit transactions may also be used to group multiple operations in a +single transaction, and all access methods have optional transaction +parameters. For example, the following two operations are performed atomically +in a transaction: +

        +Transaction txn = env.beginTransaction(null, null);
        +dao.employerById.put(txn, gizmoInc);
        +dao.employerById.put(txn, gadgetInc);
        +txn.commit();
        +
        +
      • +
      • To provide maximum performance, the DPL operations map directly to the +Btree operations of the Berkeley DB engine. Unlike other persistence +approaches, keys and indices are exposed for direct access and performance +tuning. +

        Queries are implemented by calling methods of the primary and secondary +indices. An EntityJoin class is also +available for performing equality joins. For example, the following code +queries all of Bob's children that work for Gizmo Inc: +

        +EntityJoin<String,Person> join = new EntityJoin(dao.personBySsn);
        +
        +join.addCondition(dao.personByParentSsn, "111-11-1111");
        +join.addCondition(dao.personByEmployerIds, gizmoInc.id);
        +
        +ForwardCursor<Person> results = join.entities();
        +try {
        +    for (Person person : results) {
        +        System.out.println(person.ssn + ' ' + person.name);
        +    }
        +} finally {
        +    results.close();
        +}
        +
      • +
      • Object relationships are based on keys. When a Person with a given +employer ID in its employerIds set is stored, the Person object +becomes part of the collection of employees for that employer. This collection +of employees is accessed using a SecondaryIndex.subIndex for the +employer ID, as shown below: +
        +EntityCursor<Person> employees =
        +    dao.personByEmployerIds.subIndex(gizmoInc.id).entities();
        +try {
        +    for (Person employee : employees) {
        +        System.out.println(employee.ssn + ' ' + employee.name);
        +    }
        +} finally {
        +    employees.close();
        +}
        +
      • +
      • Note that when Bob's employer is deleted in the example, the Person +object for Bob is refetched to see the change to its employerIds. This +is because objects are accessed by value, not by reference. In other words, no +object cache or "persistence context" is maintained by the DPL. The low level +caching of the embedded Berkeley DB engine, combined with lightweight object +bindings, provides maximum performance.
      • +
      + +

      Which API to use?

      + +

      The Berkeley DB engine has a Base API, a Collections API and a Direct Persistence Layer (DPL). Follow these guidelines if you are not sure +which API to use:

      +
        +
      • When Java classes are used to represent domain objects in an application, +the DPL is recommended. The more domain classes, the more value there is in +using annotations to define your schema.
      • +
        +
      • When porting an application between Berkeley DB and Berkeley DB Java +Edition, or when you've chosen not to use Java classes to represent domain +objects, then the Base API is recommended. You may also prefer to use this API +if you have very few domain classes.
      • +
        +
      • The Collections API is useful for interoperating with external components +because it conforms to the standard Java Collections Framework. It is +therefore useful in combination with both the Base API and the DPL. You may +prefer this API because it provides the familiar Java Collections +interface.
      • +
      + +

      Java 1.5 dependencies

      + +

      The DPL uses two features of Java 1.5: generic types and annotations. If +you wish to avoid using these two Java 1.5 features, the DPL provides options +for doing so.

      + +

      Generic Types

      + +

      Generic types are used to provide type safety, especially for the PrimaryIndex, SecondaryIndex, and EntityCursor classes. If you don't wish to +use generic types, you can simply not declare your index and cursor objects +using generic type parameters. This is the same as using the Java 1.5 +Collections Framework without using generic types.

      + +

      Annotations

      + +

      If you don't wish to use annotations, you can provide another source of +metadata by implementing an EntityModel class. For example, naming conventions, static members, or an XML +configuration file might be used as a source of metadata. However, if you +don't use annotations then you won't be able to use bytecode enhancement, which +is described next.

      + +

      Bytecode Enhancement

      + +

      The persistent fields of a class may be private, package-private, protected +or public. The DPL can access persistent fields either by bytecode enhancement +or by reflection.

      + +

      Bytecode enhancement may be used to fully optimize binding performance and +to avoid the use of Java reflection. In applications that are CPU bound, +avoiding Java reflection can have a significant performance impact.

      + +

      Bytecode enhancement may be performed either at runtime or at build time +(offline). When enhancement is performed at runtime, persistent classes are +enhanced as they are loaded. When enhancement is performed offline, class +files are enhanced during a post-compilation step. + +Both a main program and an Ant task are provided for performing offline +enhancement. + +Enhanced classes are used to efficiently access all fields and default +constructors, including non-public members.

      + +

      See ClassEnhancer for +bytecode enhancement configuration details.

      + +

      If bytecode enhancement is not used as described above, the DPL will use +reflection for accessing persistent fields and the default constructor. The +AccessibleObject.setAccessible method is called by the DPL to enable access to +non-public fields and constructors. If you are running under a Java security +manager you must configure your security policy to allow the following +permission:

      + +

      permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; + +

      There are three cases where setting the above permission is not +required:

      +
        +
      1. If you are not running under a Java Security Manager, then access to +non-public members via reflection is not restricted. This is the default for +J2SE.
      2. +
        +
      3. If all persistent fields and default constructors are public then +they can be accessed via reflection without special permissions, even when +running under a Java Security Manager. However, declaring public +instance fields is not recommended because it discourages encapsulation.
      4. +
        +
      5. If bytecode enhancement is used as described above, then reflection will +not be used.
      6. +
      + +

      It is well known that executing generated code is faster than reflection. +However, this performance difference may or may not impact a given application +since it may be overshadowed by other factors. Performance testing in a +realistic usage scenario is the best way to determine the impact. If you are +determined to avoid the use of reflection then option 3 above is +recommended.

      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/package-tree.html b/docs/java/com/sleepycat/persist/package-tree.html new file mode 100644 index 0000000..ae66e03 --- /dev/null +++ b/docs/java/com/sleepycat/persist/package-tree.html @@ -0,0 +1,205 @@ + + + + + +com.sleepycat.persist Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.persist

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      +
        +
      • java.lang.AutoCloseable +
          +
        • java.io.Closeable + +
        • +
        +
      • +
      • com.sleepycat.persist.EntityIndex<K,V>
      • +
      • java.lang.Iterable<T> + +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/package-use.html b/docs/java/com/sleepycat/persist/package-use.html new file mode 100644 index 0000000..7bdb7b9 --- /dev/null +++ b/docs/java/com/sleepycat/persist/package-use.html @@ -0,0 +1,251 @@ + + + + + +Uses of Package com.sleepycat.persist (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.persist

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/RawField.html b/docs/java/com/sleepycat/persist/raw/RawField.html new file mode 100644 index 0000000..dfe216c --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/RawField.html @@ -0,0 +1,263 @@ + + + + + +RawField (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.raw
      +

      Interface RawField

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface RawField
        +
        The definition of a field in a RawType. + +

        RawField objects are thread-safe. Multiple threads may safely + call the methods of a shared RawField object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          java.lang.StringgetName() +
          Returns the name of the field.
          +
          RawTypegetType() +
          Returns the type of the field, without expanding parameterized types, + or null if the type is an interface type or the Object class.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getName

            +
            java.lang.String getName()
            +
            Returns the name of the field.
            +
            +
            Returns:
            +
            the name of the field.
            +
            +
          • +
          + + + +
            +
          • +

            getType

            +
            RawType getType()
            +
            Returns the type of the field, without expanding parameterized types, + or null if the type is an interface type or the Object class.
            +
            +
            Returns:
            +
            the type of the field.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/RawObject.html b/docs/java/com/sleepycat/persist/raw/RawObject.html new file mode 100644 index 0000000..1073a2a --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/RawObject.html @@ -0,0 +1,525 @@ + + + + + +RawObject (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.raw
      +

      Class RawObject

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.raw.RawObject
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class RawObject
        +extends java.lang.Object
        +
        A raw instance that can be used with a RawStore or Conversion. A RawObject is used to represent instances of + complex types (persistent classes with fields), arrays, and enum values. It + is not used to represent non-enum simple types, which are represented as + simple objects. This includes primitives, which are represented as + instances of their wrapper class. + +

        RawObject objects are thread-safe. Multiple threads may safely + call the methods of a shared RawObject object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          RawObject(RawType type, + java.util.Map<java.lang.String,java.lang.Object> values, + RawObject superObject) +
          Creates a raw object with a given set of field values for a complex + type.
          +
          RawObject(RawType type, + java.lang.Object[] elements) +
          Creates a raw object with the given array elements for an array type.
          +
          RawObject(RawType type, + java.lang.String enumConstant) +
          Creates a raw object with the given enum value for an enum type.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          booleanequals(java.lang.Object other) 
          java.lang.Object[]getElements() +
          Returns the array of elements for an array type, or null for a complex + type or an enum type.
          +
          java.lang.StringgetEnum() +
          Returns the enum constant String for an enum type, or null for a complex + type or an array type.
          +
          RawObjectgetSuper() +
          Returns the instance of the superclass, or null if the superclass is + Object or Enum.
          +
          RawTypegetType() +
          Returns the raw type information for this raw object.
          +
          java.util.Map<java.lang.String,java.lang.Object>getValues() +
          Returns a map of field name to value for a complex type, or null for an + array type or an enum type.
          +
          inthashCode() 
          java.lang.StringtoString() +
          Returns an XML representation of the raw object.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            RawObject

            +
            public RawObject(RawType type,
            +                 java.util.Map<java.lang.String,java.lang.Object> values,
            +                 RawObject superObject)
            +
            Creates a raw object with a given set of field values for a complex + type.
            +
            +
            Parameters:
            +
            type - the type of this raw object.
            +
            values - a map of field name to value for each declared field in + the class, or null to create an empty map. Each value in the map is a + RawObject, a simple + type instance, or null.
            +
            superObject - the instance of the superclass, or null if the + superclass is Object.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the type argument is an array type.
            +
            +
          • +
          + + + +
            +
          • +

            RawObject

            +
            public RawObject(RawType type,
            +                 java.lang.Object[] elements)
            +
            Creates a raw object with the given array elements for an array type.
            +
            +
            Parameters:
            +
            type - the type of this raw object.
            +
            elements - an array of elements. Each element in the array is a + RawObject, a simple + type instance, or null.
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the type argument is not an array + type.
            +
            +
          • +
          + + + +
            +
          • +

            RawObject

            +
            public RawObject(RawType type,
            +                 java.lang.String enumConstant)
            +
            Creates a raw object with the given enum value for an enum type.
            +
            +
            Parameters:
            +
            type - the type of this raw object.
            +
            enumConstant - the String value of this enum constant; must be + one of the Strings returned by RawType.getEnumConstants().
            +
            Throws:
            +
            java.lang.IllegalArgumentException - if the type argument is not an array + type.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getType

            +
            public RawType getType()
            +
            Returns the raw type information for this raw object. + +

            Note that if this object is unevolved, the returned type may be + different from the current type returned by EntityModel.getRawType for the same class name. + This can only occur in a Conversion.convert.

            +
            +
            Returns:
            +
            the RawType.
            +
            +
          • +
          + + + +
            +
          • +

            getValues

            +
            public java.util.Map<java.lang.String,java.lang.Object> getValues()
            +
            Returns a map of field name to value for a complex type, or null for an + array type or an enum type. The map contains a String key for each + declared field in the class. Each value in the map is a RawObject, a simple + type instance, or null. + +

            There will be an entry in the map for every field declared in this + type, as determined by RawType.getFields() for the type returned + by getType(). Values in the map may be null for fields with + non-primitive types.

            +
            +
            Returns:
            +
            the map of field name to value, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getElements

            +
            public java.lang.Object[] getElements()
            +
            Returns the array of elements for an array type, or null for a complex + type or an enum type. Each element in the array is a RawObject, + a simple type instance, + or null.
            +
            +
            Returns:
            +
            the array of elements, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getEnum

            +
            public java.lang.String getEnum()
            +
            Returns the enum constant String for an enum type, or null for a complex + type or an array type. The String returned will be one of the Strings + returned by RawType.getEnumConstants().
            +
            +
            Returns:
            +
            the enum constant String, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getSuper

            +
            public RawObject getSuper()
            +
            Returns the instance of the superclass, or null if the superclass is + Object or Enum.
            +
            +
            Returns:
            +
            the instance of the superclass, or null.
            +
            +
          • +
          + + + +
            +
          • +

            equals

            +
            public boolean equals(java.lang.Object other)
            +
            +
            Overrides:
            +
            equals in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            hashCode

            +
            public int hashCode()
            +
            +
            Overrides:
            +
            hashCode in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            Returns an XML representation of the raw object.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/RawStore.html b/docs/java/com/sleepycat/persist/raw/RawStore.html new file mode 100644 index 0000000..e53c38d --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/RawStore.html @@ -0,0 +1,502 @@ + + + + + +RawStore (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.raw
      +

      Class RawStore

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.persist.raw.RawStore
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        +
        public class RawStore
        +extends java.lang.Object
        +implements java.io.Closeable
        +
        Provides access to the raw data in a store for use by general purpose tools. + A RawStore provides access to stored entities without using + entity classes or key classes. Keys are represented as simple type objects + or, for composite keys, as RawObject instances, and entities are + represented as RawObject instances. + +

        RawStore objects are thread-safe. Multiple threads may safely + call the methods of a shared RawStore object.

        + +

        When using a RawStore, the current persistent class definitions + are not used. Instead, the previously stored metadata and class definitions + are used. This has several implications:

        +
          +
        1. An EntityModel may not be specified using StoreConfig.setModel(com.sleepycat.persist.model.EntityModel). In other words, the configured model must be + null (the default).
        2. +
        3. When storing entities, their format will not automatically be evolved + to the current class definition, even if the current class definition has + changed.
        4. +
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          RawStore(Environment env, + java.lang.String storeName, + StoreConfig config) +
          Opens an entity store for raw data access.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidclose() +
          Closes all databases and sequences that were opened by this model.
          +
          StoreConfiggetConfig() +
          Returns a copy of the entity store configuration.
          +
          EnvironmentgetEnvironment() +
          Returns the environment associated with this store.
          +
          EntityModelgetModel() +
          Returns the last configured and stored entity model for this store.
          +
          MutationsgetMutations() +
          Returns the set of mutations that were configured and stored previously.
          +
          PrimaryIndex<java.lang.Object,RawObject>getPrimaryIndex(java.lang.String entityClass) +
          Opens the primary index for a given entity class.
          +
          SecondaryIndex<java.lang.Object,java.lang.Object,RawObject>getSecondaryIndex(java.lang.String entityClass, + java.lang.String keyName) +
          Opens the secondary index for a given entity class and secondary key + name.
          +
          java.lang.StringgetStoreName() +
          Returns the name of this store.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            RawStore

            +
            public RawStore(Environment env,
            +                java.lang.String storeName,
            +                StoreConfig config)
            +         throws StoreNotFoundException,
            +                DatabaseException
            +
            Opens an entity store for raw data access.
            +
            +
            Parameters:
            +
            env - an open Berkeley DB environment.
            +
            storeName - the name of the entity store within the given + environment.
            +
            config - the store configuration, or null to use default + configuration properties.
            +
            Throws:
            +
            StoreNotFoundException - when the AllowCreate configuration parameter is false + and the store's internal catalog database does not exist.
            +
            java.lang.IllegalArgumentException - if the Environment is + read-only and the config ReadOnly property is false.
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getPrimaryIndex

            +
            public PrimaryIndex<java.lang.Object,RawObject> getPrimaryIndex(java.lang.String entityClass)
            +                                                         throws DatabaseException
            +
            Opens the primary index for a given entity class.
            +
            +
            Parameters:
            +
            entityClass - the name of the entity class.
            +
            Returns:
            +
            the PrimaryIndex.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            getSecondaryIndex

            +
            public SecondaryIndex<java.lang.Object,java.lang.Object,RawObject> getSecondaryIndex(java.lang.String entityClass,
            +                                                                                     java.lang.String keyName)
            +                                                                              throws DatabaseException
            +
            Opens the secondary index for a given entity class and secondary key + name.
            +
            +
            Parameters:
            +
            entityClass - the name of the entity class.
            +
            keyName - the secondary key name.
            +
            Returns:
            +
            the SecondaryIndex.
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          + + + +
            +
          • +

            getEnvironment

            +
            public Environment getEnvironment()
            +
            Returns the environment associated with this store.
            +
            +
            Returns:
            +
            the Environment.
            +
            +
          • +
          + + + +
            +
          • +

            getConfig

            +
            public StoreConfig getConfig()
            +
            Returns a copy of the entity store configuration.
            +
            +
            Returns:
            +
            the StoreConfig.
            +
            +
          • +
          + + + +
            +
          • +

            getStoreName

            +
            public java.lang.String getStoreName()
            +
            Returns the name of this store.
            +
            +
            Returns:
            +
            the store name.
            +
            +
          • +
          + + + +
            +
          • +

            getModel

            +
            public EntityModel getModel()
            +
            Returns the last configured and stored entity model for this store.
            +
            +
            Returns:
            +
            the EntityModel.
            +
            +
          • +
          + + + +
            +
          • +

            getMutations

            +
            public Mutations getMutations()
            +
            Returns the set of mutations that were configured and stored previously.
            +
            +
            Returns:
            +
            the Mutations.
            +
            +
          • +
          + + + +
            +
          • +

            close

            +
            public void close()
            +           throws DatabaseException
            +
            Closes all databases and sequences that were opened by this model. No + databases opened via this store may be in use. + +

            WARNING: To guard against memory leaks, the application should + discard all references to the closed handle. While BDB makes an effort + to discard references from closed objects to the allocated memory for an + environment, this behavior is not guaranteed. The safe course of action + for an application is to discard all references to closed BDB + objects.

            +
            +
            Specified by:
            +
            close in interface java.io.Closeable
            +
            Specified by:
            +
            close in interface java.lang.AutoCloseable
            +
            Throws:
            +
            DatabaseException - the base class for all BDB exceptions.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/RawType.html b/docs/java/com/sleepycat/persist/raw/RawType.html new file mode 100644 index 0000000..2e9dd01 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/RawType.html @@ -0,0 +1,606 @@ + + + + + +RawType (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.persist.raw
      +

      Interface RawType

      +
      +
      +
      +
        +
      • +
        +
        +
        public interface RawType
        +
        The type definition for a simple or complex persistent type, or an array + of persistent types. + +

        RawType objects are thread-safe. Multiple threads may safely + call the methods of a shared RawType object.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Abstract Methods 
          Modifier and TypeMethod and Description
          ClassMetadatagetClassMetadata() +
          Returns the original model class metadata used to create this class, or + null if this is not a model class.
          +
          java.lang.StringgetClassName() +
          Returns the class name for this type in the format specified by Class.getName().
          +
          RawTypegetComponentType() +
          Returns the array component type, or null if this is not an array type.
          +
          intgetDimensions() +
          Returns the number of array dimensions, or zero if this is not an array + type.
          +
          EntityMetadatagetEntityMetadata() +
          Returns the original model entity metadata used to create this class, or + null if this is not an entity class.
          +
          java.util.List<java.lang.String>getEnumConstants() +
          Returns an unmodifiable list of the names of the enum instances, or null + if this is not an enum type.
          +
          java.util.Map<java.lang.String,RawField>getFields() +
          Returns a map of field name to raw field for each non-static + non-transient field declared in this class, or null if this is not a + complex type (in other words, this is a simple type or an array type).
          +
          intgetId() +
          Returns the internal unique ID for this type.
          +
          RawTypegetSuperType() +
          Returns the type of the superclass, or null if the superclass is Object + or this is not a complex type (in other words, this is a simple type or + an array type).
          +
          intgetVersion() +
          Returns the class version for this type.
          +
          booleanisArray() +
          Returns whether this is an array type.
          +
          booleanisDeleted() +
          Returns whether this type has been deleted using a class Deleter + mutation.
          +
          booleanisEnum() +
          Returns whether this is an enum type.
          +
          booleanisPrimitive() +
          Returns whether this type is a Java primitive: char, byte, short, int, + long, float or double.
          +
          booleanisSimple() +
          Returns whether this is a + simple type: + primitive, primitive wrapper, BigInteger, BigDecimal, String or Date.
          +
          java.lang.StringtoString() +
          Returns an XML representation of the raw type.
          +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getClassName

            +
            java.lang.String getClassName()
            +
            Returns the class name for this type in the format specified by Class.getName(). + +

            If this class currently exists (has not been removed or renamed) then + the class name may be passed to Class.forName(java.lang.String) to get the current + Class object. However, if this raw type is not the current + version of the class, this type information may differ from that of the + current Class.

            +
            +
            Returns:
            +
            the class name.
            +
            +
          • +
          + + + +
            +
          • +

            getVersion

            +
            int getVersion()
            +
            Returns the class version for this type. For simple types, zero is + always returned.
            +
            +
            Returns:
            +
            the version.
            +
            See Also:
            +
            Entity.version(), +Persistent.version()
            +
            +
          • +
          + + + +
            +
          • +

            getId

            +
            int getId()
            +
            Returns the internal unique ID for this type.
            +
            +
            Returns:
            +
            the ID.
            +
            +
          • +
          + + + +
            +
          • +

            isSimple

            +
            boolean isSimple()
            +
            Returns whether this is a + simple type: + primitive, primitive wrapper, BigInteger, BigDecimal, String or Date. + +

            If true is returned, isPrimitive() can be called for more + information, and a raw value of this type is represented as a simple + type object (not as a RawObject).

            + +

            If false is returned, this is a complex type, an array type (see + isArray()), or an enum type, and a raw value of this type is + represented as a RawObject.

            +
            +
            Returns:
            +
            whether this is a simple type.
            +
            +
          • +
          + + + +
            +
          • +

            isPrimitive

            +
            boolean isPrimitive()
            +
            Returns whether this type is a Java primitive: char, byte, short, int, + long, float or double. + +

            If true is returned, this is also a simple type. In other words, + primitive types are a subset of simple types.

            + +

            If true is returned, a raw value of this type is represented as a + non-null instance of the primitive type's wrapper class. For example, + an int raw value is represented as an + Integer.

            +
            +
            Returns:
            +
            whether this is a Java primitive.
            +
            +
          • +
          + + + +
            +
          • +

            isEnum

            +
            boolean isEnum()
            +
            Returns whether this is an enum type. + +

            If true is returned, a value of this type is a RawObject and + the enum constant String is available via RawObject.getEnum().

            + +

            If false is returned, then this is a complex type, an array type (see + isArray()), or a simple type (see isSimple()).

            +
            +
            Returns:
            +
            whether this is a enum type.
            +
            +
          • +
          + + + +
            +
          • +

            getEnumConstants

            +
            java.util.List<java.lang.String> getEnumConstants()
            +
            Returns an unmodifiable list of the names of the enum instances, or null + if this is not an enum type.
            +
            +
            Returns:
            +
            the list of enum names.
            +
            +
          • +
          + + + +
            +
          • +

            isArray

            +
            boolean isArray()
            +
            Returns whether this is an array type. Raw value arrays are represented + as RawObject instances. + +

            If true is returned, the array component type is returned by getComponentType() and the number of array dimensions is returned by + getDimensions().

            + +

            If false is returned, then this is a complex type, an enum type (see + isEnum()), or a simple type (see isSimple()).

            +
            +
            Returns:
            +
            whether this is an array type.
            +
            +
          • +
          + + + +
            +
          • +

            getDimensions

            +
            int getDimensions()
            +
            Returns the number of array dimensions, or zero if this is not an array + type.
            +
            +
            Returns:
            +
            the number of array dimensions, or zero if this is not an array + type.
            +
            +
          • +
          + + + +
            +
          • +

            getComponentType

            +
            RawType getComponentType()
            +
            Returns the array component type, or null if this is not an array type.
            +
            +
            Returns:
            +
            the array component type, or null if this is not an array type.
            +
            +
          • +
          + + + +
            +
          • +

            getFields

            +
            java.util.Map<java.lang.String,RawField> getFields()
            +
            Returns a map of field name to raw field for each non-static + non-transient field declared in this class, or null if this is not a + complex type (in other words, this is a simple type or an array type).
            +
            +
            Returns:
            +
            a map of field name to raw field, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getSuperType

            +
            RawType getSuperType()
            +
            Returns the type of the superclass, or null if the superclass is Object + or this is not a complex type (in other words, this is a simple type or + an array type).
            +
            +
            Returns:
            +
            the type of the superclass, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getClassMetadata

            +
            ClassMetadata getClassMetadata()
            +
            Returns the original model class metadata used to create this class, or + null if this is not a model class.
            +
            +
            Returns:
            +
            the model class metadata, or null.
            +
            +
          • +
          + + + +
            +
          • +

            getEntityMetadata

            +
            EntityMetadata getEntityMetadata()
            +
            Returns the original model entity metadata used to create this class, or + null if this is not an entity class.
            +
            +
            Returns:
            +
            the model entity metadata, or null.
            +
            +
          • +
          + + + + + + + +
            +
          • +

            toString

            +
            java.lang.String toString()
            +
            Returns an XML representation of the raw type.
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/class-use/RawField.html b/docs/java/com/sleepycat/persist/raw/class-use/RawField.html new file mode 100644 index 0000000..bc336f2 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/class-use/RawField.html @@ -0,0 +1,175 @@ + + + + + +Uses of Interface com.sleepycat.persist.raw.RawField (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.raw.RawField

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Packages that use RawField 
        PackageDescription
        com.sleepycat.persist.raw +
        Raw data access for general purpose tools and manual conversions.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of RawField in com.sleepycat.persist.raw

          + + + + + + + + + + + + +
          Methods in com.sleepycat.persist.raw that return types with arguments of type RawField 
          Modifier and TypeMethod and Description
          java.util.Map<java.lang.String,RawField>RawType.getFields() +
          Returns a map of field name to raw field for each non-static + non-transient field declared in this class, or null if this is not a + complex type (in other words, this is a simple type or an array type).
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/class-use/RawObject.html b/docs/java/com/sleepycat/persist/raw/class-use/RawObject.html new file mode 100644 index 0000000..6733e76 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/class-use/RawObject.html @@ -0,0 +1,240 @@ + + + + + +Uses of Class com.sleepycat.persist.raw.RawObject (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.raw.RawObject

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/class-use/RawStore.html b/docs/java/com/sleepycat/persist/raw/class-use/RawStore.html new file mode 100644 index 0000000..1c5a390 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/class-use/RawStore.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.persist.raw.RawStore (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.persist.raw.RawStore

      +
      +
      No usage of com.sleepycat.persist.raw.RawStore
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/class-use/RawType.html b/docs/java/com/sleepycat/persist/raw/class-use/RawType.html new file mode 100644 index 0000000..b0b3ea6 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/class-use/RawType.html @@ -0,0 +1,279 @@ + + + + + +Uses of Interface com.sleepycat.persist.raw.RawType (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.persist.raw.RawType

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + +
        Packages that use RawType 
        PackageDescription
        com.sleepycat.persist.model +
        Annotations for defining a persistent object model.
        +
        com.sleepycat.persist.raw +
        Raw data access for general purpose tools and manual conversions.
        +
        +
      • +
      • +
          +
        • + + +

          Uses of RawType in com.sleepycat.persist.model

          + + + + + + + + + + + + + + + + +
          Methods in com.sleepycat.persist.model that return RawType 
          Modifier and TypeMethod and Description
          RawTypeEntityModel.getRawType(java.lang.String className) +
          Returns the type information for the current version of a given class, + or null if the class is not currently persistent.
          +
          RawTypeEntityModel.getRawTypeVersion(java.lang.String className, + int version) +
          Returns the type information for a given version of a given class, + or null if the given version of the class is unknown.
          +
          + + + + + + + + + + + + + + + + +
          Methods in com.sleepycat.persist.model that return types with arguments of type RawType 
          Modifier and TypeMethod and Description
          java.util.List<RawType>EntityModel.getAllRawTypes() +
          Returns all versions of all known types.
          +
          java.util.List<RawType>EntityModel.getAllRawTypeVersions(java.lang.String className) +
          Returns all known versions of type information for a given class name, + or null if no persistent version of the class is known.
          +
          +
        • +
        • + + +

          Uses of RawType in com.sleepycat.persist.raw

          + + + + + + + + + + + + + + + + + + + + + + + + +
          Methods in com.sleepycat.persist.raw that return RawType 
          Modifier and TypeMethod and Description
          RawTypeRawType.getComponentType() +
          Returns the array component type, or null if this is not an array type.
          +
          RawTypeRawType.getSuperType() +
          Returns the type of the superclass, or null if the superclass is Object + or this is not a complex type (in other words, this is a simple type or + an array type).
          +
          RawTypeRawObject.getType() +
          Returns the raw type information for this raw object.
          +
          RawTypeRawField.getType() +
          Returns the type of the field, without expanding parameterized types, + or null if the type is an interface type or the Object class.
          +
          + + + + + + + + + + + + + + + + +
          Constructors in com.sleepycat.persist.raw with parameters of type RawType 
          Constructor and Description
          RawObject(RawType type, + java.util.Map<java.lang.String,java.lang.Object> values, + RawObject superObject) +
          Creates a raw object with a given set of field values for a complex + type.
          +
          RawObject(RawType type, + java.lang.Object[] elements) +
          Creates a raw object with the given array elements for an array type.
          +
          RawObject(RawType type, + java.lang.String enumConstant) +
          Creates a raw object with the given enum value for an enum type.
          +
          +
        • +
        +
      • +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/package-frame.html b/docs/java/com/sleepycat/persist/raw/package-frame.html new file mode 100644 index 0000000..f066167 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/package-frame.html @@ -0,0 +1,26 @@ + + + + + +com.sleepycat.persist.raw (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.persist.raw

      +
      +

      Interfaces

      + +

      Classes

      + +
      + + diff --git a/docs/java/com/sleepycat/persist/raw/package-summary.html b/docs/java/com/sleepycat/persist/raw/package-summary.html new file mode 100644 index 0000000..cfb080d --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/package-summary.html @@ -0,0 +1,188 @@ + + + + + +com.sleepycat.persist.raw (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.persist.raw

      +
      +
      Raw data access for general purpose tools and manual conversions.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        RawField +
        The definition of a field in a RawType.
        +
        RawType +
        The type definition for a simple or complex persistent type, or an array + of persistent types.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        RawObject +
        A raw instance that can be used with a RawStore or Conversion.
        +
        RawStore +
        Provides access to the raw data in a store for use by general purpose tools.
        +
        +
      • +
      + + + +

      Package com.sleepycat.persist.raw Description

      +
      Raw data access for general purpose tools and manual conversions.
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/package-tree.html b/docs/java/com/sleepycat/persist/raw/package-tree.html new file mode 100644 index 0000000..0c77c92 --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/package-tree.html @@ -0,0 +1,148 @@ + + + + + +com.sleepycat.persist.raw Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.persist.raw

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      +
        +
      • java.lang.Object +
          +
        • com.sleepycat.persist.raw.RawObject
        • +
        • com.sleepycat.persist.raw.RawStore (implements java.io.Closeable)
        • +
        +
      • +
      +

      Interface Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/persist/raw/package-use.html b/docs/java/com/sleepycat/persist/raw/package-use.html new file mode 100644 index 0000000..f7c74be --- /dev/null +++ b/docs/java/com/sleepycat/persist/raw/package-use.html @@ -0,0 +1,206 @@ + + + + + +Uses of Package com.sleepycat.persist.raw (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.persist.raw

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/ClassResolver.Stream.html b/docs/java/com/sleepycat/util/ClassResolver.Stream.html new file mode 100644 index 0000000..927ef16 --- /dev/null +++ b/docs/java/com/sleepycat/util/ClassResolver.Stream.html @@ -0,0 +1,371 @@ + + + + + +ClassResolver.Stream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class ClassResolver.Stream

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.io.InputStream
        • +
        • +
            +
          • java.io.ObjectInputStream
          • +
          • +
              +
            • com.sleepycat.util.ClassResolver.Stream
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.io.DataInput, java.io.ObjectInput, java.io.ObjectStreamConstants, java.lang.AutoCloseable
        +
        +
        +
        Direct Known Subclasses:
        +
        SerialInput
        +
        +
        +
        Enclosing class:
        +
        ClassResolver
        +
        +
        +
        +
        public static class ClassResolver.Stream
        +extends java.io.ObjectInputStream
        +
        A specialized ObjectInputStream that supports use of a user-specified + ClassLoader. + + If the loader param and thread-context loader are both null, of if they + throw ClassNotFoundException, then ObjectInputStream.resolveClass is + called, which has its own special rules for class loading.
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Nested Class Summary

          +
            +
          • + + +

            Nested classes/interfaces inherited from class java.io.ObjectInputStream

            +java.io.ObjectInputStream.GetField
          • +
          +
        • +
        + +
          +
        • + + +

          Field Summary

          +
            +
          • + + +

            Fields inherited from interface java.io.ObjectStreamConstants

            +baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          Stream(java.io.InputStream in, + java.lang.ClassLoader classLoader) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          protected java.lang.ClassresolveClass(java.io.ObjectStreamClass desc) 
          +
            +
          • + + +

            Methods inherited from class java.io.ObjectInputStream

            +available, close, defaultReadObject, enableResolveObject, read, read, readBoolean, readByte, readChar, readClassDescriptor, readDouble, readFields, readFloat, readFully, readFully, readInt, readLine, readLong, readObject, readObjectOverride, readShort, readStreamHeader, readUnshared, readUnsignedByte, readUnsignedShort, readUTF, registerValidation, resolveObject, resolveProxyClass, skipBytes
          • +
          +
            +
          • + + +

            Methods inherited from class java.io.InputStream

            +mark, markSupported, read, reset, skip
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
            +
          • + + +

            Methods inherited from interface java.io.ObjectInput

            +read, skip
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            Stream

            +
            public Stream(java.io.InputStream in,
            +              java.lang.ClassLoader classLoader)
            +       throws java.io.IOException
            +
            +
            Throws:
            +
            java.io.IOException
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            resolveClass

            +
            protected java.lang.Class resolveClass(java.io.ObjectStreamClass desc)
            +                                throws java.io.IOException,
            +                                       java.lang.ClassNotFoundException
            +
            +
            Overrides:
            +
            resolveClass in class java.io.ObjectInputStream
            +
            Throws:
            +
            java.io.IOException
            +
            java.lang.ClassNotFoundException
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/ClassResolver.html b/docs/java/com/sleepycat/util/ClassResolver.html new file mode 100644 index 0000000..9eab999 --- /dev/null +++ b/docs/java/com/sleepycat/util/ClassResolver.html @@ -0,0 +1,329 @@ + + + + + +ClassResolver (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class ClassResolver

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.util.ClassResolver
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class ClassResolver
        +extends java.lang.Object
        +
        Implements policies for loading user-supplied classes. The resolveClass(java.lang.String, java.lang.ClassLoader) method should be used to load all user-supplied classes, and + the ClassResolver.Stream class should be used as a replacement for + ObjectInputStream to deserialize instances of user-supplied classes. +

        + The ClassLoader specified as a param should be the one configured using + EnvironmentConfig.setClassLoader. This loader is used, if non-null. If the + loader param is null, but a non-null thread-context loader is available, the + latter is used. If the loader param and thread-context loader are both + null, or if they fail to load a class by throwing ClassNotFoundException, + then the default Java mechanisms for determining the class loader are used.

        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Nested Class Summary

          + + + + + + + + + + +
          Nested Classes 
          Modifier and TypeClass and Description
          static class ClassResolver.Stream +
          A specialized ObjectInputStream that supports use of a user-specified + ClassLoader.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ClassResolver() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static java.lang.ClassresolveClass(java.lang.String className, + java.lang.ClassLoader classLoader) +
          A specialized Class.forName method that supports use of a user-specified + ClassLoader.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ClassResolver

            +
            public ClassResolver()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            resolveClass

            +
            public static java.lang.Class resolveClass(java.lang.String className,
            +                                           java.lang.ClassLoader classLoader)
            +                                    throws java.lang.ClassNotFoundException
            +
            A specialized Class.forName method that supports use of a user-specified + ClassLoader. + + If the loader param and thread-context loader are both null, of if they + throw ClassNotFoundException, then Class.forName is called and the + "current loader" (the one used to load JE) will be used.
            +
            +
            Parameters:
            +
            className - the class name.
            +
            classLoader - the ClassLoader.
            +
            Returns:
            +
            the Class.
            +
            Throws:
            +
            java.lang.ClassNotFoundException - if the class is not found.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/ConfigBeanInfoBase.html b/docs/java/com/sleepycat/util/ConfigBeanInfoBase.html new file mode 100644 index 0000000..48fea6c --- /dev/null +++ b/docs/java/com/sleepycat/util/ConfigBeanInfoBase.html @@ -0,0 +1,570 @@ + + + + + +ConfigBeanInfoBase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class ConfigBeanInfoBase

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.beans.SimpleBeanInfo
        • +
        • +
            +
          • com.sleepycat.util.ConfigBeanInfoBase
          • +
          +
        • +
        +
      • +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          protected static java.util.ArrayList<java.lang.String>getterAndSetterMethods 
          protected static java.util.ArrayList<java.lang.String>ignoreMethods 
          protected static java.util.ArrayList<java.lang.String>propertiesName 
          +
            +
          • + + +

            Fields inherited from interface java.beans.BeanInfo

            +ICON_COLOR_16x16, ICON_COLOR_32x32, ICON_MONO_16x16, ICON_MONO_32x32
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ConfigBeanInfoBase() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          protected static java.beans.BeanDescriptorgetBdescriptor(java.lang.Class cls) 
          java.beans.BeanDescriptorgetBeanDescriptor(java.lang.Class cls) +
          Gets the bean's BeanDescriptors.
          +
          intgetDefaultEventIndex() +
          A bean may have a "default" event that is the event that will + mostly commonly be used by human's when using the bean.
          +
          intgetDefaultPropertyIndex() +
          A bean may have a "default" property that is the property that will + mostly commonly be initially chosen for update by human's who are + customizing the bean.
          +
          java.beans.EventSetDescriptor[]getEventSetDescriptors() +
          Gets the bean's EventSetDescriptors.
          +
          java.awt.ImagegetIcon(int iconKind) +
          This method returns an image object that can be used to + represent the bean in toolboxes, toolbars, etc.
          +
          protected static java.beans.PropertyDescriptor[]getPdescriptor(java.lang.Class cls) 
          protected static voidgetPropertiesInfo(java.lang.Class cls) 
          java.beans.PropertyDescriptor[]getPropertyDescriptors(java.lang.Class cls) +
          Gets the bean's PropertyDescriptors.
          +
          +
            +
          • + + +

            Methods inherited from class java.beans.SimpleBeanInfo

            +getAdditionalBeanInfo, getBeanDescriptor, getMethodDescriptors, getPropertyDescriptors, loadImage
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            propertiesName

            +
            protected static java.util.ArrayList<java.lang.String> propertiesName
            +
          • +
          + + + +
            +
          • +

            getterAndSetterMethods

            +
            protected static java.util.ArrayList<java.lang.String> getterAndSetterMethods
            +
          • +
          + + + +
            +
          • +

            ignoreMethods

            +
            protected static java.util.ArrayList<java.lang.String> ignoreMethods
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ConfigBeanInfoBase

            +
            public ConfigBeanInfoBase()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getPropertiesInfo

            +
            protected static void getPropertiesInfo(java.lang.Class cls)
            +
          • +
          + + + +
            +
          • +

            getPdescriptor

            +
            protected static java.beans.PropertyDescriptor[] getPdescriptor(java.lang.Class cls)
            +
          • +
          + + + +
            +
          • +

            getBdescriptor

            +
            protected static java.beans.BeanDescriptor getBdescriptor(java.lang.Class cls)
            +
          • +
          + + + +
            +
          • +

            getBeanDescriptor

            +
            public java.beans.BeanDescriptor getBeanDescriptor(java.lang.Class cls)
            +
            Gets the bean's BeanDescriptors.
            +
            +
            Parameters:
            +
            cls - the Class.
            +
            Returns:
            +
            BeanDescriptor describing the editable + properties of this bean. May return null if the + information should be obtained by automatic analysis.
            +
            +
          • +
          + + + +
            +
          • +

            getPropertyDescriptors

            +
            public java.beans.PropertyDescriptor[] getPropertyDescriptors(java.lang.Class cls)
            +
            Gets the bean's PropertyDescriptors.
            +
            +
            Parameters:
            +
            cls - the Class.
            +
            Returns:
            +
            An array of PropertyDescriptors describing the editable + properties supported by this bean. May return null if the + information should be obtained by automatic analysis. +

            + If a property is indexed, then its entry in the result array will + belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + A client of getPropertyDescriptors can use "instanceof" to check + if a given PropertyDescriptor is an IndexedPropertyDescriptor.

            +
            +
          • +
          + + + +
            +
          • +

            getEventSetDescriptors

            +
            public java.beans.EventSetDescriptor[] getEventSetDescriptors()
            +
            Gets the bean's EventSetDescriptors.
            +
            +
            Specified by:
            +
            getEventSetDescriptors in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getEventSetDescriptors in class java.beans.SimpleBeanInfo
            +
            Returns:
            +
            An array of EventSetDescriptors describing the kinds of + events fired by this bean. May return null if the information + should be obtained by automatic analysis.
            +
            +
          • +
          + + + +
            +
          • +

            getDefaultPropertyIndex

            +
            public int getDefaultPropertyIndex()
            +
            A bean may have a "default" property that is the property that will + mostly commonly be initially chosen for update by human's who are + customizing the bean.
            +
            +
            Specified by:
            +
            getDefaultPropertyIndex in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getDefaultPropertyIndex in class java.beans.SimpleBeanInfo
            +
            Returns:
            +
            Index of default property in the PropertyDescriptor array + returned by getPropertyDescriptors. +

            Returns -1 if there is no default property.

            +
            +
          • +
          + + + +
            +
          • +

            getDefaultEventIndex

            +
            public int getDefaultEventIndex()
            +
            A bean may have a "default" event that is the event that will + mostly commonly be used by human's when using the bean.
            +
            +
            Specified by:
            +
            getDefaultEventIndex in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getDefaultEventIndex in class java.beans.SimpleBeanInfo
            +
            Returns:
            +
            Index of default event in the EventSetDescriptor array + returned by getEventSetDescriptors. +

            Returns -1 if there is no default event.

            +
            +
          • +
          + + + +
            +
          • +

            getIcon

            +
            public java.awt.Image getIcon(int iconKind)
            +
            This method returns an image object that can be used to + represent the bean in toolboxes, toolbars, etc. Icon images + will typically be GIFs, but may in future include other formats. +

            + Beans aren't required to provide icons and may return null from + this method. +

            + There are four possible flavors of icons (16x16 color, + 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + support a single icon we recommend supporting 16x16 color. +

            + We recommend that icons have a "transparent" background + so they can be rendered onto an existing background.

            +
            +
            Specified by:
            +
            getIcon in interface java.beans.BeanInfo
            +
            Overrides:
            +
            getIcon in class java.beans.SimpleBeanInfo
            +
            Parameters:
            +
            iconKind - The kind of icon requested. This should be + one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + ICON_MONO_16x16, or ICON_MONO_32x32.
            +
            Returns:
            +
            An image object representing the requested icon. May + return null if no suitable icon is available.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/ExceptionUnwrapper.html b/docs/java/com/sleepycat/util/ExceptionUnwrapper.html new file mode 100644 index 0000000..f7a9c1f --- /dev/null +++ b/docs/java/com/sleepycat/util/ExceptionUnwrapper.html @@ -0,0 +1,320 @@ + + + + + +ExceptionUnwrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class ExceptionUnwrapper

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.util.ExceptionUnwrapper
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class ExceptionUnwrapper
        +extends java.lang.Object
        +
        Unwraps nested exceptions by calling the ExceptionWrapper.getCause() method for exceptions that implement the + ExceptionWrapper interface. Does not currently support the Java 1.4 + Throwable.getCause() method.
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          ExceptionUnwrapper() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static java.lang.Exceptionunwrap(java.lang.Exception e) +
          Unwraps an Exception and returns the underlying Exception, or throws an + Error if the underlying Throwable is an Error.
          +
          static java.lang.ThrowableunwrapAny(java.lang.Throwable e) +
          Unwraps an Exception and returns the underlying Throwable.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            ExceptionUnwrapper

            +
            public ExceptionUnwrapper()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            unwrap

            +
            public static java.lang.Exception unwrap(java.lang.Exception e)
            +
            Unwraps an Exception and returns the underlying Exception, or throws an + Error if the underlying Throwable is an Error.
            +
            +
            Parameters:
            +
            e - is the Exception to unwrap.
            +
            Returns:
            +
            the underlying Exception.
            +
            Throws:
            +
            java.lang.Error - if the underlying Throwable is an Error.
            +
            java.lang.IllegalArgumentException - if the underlying Throwable is not an + Exception or an Error.
            +
            +
          • +
          + + + +
            +
          • +

            unwrapAny

            +
            public static java.lang.Throwable unwrapAny(java.lang.Throwable e)
            +
            Unwraps an Exception and returns the underlying Throwable.
            +
            +
            Parameters:
            +
            e - is the Exception to unwrap.
            +
            Returns:
            +
            the underlying Throwable.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/ExceptionWrapper.html b/docs/java/com/sleepycat/util/ExceptionWrapper.html new file mode 100644 index 0000000..5c60ff4 --- /dev/null +++ b/docs/java/com/sleepycat/util/ExceptionWrapper.html @@ -0,0 +1,270 @@ + + + + + +ExceptionWrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Interface ExceptionWrapper

      +
      +
      +
      +
        +
      • +
        +
        All Known Implementing Classes:
        +
        IOExceptionWrapper, RuntimeExceptionWrapper
        +
        +
        +
        +
        public interface ExceptionWrapper
        +
        Interface implemented by exceptions that can contain nested exceptions.
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDetail

            +
            java.lang.Throwable getDetail()
            +
            Deprecated. replaced by getCause().
            +
            Returns the nested exception or null if none is present.
            +
            +
            Returns:
            +
            the nested exception or null if none is present.
            +
            +
          • +
          + + + +
            +
          • +

            getCause

            +
            java.lang.Throwable getCause()
            +
            Returns the nested exception or null if none is present. + +

            This method is intentionally defined to be the same signature as the + java.lang.Throwable.getCause method in Java 1.4 and + greater. By defining this method to return a nested exception, the Java + 1.4 runtime will print the nested stack trace.

            +
            +
            Returns:
            +
            the nested exception or null if none is present.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/FastInputStream.html b/docs/java/com/sleepycat/util/FastInputStream.html new file mode 100644 index 0000000..7d2ce7d --- /dev/null +++ b/docs/java/com/sleepycat/util/FastInputStream.html @@ -0,0 +1,710 @@ + + + + + +FastInputStream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class FastInputStream

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.io.InputStream
        • +
        • +
            +
          • com.sleepycat.util.FastInputStream
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.lang.AutoCloseable
        +
        +
        +
        Direct Known Subclasses:
        +
        TupleInput
        +
        +
        +
        +
        public class FastInputStream
        +extends java.io.InputStream
        +
        A replacement for ByteArrayInputStream that does not synchronize every + byte read. + +

        This class extends InputStream and its read() + methods allow it to be used as a standard input stream. In addition, it + provides readFast() methods that are not declared to throw + IOException. IOException is never thrown by this + class.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          protected byte[]buf 
          protected intlen 
          protected intmark 
          protected intoff 
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          FastInputStream(byte[] buffer) +
          Creates an input stream.
          +
          FastInputStream(byte[] buffer, + int offset, + int length) +
          Creates an input stream.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          intavailable() 
          byte[]getBufferBytes() +
          Returns the underlying data being read.
          +
          intgetBufferLength() +
          Returns the end of the buffer being read.
          +
          intgetBufferOffset() +
          Returns the offset at which data is being read from the buffer.
          +
          voidmark(int readLimit) 
          booleanmarkSupported() 
          intread() 
          intread(byte[] toBuf) 
          intread(byte[] toBuf, + int offset, + int length) 
          intreadFast() +
          Equivalent to read() but does not throw + IOException.
          +
          intreadFast(byte[] toBuf) +
          Equivalent to read(byte[]) but does not throw + IOException.
          +
          intreadFast(byte[] toBuf, + int offset, + int length) +
          Equivalent to read(byte[],int,int) but does not throw + IOException.
          +
          voidreset() 
          longskip(long count) 
          voidskipFast(int count) +
          Equivalent to skip() but takes an int parameter instead of a + long, and does not check whether the count given is larger than the + number of remaining bytes.
          +
          +
            +
          • + + +

            Methods inherited from class java.io.InputStream

            +close
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            len

            +
            protected int len
            +
          • +
          + + + +
            +
          • +

            off

            +
            protected int off
            +
          • +
          + + + +
            +
          • +

            mark

            +
            protected int mark
            +
          • +
          + + + +
            +
          • +

            buf

            +
            protected byte[] buf
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            FastInputStream

            +
            public FastInputStream(byte[] buffer)
            +
            Creates an input stream.
            +
            +
            Parameters:
            +
            buffer - the data to read.
            +
            +
          • +
          + + + +
            +
          • +

            FastInputStream

            +
            public FastInputStream(byte[] buffer,
            +                       int offset,
            +                       int length)
            +
            Creates an input stream.
            +
            +
            Parameters:
            +
            buffer - the data to read.
            +
            offset - the byte offset at which to begin reading.
            +
            length - the number of bytes to read.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            available

            +
            public int available()
            +
            +
            Overrides:
            +
            available in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            markSupported

            +
            public boolean markSupported()
            +
            +
            Overrides:
            +
            markSupported in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            mark

            +
            public void mark(int readLimit)
            +
            +
            Overrides:
            +
            mark in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            reset

            +
            public void reset()
            +
            +
            Overrides:
            +
            reset in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            skip

            +
            public long skip(long count)
            +
            +
            Overrides:
            +
            skip in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            read

            +
            public int read()
            +
            +
            Specified by:
            +
            read in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            read

            +
            public int read(byte[] toBuf)
            +
            +
            Overrides:
            +
            read in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            read

            +
            public int read(byte[] toBuf,
            +                int offset,
            +                int length)
            +
            +
            Overrides:
            +
            read in class java.io.InputStream
            +
            +
          • +
          + + + +
            +
          • +

            skipFast

            +
            public final void skipFast(int count)
            +
            Equivalent to skip() but takes an int parameter instead of a + long, and does not check whether the count given is larger than the + number of remaining bytes.
            +
            +
            Parameters:
            +
            count - the number of bytes to skip.
            +
            See Also:
            +
            skip(long)
            +
            +
          • +
          + + + +
            +
          • +

            readFast

            +
            public final int readFast()
            +
            Equivalent to read() but does not throw + IOException.
            +
            +
            Returns:
            +
            the next byte of data, or -1 if at the end of the stream.
            +
            See Also:
            +
            read()
            +
            +
          • +
          + + + +
            +
          • +

            readFast

            +
            public final int readFast(byte[] toBuf)
            +
            Equivalent to read(byte[]) but does not throw + IOException.
            +
            +
            Parameters:
            +
            toBuf - the buffer into which the data is read.
            +
            Returns:
            +
            the number of bytes read, or -1 if at the end of the stream.
            +
            See Also:
            +
            read(byte[])
            +
            +
          • +
          + + + +
            +
          • +

            readFast

            +
            public final int readFast(byte[] toBuf,
            +                          int offset,
            +                          int length)
            +
            Equivalent to read(byte[],int,int) but does not throw + IOException.
            +
            +
            Parameters:
            +
            toBuf - the buffer into which the data is read.
            +
            offset - the start offset in array at which the data is written.
            +
            length - the maximum number of bytes to read.
            +
            Returns:
            +
            the number of bytes read, or -1 if at the end of the stream.
            +
            See Also:
            +
            read(byte[],int,int)
            +
            +
          • +
          + + + +
            +
          • +

            getBufferBytes

            +
            public final byte[] getBufferBytes()
            +
            Returns the underlying data being read.
            +
            +
            Returns:
            +
            the underlying data.
            +
            +
          • +
          + + + +
            +
          • +

            getBufferOffset

            +
            public final int getBufferOffset()
            +
            Returns the offset at which data is being read from the buffer.
            +
            +
            Returns:
            +
            the offset at which data is being read.
            +
            +
          • +
          + + + +
            +
          • +

            getBufferLength

            +
            public final int getBufferLength()
            +
            Returns the end of the buffer being read.
            +
            +
            Returns:
            +
            the end of the buffer.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/FastOutputStream.html b/docs/java/com/sleepycat/util/FastOutputStream.html new file mode 100644 index 0000000..312455a --- /dev/null +++ b/docs/java/com/sleepycat/util/FastOutputStream.html @@ -0,0 +1,783 @@ + + + + + +FastOutputStream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class FastOutputStream

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.io.OutputStream
        • +
        • +
            +
          • com.sleepycat.util.FastOutputStream
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable
        +
        +
        +
        Direct Known Subclasses:
        +
        TupleOutput
        +
        +
        +
        +
        public class FastOutputStream
        +extends java.io.OutputStream
        +
        A replacement for ByteArrayOutputStream that does not synchronize every + byte read. + +

        This class extends OutputStream and its write() + methods allow it to be used as a standard output stream. In addition, it + provides writeFast() methods that are not declared to throw + IOException. IOException is never thrown by this + class.

        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static intDEFAULT_BUMP_SIZE +
          The default amount that the buffer is increased when it is full.
          +
          static intDEFAULT_INIT_SIZE +
          The default initial size of the buffer if no initialSize parameter is + specified.
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + + + + + + + + + + + + + +
          Constructors 
          Constructor and Description
          FastOutputStream() +
          Creates an output stream with default sizes.
          +
          FastOutputStream(byte[] buffer) +
          Creates an output stream with a given initial buffer and a default + bump size.
          +
          FastOutputStream(byte[] buffer, + int bumpSize) +
          Creates an output stream with a given initial buffer and a given + bump size.
          +
          FastOutputStream(int initialSize) +
          Creates an output stream with a default bump size and a given initial + size.
          +
          FastOutputStream(int initialSize, + int bumpSize) +
          Creates an output stream with a given bump size and initial size.
          +
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods 
          Modifier and TypeMethod and Description
          voidaddSize(int sizeAdded) +
          Skip the given number of bytes in the buffer.
          +
          byte[]getBufferBytes() +
          Returns the buffer owned by this object.
          +
          intgetBufferLength() +
          Returns the length used in the internal buffer, i.e., the offset at + which data will be written next.
          +
          intgetBufferOffset() +
          Returns the offset of the internal buffer.
          +
          voidmakeSpace(int sizeNeeded) +
          Ensure that at least the given number of bytes are available in the + internal buffer.
          +
          voidreset() 
          intsize() 
          byte[]toByteArray() 
          java.lang.StringtoString() 
          java.lang.StringtoString(java.lang.String encoding) 
          voidwrite(byte[] fromBuf) 
          voidwrite(byte[] fromBuf, + int offset, + int length) 
          voidwrite(int b) 
          voidwriteFast(byte[] fromBuf) +
          Equivalent to write(byte[]) but does not throw + IOException.
          +
          voidwriteFast(byte[] fromBuf, + int offset, + int length) +
          Equivalent to write(byte[],int,int) but does not throw + IOException.
          +
          voidwriteFast(int b) +
          Equivalent to write(int) but does not throw + IOException.
          +
          voidwriteTo(java.io.OutputStream out) 
          +
            +
          • + + +

            Methods inherited from class java.io.OutputStream

            +close, flush
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            DEFAULT_INIT_SIZE

            +
            public static final int DEFAULT_INIT_SIZE
            +
            The default initial size of the buffer if no initialSize parameter is + specified. This constant is 100 bytes.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            DEFAULT_BUMP_SIZE

            +
            public static final int DEFAULT_BUMP_SIZE
            +
            The default amount that the buffer is increased when it is full. This + constant is zero, which means to double the current buffer size.
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            FastOutputStream

            +
            public FastOutputStream()
            +
            Creates an output stream with default sizes.
            +
          • +
          + + + +
            +
          • +

            FastOutputStream

            +
            public FastOutputStream(int initialSize)
            +
            Creates an output stream with a default bump size and a given initial + size.
            +
            +
            Parameters:
            +
            initialSize - the initial size of the buffer.
            +
            +
          • +
          + + + +
            +
          • +

            FastOutputStream

            +
            public FastOutputStream(int initialSize,
            +                        int bumpSize)
            +
            Creates an output stream with a given bump size and initial size.
            +
            +
            Parameters:
            +
            initialSize - the initial size of the buffer.
            +
            bumpSize - the amount to increment the buffer.
            +
            +
          • +
          + + + +
            +
          • +

            FastOutputStream

            +
            public FastOutputStream(byte[] buffer)
            +
            Creates an output stream with a given initial buffer and a default + bump size.
            +
            +
            Parameters:
            +
            buffer - the initial buffer; will be owned by this object.
            +
            +
          • +
          + + + +
            +
          • +

            FastOutputStream

            +
            public FastOutputStream(byte[] buffer,
            +                        int bumpSize)
            +
            Creates an output stream with a given initial buffer and a given + bump size.
            +
            +
            Parameters:
            +
            buffer - the initial buffer; will be owned by this object.
            +
            bumpSize - the amount to increment the buffer. If zero (the + default), the current buffer size will be doubled when the buffer is + full.
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            size

            +
            public int size()
            +
          • +
          + + + +
            +
          • +

            reset

            +
            public void reset()
            +
          • +
          + + + +
            +
          • +

            write

            +
            public void write(int b)
            +
            +
            Specified by:
            +
            write in class java.io.OutputStream
            +
            +
          • +
          + + + +
            +
          • +

            write

            +
            public void write(byte[] fromBuf)
            +
            +
            Overrides:
            +
            write in class java.io.OutputStream
            +
            +
          • +
          + + + +
            +
          • +

            write

            +
            public void write(byte[] fromBuf,
            +                  int offset,
            +                  int length)
            +
            +
            Overrides:
            +
            write in class java.io.OutputStream
            +
            +
          • +
          + + + +
            +
          • +

            writeTo

            +
            public void writeTo(java.io.OutputStream out)
            +             throws java.io.IOException
            +
            +
            Throws:
            +
            java.io.IOException
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString()
            +
            +
            Overrides:
            +
            toString in class java.lang.Object
            +
            +
          • +
          + + + +
            +
          • +

            toString

            +
            public java.lang.String toString(java.lang.String encoding)
            +                          throws java.io.UnsupportedEncodingException
            +
            +
            Throws:
            +
            java.io.UnsupportedEncodingException
            +
            +
          • +
          + + + +
            +
          • +

            toByteArray

            +
            public byte[] toByteArray()
            +
          • +
          + + + +
            +
          • +

            writeFast

            +
            public final void writeFast(int b)
            +
            Equivalent to write(int) but does not throw + IOException.
            +
            +
            Parameters:
            +
            b - the byte to write.
            +
            See Also:
            +
            write(int)
            +
            +
          • +
          + + + +
            +
          • +

            writeFast

            +
            public final void writeFast(byte[] fromBuf)
            +
            Equivalent to write(byte[]) but does not throw + IOException.
            +
            +
            Parameters:
            +
            fromBuf - the buffer to write.
            +
            See Also:
            +
            write(byte[])
            +
            +
          • +
          + + + +
            +
          • +

            writeFast

            +
            public final void writeFast(byte[] fromBuf,
            +                            int offset,
            +                            int length)
            +
            Equivalent to write(byte[],int,int) but does not throw + IOException.
            +
            +
            Parameters:
            +
            fromBuf - the buffer to write.
            +
            offset - the start offset in the buffer.
            +
            length - the number of bytes to write.
            +
            See Also:
            +
            write(byte[],int,int)
            +
            +
          • +
          + + + +
            +
          • +

            getBufferBytes

            +
            public byte[] getBufferBytes()
            +
            Returns the buffer owned by this object.
            +
            +
            Returns:
            +
            the buffer.
            +
            +
          • +
          + + + +
            +
          • +

            getBufferOffset

            +
            public int getBufferOffset()
            +
            Returns the offset of the internal buffer.
            +
            +
            Returns:
            +
            always zero currently.
            +
            +
          • +
          + + + +
            +
          • +

            getBufferLength

            +
            public int getBufferLength()
            +
            Returns the length used in the internal buffer, i.e., the offset at + which data will be written next.
            +
            +
            Returns:
            +
            the buffer length.
            +
            +
          • +
          + + + +
            +
          • +

            makeSpace

            +
            public void makeSpace(int sizeNeeded)
            +
            Ensure that at least the given number of bytes are available in the + internal buffer.
            +
            +
            Parameters:
            +
            sizeNeeded - the number of bytes desired.
            +
            +
          • +
          + + + +
            +
          • +

            addSize

            +
            public void addSize(int sizeAdded)
            +
            Skip the given number of bytes in the buffer.
            +
            +
            Parameters:
            +
            sizeAdded - number of bytes to skip.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/IOExceptionWrapper.html b/docs/java/com/sleepycat/util/IOExceptionWrapper.html new file mode 100644 index 0000000..591a539 --- /dev/null +++ b/docs/java/com/sleepycat/util/IOExceptionWrapper.html @@ -0,0 +1,353 @@ + + + + + +IOExceptionWrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class IOExceptionWrapper

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • +
            +
          • java.lang.Exception
          • +
          • +
              +
            • java.io.IOException
            • +
            • +
                +
              • com.sleepycat.util.IOExceptionWrapper
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ExceptionWrapper, java.io.Serializable
        +
        +
        +
        +
        public class IOExceptionWrapper
        +extends java.io.IOException
        +implements ExceptionWrapper
        +
        An IOException that can contain nested exceptions.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          IOExceptionWrapper(java.lang.Throwable e) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          java.lang.ThrowablegetCause() +
          Returns the nested exception or null if none is present.
          +
          java.lang.ThrowablegetDetail() +
          Deprecated.  +
          replaced by getCause().
          +
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            IOExceptionWrapper

            +
            public IOExceptionWrapper(java.lang.Throwable e)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getDetail

            +
            public java.lang.Throwable getDetail()
            +
            Deprecated. replaced by getCause().
            +
            Description copied from interface: ExceptionWrapper
            +
            Returns the nested exception or null if none is present.
            +
            +
            Specified by:
            +
            getDetail in interface ExceptionWrapper
            +
            Returns:
            +
            the nested exception or null if none is present.
            +
            +
          • +
          + + + +
            +
          • +

            getCause

            +
            public java.lang.Throwable getCause()
            +
            Description copied from interface: ExceptionWrapper
            +
            Returns the nested exception or null if none is present. + +

            This method is intentionally defined to be the same signature as the + java.lang.Throwable.getCause method in Java 1.4 and + greater. By defining this method to return a nested exception, the Java + 1.4 runtime will print the nested stack trace.

            +
            +
            Specified by:
            +
            getCause in interface ExceptionWrapper
            +
            Overrides:
            +
            getCause in class java.lang.Throwable
            +
            Returns:
            +
            the nested exception or null if none is present.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/PackedInteger.html b/docs/java/com/sleepycat/util/PackedInteger.html new file mode 100644 index 0000000..6aa61be --- /dev/null +++ b/docs/java/com/sleepycat/util/PackedInteger.html @@ -0,0 +1,763 @@ + + + + + +PackedInteger (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class PackedInteger

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.util.PackedInteger
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class PackedInteger
        +extends java.lang.Object
        +
        Static methods for reading and writing packed integers. + +

        Most applications should use the classes in the com.sleepycat.bind.tuple package rather than using this class directly.

        +
        +
        See Also:
        +
        Integer Formats
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Summary

          + + + + + + + + + + + + + + +
          Fields 
          Modifier and TypeField and Description
          static intMAX_LENGTH +
          The maximum number of bytes needed to store an int value (5).
          +
          static intMAX_LONG_LENGTH +
          The maximum number of bytes needed to store a long value (9).
          +
          +
        • +
        + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          PackedInteger() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static intgetReadIntLength(byte[] buf, + int off) +
          Returns the number of bytes that would be read by readInt(byte[], int).
          +
          static intgetReadLongLength(byte[] buf, + int off) +
          Returns the number of bytes that would be read by readLong(byte[], int).
          +
          static intgetReadSortedIntLength(byte[] buf, + int off) +
          Returns the number of bytes that would be read by readSortedInt(byte[], int).
          +
          static intgetReadSortedLongLength(byte[] buf, + int off) +
          Returns the number of bytes that would be read by readSortedLong(byte[], int).
          +
          static intgetWriteIntLength(int value) +
          Returns the number of bytes that would be written by writeInt(byte[], int, int).
          +
          static intgetWriteLongLength(long value) +
          Returns the number of bytes that would be written by writeLong(byte[], int, long).
          +
          static intgetWriteSortedIntLength(int value) +
          Returns the number of bytes that would be written by writeSortedInt(byte[], int, int).
          +
          static intgetWriteSortedLongLength(long value) +
          Returns the number of bytes that would be written by writeSortedLong(byte[], int, long).
          +
          static intreadInt(byte[] buf, + int off) +
          Reads a packed integer at the given buffer offset and returns it.
          +
          static longreadLong(byte[] buf, + int off) +
          Reads a packed long integer at the given buffer offset and returns it.
          +
          static intreadSortedInt(byte[] buf, + int off) +
          Reads a sorted packed integer at the given buffer offset and returns it.
          +
          static longreadSortedLong(byte[] buf, + int off) +
          Reads a sorted packed long integer at the given buffer offset and + returns it.
          +
          static intwriteInt(byte[] buf, + int offset, + int value) +
          Writes a packed integer starting at the given buffer offset and returns + the next offset to be written.
          +
          static intwriteLong(byte[] buf, + int offset, + long value) +
          Writes a packed long integer starting at the given buffer offset and + returns the next offset to be written.
          +
          static intwriteSortedInt(byte[] buf, + int offset, + int value) +
          Writes a packed sorted integer starting at the given buffer offset and + returns the next offset to be written.
          +
          static intwriteSortedLong(byte[] buf, + int offset, + long value) +
          Writes a packed sorted long integer starting at the given buffer offset + and returns the next offset to be written.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            MAX_LENGTH

            +
            public static final int MAX_LENGTH
            +
            The maximum number of bytes needed to store an int value (5).
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            MAX_LONG_LENGTH

            +
            public static final int MAX_LONG_LENGTH
            +
            The maximum number of bytes needed to store a long value (9).
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            PackedInteger

            +
            public PackedInteger()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            readInt

            +
            public static int readInt(byte[] buf,
            +                          int off)
            +
            Reads a packed integer at the given buffer offset and returns it.
            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the integer that was read.
            +
            +
          • +
          + + + +
            +
          • +

            readLong

            +
            public static long readLong(byte[] buf,
            +                            int off)
            +
            Reads a packed long integer at the given buffer offset and returns it.
            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the long integer that was read.
            +
            +
          • +
          + + + +
            +
          • +

            getReadIntLength

            +
            public static int getReadIntLength(byte[] buf,
            +                                   int off)
            +
            Returns the number of bytes that would be read by readInt(byte[], int). + +

            Because the length is stored in the first byte, this method may be + called with only the first byte of the packed integer in the given + buffer. This method only accesses one byte at the given offset.

            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the number of bytes that would be read.
            +
            +
          • +
          + + + +
            +
          • +

            getReadLongLength

            +
            public static int getReadLongLength(byte[] buf,
            +                                    int off)
            +
            Returns the number of bytes that would be read by readLong(byte[], int). + +

            Because the length is stored in the first byte, this method may be + called with only the first byte of the packed integer in the given + buffer. This method only accesses one byte at the given offset.

            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the number of bytes that would be read.
            +
            +
          • +
          + + + +
            +
          • +

            writeInt

            +
            public static int writeInt(byte[] buf,
            +                           int offset,
            +                           int value)
            +
            Writes a packed integer starting at the given buffer offset and returns + the next offset to be written.
            +
            +
            Parameters:
            +
            buf - the buffer to write to.
            +
            offset - the offset in the buffer at which to start writing.
            +
            value - the integer to be written.
            +
            Returns:
            +
            the offset past the bytes written.
            +
            +
          • +
          + + + +
            +
          • +

            writeLong

            +
            public static int writeLong(byte[] buf,
            +                            int offset,
            +                            long value)
            +
            Writes a packed long integer starting at the given buffer offset and + returns the next offset to be written.
            +
            +
            Parameters:
            +
            buf - the buffer to write to.
            +
            offset - the offset in the buffer at which to start writing.
            +
            value - the long integer to be written.
            +
            Returns:
            +
            the offset past the bytes written.
            +
            +
          • +
          + + + +
            +
          • +

            getWriteIntLength

            +
            public static int getWriteIntLength(int value)
            +
            Returns the number of bytes that would be written by writeInt(byte[], int, int).
            +
            +
            Parameters:
            +
            value - the integer to be written.
            +
            Returns:
            +
            the number of bytes that would be used to write the given + integer.
            +
            +
          • +
          + + + +
            +
          • +

            getWriteLongLength

            +
            public static int getWriteLongLength(long value)
            +
            Returns the number of bytes that would be written by writeLong(byte[], int, long).
            +
            +
            Parameters:
            +
            value - the long integer to be written.
            +
            Returns:
            +
            the number of bytes that would be used to write the given long + integer.
            +
            +
          • +
          + + + +
            +
          • +

            readSortedInt

            +
            public static int readSortedInt(byte[] buf,
            +                                int off)
            +
            Reads a sorted packed integer at the given buffer offset and returns it.
            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the integer that was read.
            +
            +
          • +
          + + + +
            +
          • +

            readSortedLong

            +
            public static long readSortedLong(byte[] buf,
            +                                  int off)
            +
            Reads a sorted packed long integer at the given buffer offset and + returns it.
            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the long integer that was read.
            +
            +
          • +
          + + + +
            +
          • +

            getReadSortedIntLength

            +
            public static int getReadSortedIntLength(byte[] buf,
            +                                         int off)
            +
            Returns the number of bytes that would be read by readSortedInt(byte[], int). + +

            Because the length is stored in the first byte, this method may be + called with only the first byte of the packed integer in the given + buffer. This method only accesses one byte at the given offset.

            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the number of bytes that would be read.
            +
            +
          • +
          + + + +
            +
          • +

            getReadSortedLongLength

            +
            public static int getReadSortedLongLength(byte[] buf,
            +                                          int off)
            +
            Returns the number of bytes that would be read by readSortedLong(byte[], int). + +

            Because the length is stored in the first byte, this method may be + called with only the first byte of the packed integer in the given + buffer. This method only accesses one byte at the given offset.

            +
            +
            Parameters:
            +
            buf - the buffer to read from.
            +
            off - the offset in the buffer at which to start reading.
            +
            Returns:
            +
            the number of bytes that would be read.
            +
            +
          • +
          + + + +
            +
          • +

            writeSortedInt

            +
            public static int writeSortedInt(byte[] buf,
            +                                 int offset,
            +                                 int value)
            +
            Writes a packed sorted integer starting at the given buffer offset and + returns the next offset to be written.
            +
            +
            Parameters:
            +
            buf - the buffer to write to.
            +
            offset - the offset in the buffer at which to start writing.
            +
            value - the integer to be written.
            +
            Returns:
            +
            the offset past the bytes written.
            +
            +
          • +
          + + + +
            +
          • +

            writeSortedLong

            +
            public static int writeSortedLong(byte[] buf,
            +                                  int offset,
            +                                  long value)
            +
            Writes a packed sorted long integer starting at the given buffer offset + and returns the next offset to be written.
            +
            +
            Parameters:
            +
            buf - the buffer to write to.
            +
            offset - the offset in the buffer at which to start writing.
            +
            value - the long integer to be written.
            +
            Returns:
            +
            the offset past the bytes written.
            +
            +
          • +
          + + + +
            +
          • +

            getWriteSortedIntLength

            +
            public static int getWriteSortedIntLength(int value)
            +
            Returns the number of bytes that would be written by writeSortedInt(byte[], int, int).
            +
            +
            Parameters:
            +
            value - the integer to be written.
            +
            Returns:
            +
            the number of bytes that would be used to write the given + integer.
            +
            +
          • +
          + + + +
            +
          • +

            getWriteSortedLongLength

            +
            public static int getWriteSortedLongLength(long value)
            +
            Returns the number of bytes that would be written by writeSortedLong(byte[], int, long).
            +
            +
            Parameters:
            +
            value - the long integer to be written.
            +
            Returns:
            +
            the number of bytes that would be used to write the given long + integer.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/RuntimeExceptionWrapper.html b/docs/java/com/sleepycat/util/RuntimeExceptionWrapper.html new file mode 100644 index 0000000..2dab439 --- /dev/null +++ b/docs/java/com/sleepycat/util/RuntimeExceptionWrapper.html @@ -0,0 +1,353 @@ + + + + + +RuntimeExceptionWrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class RuntimeExceptionWrapper

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • java.lang.Throwable
        • +
        • +
            +
          • java.lang.Exception
          • +
          • +
              +
            • java.lang.RuntimeException
            • +
            • +
                +
              • com.sleepycat.util.RuntimeExceptionWrapper
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
      +
        +
      • +
        +
        All Implemented Interfaces:
        +
        ExceptionWrapper, java.io.Serializable
        +
        +
        +
        +
        public class RuntimeExceptionWrapper
        +extends java.lang.RuntimeException
        +implements ExceptionWrapper
        +
        A RuntimeException that can contain nested exceptions.
        +
        +
        Author:
        +
        Mark Hayes
        +
        See Also:
        +
        Serialized Form
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          RuntimeExceptionWrapper(java.lang.Throwable e) 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + +
          All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods 
          Modifier and TypeMethod and Description
          java.lang.ThrowablegetDetail() +
          Deprecated.  +
          replaced by Throwable.getCause().
          +
          +
          static java.lang.RuntimeExceptionwrapIfNeeded(java.lang.Throwable e) +
          Wraps the given exception if it is not a RuntimeException.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Throwable

            +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
          • +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
          • +
          + +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            RuntimeExceptionWrapper

            +
            public RuntimeExceptionWrapper(java.lang.Throwable e)
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            wrapIfNeeded

            +
            public static java.lang.RuntimeException wrapIfNeeded(java.lang.Throwable e)
            +
            Wraps the given exception if it is not a RuntimeException.
            +
            +
            Parameters:
            +
            e - any exception.
            +
            Returns:
            +
            e if it is a RuntimeException, otherwise a + RuntimeExceptionWrapper for e.
            +
            +
          • +
          + + + +
            +
          • +

            getDetail

            +
            public java.lang.Throwable getDetail()
            +
            Deprecated. replaced by Throwable.getCause().
            +
            Description copied from interface: ExceptionWrapper
            +
            Returns the nested exception or null if none is present.
            +
            +
            Specified by:
            +
            getDetail in interface ExceptionWrapper
            +
            Returns:
            +
            the nested exception or null if none is present.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/UtfOps.html b/docs/java/com/sleepycat/util/UtfOps.html new file mode 100644 index 0000000..ead3126 --- /dev/null +++ b/docs/java/com/sleepycat/util/UtfOps.html @@ -0,0 +1,554 @@ + + + + + +UtfOps (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +
      com.sleepycat.util
      +

      Class UtfOps

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.sleepycat.util.UtfOps
        • +
        +
      • +
      +
      +
        +
      • +
        +
        +
        public class UtfOps
        +extends java.lang.Object
        +
        UTF operations with more flexibility than is provided by DataInput and + DataOutput.
        +
        +
        Author:
        +
        Mark Hayes
        +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Summary

          + + + + + + + + +
          Constructors 
          Constructor and Description
          UtfOps() 
          +
        • +
        + +
          +
        • + + +

          Method Summary

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          All Methods Static Methods Concrete Methods 
          Modifier and TypeMethod and Description
          static intbytesToChars(byte[] bytes, + int byteOffset, + char[] chars, + int charOffset, + int len, + boolean isByteLen) +
          Converts byte arrays into character arrays.
          +
          static java.lang.StringbytesToString(byte[] bytes, + int offset, + int length) +
          Converts byte arrays into strings.
          +
          static voidcharsToBytes(char[] chars, + int charOffset, + byte[] bytes, + int byteOffset, + int charLength) +
          Converts character arrays into byte arrays.
          +
          static intgetByteLength(char[] chars) +
          Returns the byte length of the UTF string that would be created by + converting the given characters to UTF.
          +
          static intgetByteLength(char[] chars, + int offset, + int length) +
          Returns the byte length of the UTF string that would be created by + converting the given characters to UTF.
          +
          static intgetCharLength(byte[] bytes) +
          Returns the number of characters represented by the given UTF string.
          +
          static intgetCharLength(byte[] bytes, + int offset, + int length) +
          Returns the number of characters represented by the given UTF string.
          +
          static intgetZeroTerminatedByteLength(byte[] bytes, + int offset) +
          Returns the byte length of a null terminated UTF string, not including + the terminator.
          +
          static byte[]stringToBytes(java.lang.String string) +
          Converts strings to byte arrays.
          +
          +
            +
          • + + +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
          • +
          +
        • +
        +
      • +
      +
      +
      +
        +
      • + +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            UtfOps

            +
            public UtfOps()
            +
          • +
          +
        • +
        + +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            getZeroTerminatedByteLength

            +
            public static int getZeroTerminatedByteLength(byte[] bytes,
            +                                              int offset)
            +                                       throws java.lang.IndexOutOfBoundsException
            +
            Returns the byte length of a null terminated UTF string, not including + the terminator.
            +
            +
            Parameters:
            +
            bytes - the data containing the UTF string.
            +
            offset - the beginning of the string the measure.
            +
            Returns:
            +
            the number of bytes.
            +
            Throws:
            +
            java.lang.IndexOutOfBoundsException - if no zero terminator is found.
            +
            +
          • +
          + + + +
            +
          • +

            getByteLength

            +
            public static int getByteLength(char[] chars)
            +
            Returns the byte length of the UTF string that would be created by + converting the given characters to UTF.
            +
            +
            Parameters:
            +
            chars - the characters that would be converted.
            +
            Returns:
            +
            the byte length of the equivalent UTF data.
            +
            +
          • +
          + + + +
            +
          • +

            getByteLength

            +
            public static int getByteLength(char[] chars,
            +                                int offset,
            +                                int length)
            +
            Returns the byte length of the UTF string that would be created by + converting the given characters to UTF.
            +
            +
            Parameters:
            +
            chars - the characters that would be converted.
            +
            offset - the first character to be converted.
            +
            length - the number of characters to be converted.
            +
            Returns:
            +
            the byte length of the equivalent UTF data.
            +
            +
          • +
          + + + +
            +
          • +

            getCharLength

            +
            public static int getCharLength(byte[] bytes)
            +                         throws java.lang.IllegalArgumentException,
            +                                java.lang.IndexOutOfBoundsException
            +
            Returns the number of characters represented by the given UTF string.
            +
            +
            Parameters:
            +
            bytes - the UTF string.
            +
            Returns:
            +
            the number of characters.
            +
            Throws:
            +
            java.lang.IndexOutOfBoundsException - if a UTF character sequence at the end + of the data is not complete.
            +
            java.lang.IllegalArgumentException - if an illegal UTF sequence is + encountered.
            +
            +
          • +
          + + + +
            +
          • +

            getCharLength

            +
            public static int getCharLength(byte[] bytes,
            +                                int offset,
            +                                int length)
            +                         throws java.lang.IllegalArgumentException,
            +                                java.lang.IndexOutOfBoundsException
            +
            Returns the number of characters represented by the given UTF string.
            +
            +
            Parameters:
            +
            bytes - the data containing the UTF string.
            +
            offset - the first byte to be converted.
            +
            length - the number of byte to be converted.
            +
            Returns:
            +
            the number of characters.
            +
            Throws:
            +
            java.lang.IndexOutOfBoundsException - if a UTF character sequence at the end + of the data is not complete.
            +
            java.lang.IllegalArgumentException - if an illegal UTF sequence is + encountered.
            +
            +
          • +
          + + + +
            +
          • +

            bytesToChars

            +
            public static int bytesToChars(byte[] bytes,
            +                               int byteOffset,
            +                               char[] chars,
            +                               int charOffset,
            +                               int len,
            +                               boolean isByteLen)
            +                        throws java.lang.IllegalArgumentException,
            +                               java.lang.IndexOutOfBoundsException
            +
            Converts byte arrays into character arrays.
            +
            +
            Parameters:
            +
            bytes - the source byte data to convert
            +
            byteOffset - the offset into the byte array at which + to start the conversion
            +
            chars - the destination array
            +
            charOffset - the offset into chars at which to begin the copy
            +
            len - the amount of information to copy into chars
            +
            isByteLen - if true then len is a measure of bytes, otherwise + len is a measure of characters
            +
            Returns:
            +
            the byte offset after converting the bytes.
            +
            Throws:
            +
            java.lang.IndexOutOfBoundsException - if a UTF character sequence at the end + of the data is not complete.
            +
            java.lang.IllegalArgumentException - if an illegal UTF sequence is + encountered.
            +
            +
          • +
          + + + +
            +
          • +

            charsToBytes

            +
            public static void charsToBytes(char[] chars,
            +                                int charOffset,
            +                                byte[] bytes,
            +                                int byteOffset,
            +                                int charLength)
            +
            Converts character arrays into byte arrays.
            +
            +
            Parameters:
            +
            chars - the source character data to convert
            +
            charOffset - the offset into the character array at which + to start the conversion
            +
            bytes - the destination array
            +
            byteOffset - the offset into bytes at which to begin the copy
            +
            charLength - the length of characters to copy into bytes
            +
            +
          • +
          + + + +
            +
          • +

            bytesToString

            +
            public static java.lang.String bytesToString(byte[] bytes,
            +                                             int offset,
            +                                             int length)
            +                                      throws java.lang.IllegalArgumentException,
            +                                             java.lang.IndexOutOfBoundsException
            +
            Converts byte arrays into strings.
            +
            +
            Parameters:
            +
            bytes - the source byte data to convert
            +
            offset - the offset into the byte array at which + to start the conversion
            +
            length - the number of bytes to be converted.
            +
            Returns:
            +
            the string.
            +
            Throws:
            +
            java.lang.IndexOutOfBoundsException - if a UTF character sequence at the end + of the data is not complete.
            +
            java.lang.IllegalArgumentException - if an illegal UTF sequence is + encountered.
            +
            +
          • +
          + + + +
            +
          • +

            stringToBytes

            +
            public static byte[] stringToBytes(java.lang.String string)
            +
            Converts strings to byte arrays.
            +
            +
            Parameters:
            +
            string - the string to convert.
            +
            Returns:
            +
            the UTF byte array.
            +
            +
          • +
          +
        • +
        +
      • +
      +
      +
      + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/ClassResolver.Stream.html b/docs/java/com/sleepycat/util/class-use/ClassResolver.Stream.html new file mode 100644 index 0000000..bd39963 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/ClassResolver.Stream.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.util.ClassResolver.Stream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.ClassResolver.Stream

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/ClassResolver.html b/docs/java/com/sleepycat/util/class-use/ClassResolver.html new file mode 100644 index 0000000..8f10cd6 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/ClassResolver.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.util.ClassResolver (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.ClassResolver

      +
      +
      No usage of com.sleepycat.util.ClassResolver
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/ConfigBeanInfoBase.html b/docs/java/com/sleepycat/util/class-use/ConfigBeanInfoBase.html new file mode 100644 index 0000000..d3a1a7f --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/ConfigBeanInfoBase.html @@ -0,0 +1,222 @@ + + + + + +Uses of Class com.sleepycat.util.ConfigBeanInfoBase (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.ConfigBeanInfoBase

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/ExceptionUnwrapper.html b/docs/java/com/sleepycat/util/class-use/ExceptionUnwrapper.html new file mode 100644 index 0000000..7861e68 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/ExceptionUnwrapper.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.util.ExceptionUnwrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.ExceptionUnwrapper

      +
      +
      No usage of com.sleepycat.util.ExceptionUnwrapper
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/ExceptionWrapper.html b/docs/java/com/sleepycat/util/class-use/ExceptionWrapper.html new file mode 100644 index 0000000..f2d5990 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/ExceptionWrapper.html @@ -0,0 +1,179 @@ + + + + + +Uses of Interface com.sleepycat.util.ExceptionWrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Interface
      com.sleepycat.util.ExceptionWrapper

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/FastInputStream.html b/docs/java/com/sleepycat/util/class-use/FastInputStream.html new file mode 100644 index 0000000..0d44f3d --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/FastInputStream.html @@ -0,0 +1,174 @@ + + + + + +Uses of Class com.sleepycat.util.FastInputStream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.FastInputStream

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/FastOutputStream.html b/docs/java/com/sleepycat/util/class-use/FastOutputStream.html new file mode 100644 index 0000000..d484d18 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/FastOutputStream.html @@ -0,0 +1,201 @@ + + + + + +Uses of Class com.sleepycat.util.FastOutputStream (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.FastOutputStream

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/IOExceptionWrapper.html b/docs/java/com/sleepycat/util/class-use/IOExceptionWrapper.html new file mode 100644 index 0000000..1dcfbef --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/IOExceptionWrapper.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.util.IOExceptionWrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.IOExceptionWrapper

      +
      +
      No usage of com.sleepycat.util.IOExceptionWrapper
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/PackedInteger.html b/docs/java/com/sleepycat/util/class-use/PackedInteger.html new file mode 100644 index 0000000..9427967 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/PackedInteger.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.util.PackedInteger (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.PackedInteger

      +
      +
      No usage of com.sleepycat.util.PackedInteger
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/RuntimeExceptionWrapper.html b/docs/java/com/sleepycat/util/class-use/RuntimeExceptionWrapper.html new file mode 100644 index 0000000..d0600d3 --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/RuntimeExceptionWrapper.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.util.RuntimeExceptionWrapper (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.RuntimeExceptionWrapper

      +
      +
      No usage of com.sleepycat.util.RuntimeExceptionWrapper
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/class-use/UtfOps.html b/docs/java/com/sleepycat/util/class-use/UtfOps.html new file mode 100644 index 0000000..c2c215f --- /dev/null +++ b/docs/java/com/sleepycat/util/class-use/UtfOps.html @@ -0,0 +1,129 @@ + + + + + +Uses of Class com.sleepycat.util.UtfOps (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Class
      com.sleepycat.util.UtfOps

      +
      +
      No usage of com.sleepycat.util.UtfOps
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/package-frame.html b/docs/java/com/sleepycat/util/package-frame.html new file mode 100644 index 0000000..16277be --- /dev/null +++ b/docs/java/com/sleepycat/util/package-frame.html @@ -0,0 +1,36 @@ + + + + + +com.sleepycat.util (Oracle - Berkeley DB Java Edition API) + + + + + +

      com.sleepycat.util

      + + + diff --git a/docs/java/com/sleepycat/util/package-summary.html b/docs/java/com/sleepycat/util/package-summary.html new file mode 100644 index 0000000..8b99ddc --- /dev/null +++ b/docs/java/com/sleepycat/util/package-summary.html @@ -0,0 +1,243 @@ + + + + + +com.sleepycat.util (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Package com.sleepycat.util

      +
      +
      General utilities used throughout Berkeley DB.
      +
      +

      See: Description

      +
      +
      +
        +
      • + + + + + + + + + + + + +
        Interface Summary 
        InterfaceDescription
        ExceptionWrapper +
        Interface implemented by exceptions that can contain nested exceptions.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Class Summary 
        ClassDescription
        ClassResolver +
        Implements policies for loading user-supplied classes.
        +
        ClassResolver.Stream +
        A specialized ObjectInputStream that supports use of a user-specified + ClassLoader.
        +
        ConfigBeanInfoBase 
        ExceptionUnwrapper +
        Unwraps nested exceptions by calling the ExceptionWrapper.getCause() method for exceptions that implement the + ExceptionWrapper interface.
        +
        FastInputStream +
        A replacement for ByteArrayInputStream that does not synchronize every + byte read.
        +
        FastOutputStream +
        A replacement for ByteArrayOutputStream that does not synchronize every + byte read.
        +
        PackedInteger +
        Static methods for reading and writing packed integers.
        +
        UtfOps +
        UTF operations with more flexibility than is provided by DataInput and + DataOutput.
        +
        +
      • +
      • + + + + + + + + + + + + + + + + +
        Exception Summary 
        ExceptionDescription
        IOExceptionWrapper +
        An IOException that can contain nested exceptions.
        +
        RuntimeExceptionWrapper +
        A RuntimeException that can contain nested exceptions.
        +
        +
      • +
      + + + +

      Package com.sleepycat.util Description

      +
      General utilities used throughout Berkeley DB.
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/package-tree.html b/docs/java/com/sleepycat/util/package-tree.html new file mode 100644 index 0000000..47acf8e --- /dev/null +++ b/docs/java/com/sleepycat/util/package-tree.html @@ -0,0 +1,187 @@ + + + + + +com.sleepycat.util Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Hierarchy For Package com.sleepycat.util

      +Package Hierarchies: + +
      +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/com/sleepycat/util/package-use.html b/docs/java/com/sleepycat/util/package-use.html new file mode 100644 index 0000000..a2d3d69 --- /dev/null +++ b/docs/java/com/sleepycat/util/package-use.html @@ -0,0 +1,292 @@ + + + + + +Uses of Package com.sleepycat.util (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Uses of Package
      com.sleepycat.util

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/constant-values.html b/docs/java/constant-values.html new file mode 100644 index 0000000..2439bc2 --- /dev/null +++ b/docs/java/constant-values.html @@ -0,0 +1,1836 @@ + + + + + +Constant Field Values (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Constant Field Values

      +

      Contents

      + +
      +
      + + +

      com.sleepycat.*

      + + + + + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/deprecated-list.html b/docs/java/deprecated-list.html new file mode 100644 index 0000000..6e9ff82 --- /dev/null +++ b/docs/java/deprecated-list.html @@ -0,0 +1,1015 @@ + + + + + +Deprecated List (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      + + +
        +
      • + + + + + + + + + + + + + +
        Deprecated Classes 
        Class and Description
        com.sleepycat.je.jmx.JEMBeanHelper +
        As of JE 4, JEMBeanHelper is deprecated in favor of the concrete + MBeans available by default with a JE environment. These MBeans can be + registered and enabled by the environment by setting the following JVM + property: + JEMonitor: + This MBean provides general stats monitoring and access to basic + environment level operations. + + JEMBeanHelper is a utility class for the MBean implementation which wants to + add management of a JE environment to its capabilities. MBean + implementations can contain a JEMBeanHelper instance to get MBean metadata + for JE and to set attributes, get attributes, and invoke operations. +

        + com.sleepycat.je.jmx.JEMonitor and the example program + jmx.JEApplicationMBean are two MBean implementations which provide support + different application use cases. See those classes for examples of how to + use JEMBeanHelper.

        +
        com.sleepycat.je.LockStats +
        as of 4.0.10, replaced by Environment.getStats(StatsConfig).

        +
        +
      • +
      + + + + + + + + + + + + + + + + + + + + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/help-doc.html b/docs/java/help-doc.html new file mode 100644 index 0000000..c2bea6d --- /dev/null +++ b/docs/java/help-doc.html @@ -0,0 +1,234 @@ + + + + + +API Help (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      How This API Document Is Organized

      +
      This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
      +
      +
      +
        +
      • +

        Overview

        +

        The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

        +
      • +
      • +

        Package

        +

        Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

        +
          +
        • Interfaces (italic)
        • +
        • Classes
        • +
        • Enums
        • +
        • Exceptions
        • +
        • Errors
        • +
        • Annotation Types
        • +
        +
      • +
      • +

        Class/Interface

        +

        Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

        +
          +
        • Class inheritance diagram
        • +
        • Direct Subclasses
        • +
        • All Known Subinterfaces
        • +
        • All Known Implementing Classes
        • +
        • Class/interface declaration
        • +
        • Class/interface description
        • +
        +
          +
        • Nested Class Summary
        • +
        • Field Summary
        • +
        • Constructor Summary
        • +
        • Method Summary
        • +
        +
          +
        • Field Detail
        • +
        • Constructor Detail
        • +
        • Method Detail
        • +
        +

        Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

        +
      • +
      • +

        Annotation Type

        +

        Each annotation type has its own separate page with the following sections:

        +
          +
        • Annotation Type declaration
        • +
        • Annotation Type description
        • +
        • Required Element Summary
        • +
        • Optional Element Summary
        • +
        • Element Detail
        • +
        +
      • +
      • +

        Enum

        +

        Each enum has its own separate page with the following sections:

        +
          +
        • Enum declaration
        • +
        • Enum description
        • +
        • Enum Constant Summary
        • +
        • Enum Constant Detail
        • +
        +
      • +
      • +

        Use

        +

        Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

        +
      • +
      • +

        Tree (Class Hierarchy)

        +

        There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

        +
          +
        • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
        • +
        • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
        • +
        +
      • +
      • +

        Deprecated API

        +

        The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

        +
      • +
      • +

        Index

        +

        The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

        +
      • +
      • +

        Prev/Next

        +

        These links take you to the next or previous class, interface, package, or related page.

        +
      • +
      • +

        Frames/No Frames

        +

        These links show and hide the HTML frames. All pages are available with or without frames.

        +
      • +
      • +

        All Classes

        +

        The All Classes link shows all classes and interfaces except non-static nested types.

        +
      • +
      • +

        Serialized Form

        +

        Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

        +
      • +
      • +

        Constant Field Values

        +

        The Constant Field Values page lists the static final fields and their values.

        +
      • +
      +This help file applies to API documentation generated using the standard doclet.
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/index-all.html b/docs/java/index-all.html new file mode 100644 index 0000000..ff4eddc --- /dev/null +++ b/docs/java/index-all.html @@ -0,0 +1,12102 @@ + + + + + +Index (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      A B C D E F G H I J K L M N O P Q R S T U V W X  + + +

      A

      +
      +
      abort() - Method in class com.sleepycat.je.Transaction
      +
      +
      Cause an abnormal termination of the transaction.
      +
      +
      abortTransaction() - Method in class com.sleepycat.collections.CurrentTransaction
      +
      +
      Aborts the transaction that is active for the current thread for this + environment and makes the parent transaction (if any) the current + transaction.
      +
      +
      acksPending() - Method in exception com.sleepycat.je.rep.InsufficientAcksException
      +
      +
      It returns the number of Replicas that did not respond with an + acknowledgment within the Replica commit timeout period.
      +
      +
      acksRequired() - Method in exception com.sleepycat.je.rep.InsufficientAcksException
      +
      +
      It returns the number of acknowledgments required by the commit policy.
      +
      +
      ackTimeout() - Method in exception com.sleepycat.je.rep.InsufficientAcksException
      +
      +
      Returns the acknowledgment timeout that was in effect at the time of the + exception.
      +
      +
      add(Map.Entry<K, V>) - Method in class com.sleepycat.collections.StoredEntrySet
      +
      +
      Adds the specified element to this set if it is not already present + (optional operation).
      +
      +
      add(E) - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Inserts the specified element into the list or inserts a duplicate into + other types of collections (optional operation).
      +
      +
      add(K) - Method in class com.sleepycat.collections.StoredKeySet
      +
      +
      Adds the specified key to this set if it is not already present + (optional operation).
      +
      +
      add(E) - Method in class com.sleepycat.collections.StoredValueSet
      +
      +
      Adds the specified entity to this set if it is not already present + (optional operation).
      +
      +
      addAll(Collection<? extends E>) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Adds all of the elements in the specified collection to this collection + (optional operation).
      +
      +
      addClassToEvolve(String) - Method in class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Adds an entity class for a primary index to be converted.
      +
      +
      addCondition(SecondaryIndex<SK, PK, E>, SK) - Method in class com.sleepycat.persist.EntityJoin
      +
      +
      Adds a secondary key condition to the equality join.
      +
      +
      addConfiguredFileset(FileSet) - Method in class com.sleepycat.persist.model.ClassEnhancerTask
      +
       
      +
      addConverter(Converter) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Adds a converter mutation.
      +
      +
      addDeleter(Deleter) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Adds a deleter mutation.
      +
      +
      addOperations() - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      addOperations() - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      Add MBean operations into the list.
      +
      +
      addOperations() - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      addRenamer(Renamer) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Adds a renamer mutation.
      +
      +
      addSize(int) - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Skip the given number of bytes in the buffer.
      +
      +
      ADLER32_CHUNK_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      By default, JE passes an entire log record to the Adler32 class for + checksumming.
      +
      +
      ALLOW_ARBITER_ACK - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Boolean flag if set to true, an Arbiter may acknowledge a transaction if + a replication node is not available.
      +
      +
      AnnotationModel - Class in com.sleepycat.persist.model
      +
      +
      The default annotation-based entity model.
      +
      +
      AnnotationModel() - Constructor for class com.sleepycat.persist.model.AnnotationModel
      +
      +
      Constructs a model for annotated entity classes.
      +
      +
      append(V) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Appends a given value returning the newly assigned key.
      +
      +
      AppStateMonitor - Interface in com.sleepycat.je.rep
      +
      +
      A mechanism for adding application specific information when asynchronously + tracking the state of a running JE HA application.
      +
      +
      Arbiter - Class in com.sleepycat.je.rep.arbiter
      +
      +
      Provides a mechanism to allow write availability for the Replication + group even when the number of replication nodes is less than majority.
      +
      +
      Arbiter(ArbiterConfig) - Constructor for class com.sleepycat.je.rep.arbiter.Arbiter
      +
      +
      An Arbiter used in elections and transaction acknowledgments.
      +
      +
      ARBITER_OUTPUT_QUEUE_SIZE - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The size of the the queue used to hold commit records that the Feeder + uses to request acknowledgment from an Arbiter.
      +
      +
      ArbiterConfig - Class in com.sleepycat.je.rep.arbiter
      +
      +
      The configuration parameters for an Arbiter.
      +
      +
      ArbiterConfig() - Constructor for class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Arbiter configuration.
      +
      +
      ArbiterConfig(Properties) - Constructor for class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Arbiter configuration.
      +
      +
      ArbiterMutableConfig - Class in com.sleepycat.je.rep.arbiter
      +
      +
      The mutable configuration parameters for an Arbiter.
      +
      +
      ArbiterStats - Class in com.sleepycat.je.rep.arbiter
      +
      +
      Statistics for an Arbiter.
      +
      +
      areDuplicatesAllowed() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether duplicate keys are allowed in this container.
      +
      +
      areDuplicatesOrdered() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether duplicate keys are allowed and sorted by element value.
      +
      +
      areKeyRangesAllowed() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether key ranges are allowed in this container.
      +
      +
      areKeysRenumbered() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether keys are renumbered when insertions and deletions occur.
      +
      +
      assignKey(DatabaseEntry) - Method in interface com.sleepycat.collections.PrimaryKeyAssigner
      +
      +
      Assigns a new primary key value into the given buffer.
      +
      +
      AtomicLongMax - Class in com.sleepycat.je.rep.util
      +
      +
      An Atomic long that maintains a max value
      +
      +
      AtomicLongMax(long) - Constructor for class com.sleepycat.je.rep.util.AtomicLongMax
      +
       
      +
      ATT_CACHE_PERCENT - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_CACHE_PERCENT - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_CACHE_SIZE - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_CACHE_SIZE - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_CONSOLEHANDLER_LEVEL - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      ATT_ENV_HOME - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_ENV_HOME - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_FILEHANDLER_LEVEL - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      ATT_IS_READ_ONLY - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_IS_READ_ONLY - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_IS_SERIALIZABLE - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_IS_SERIALIZABLE - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_IS_TRANSACTIONAL - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_IS_TRANSACTIONAL - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_LOCK_TIMEOUT - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_LOCK_TIMEOUT - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      ATT_OPEN - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_SET_READ_ONLY - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_SET_SERIALIZABLE - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_SET_TRANSACTIONAL - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_TXN_TIMEOUT - Static variable in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      ATT_TXN_TIMEOUT - Static variable in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      available() - Method in class com.sleepycat.je.util.LogVerificationInputStream
      +
      available() - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      + + + +

      B

      +
      +
      beginTransaction(TransactionConfig) - Method in class com.sleepycat.collections.CurrentTransaction
      +
      +
      Begins a new transaction for this environment and associates it with + the current thread.
      +
      +
      beginTransaction(Transaction, TransactionConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Creates a new transaction in the database environment.
      +
      +
      BigDecimalBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for an unsorted BigDecimal + value.
      +
      +
      BigDecimalBinding() - Constructor for class com.sleepycat.bind.tuple.BigDecimalBinding
      +
       
      +
      bigDecimalToEntry(BigDecimal, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.BigDecimalBinding
      +
      +
      Converts a BigDecimal value into an entry buffer.
      +
      +
      bigDecimalToEntry(BigDecimal, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedBigDecimalBinding
      +
      +
      Converts a BigDecimal value into an entry buffer.
      +
      +
      BigIntegerBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a BigInteger value.
      +
      +
      BigIntegerBinding() - Constructor for class com.sleepycat.bind.tuple.BigIntegerBinding
      +
       
      +
      bigIntegerToEntry(BigInteger, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.BigIntegerBinding
      +
      +
      Converts a BigInteger value into an entry buffer.
      +
      +
      BinaryEqualityComparator - Interface in com.sleepycat.je
      +
      +
      A tag interface used to mark a BTree or duplicate comparator class as a + binary equality comparator, that is, a comparator that considers + two keys (byte arrays) to be equal if and only if they have the same + length and they are equal byte-per-byte.
      +
      +
      BIND_INADDR_ANY - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      When this configuration parameter is set to true, it binds the HA socket + to INADDR_ANY, so that HA services are available on all network + interfaces.
      +
      +
      BooleanBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a Boolean primitive + wrapper or a boolean primitive.
      +
      +
      BooleanBinding() - Constructor for class com.sleepycat.bind.tuple.BooleanBinding
      +
       
      +
      booleanToEntry(boolean, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.BooleanBinding
      +
      +
      Converts a simple boolean value into an entry buffer.
      +
      +
      BtreeStats - Class in com.sleepycat.je
      +
      +
      The BtreeStats object is used to return Btree database statistics.
      +
      +
      BtreeStats() - Constructor for class com.sleepycat.je.BtreeStats
      +
       
      +
      buf - Variable in class com.sleepycat.util.FastInputStream
      +
       
      +
      ByteArrayBinding - Class in com.sleepycat.bind
      +
      +
      A pass-through EntryBinding that uses the entry's byte array as + the key or data object.
      +
      +
      ByteArrayBinding() - Constructor for class com.sleepycat.bind.ByteArrayBinding
      +
      +
      Creates a byte array binding.
      +
      +
      ByteBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a Byte primitive + wrapper or a byte primitive.
      +
      +
      ByteBinding() - Constructor for class com.sleepycat.bind.tuple.ByteBinding
      +
       
      +
      bytesToChars(byte[], int, char[], int, int, boolean) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Converts byte arrays into character arrays.
      +
      +
      bytesToString(byte[], int, int) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Converts byte arrays into strings.
      +
      +
      byteToEntry(byte, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.ByteBinding
      +
      +
      Converts a simple byte value into an entry buffer.
      +
      +
      + + + +

      C

      +
      +
      CacheMode - Enum in com.sleepycat.je
      +
      +
      Modes that can be specified for control over caching of records in the JE + in-memory cache.
      +
      +
      CharacterBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a Character primitive + wrapper or a char primitive.
      +
      +
      CharacterBinding() - Constructor for class com.sleepycat.bind.tuple.CharacterBinding
      +
       
      +
      charsToBytes(char[], int, byte[], int, int) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Converts character arrays into byte arrays.
      +
      +
      charToEntry(char, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.CharacterBinding
      +
      +
      Converts a simple char value into an entry buffer.
      +
      +
      checkpoint(CheckpointConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Synchronously checkpoint the database environment.
      +
      +
      CheckpointConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a checkpoint operation invoked from Environment.checkpoint.
      +
      +
      CheckpointConfig() - Constructor for class com.sleepycat.je.CheckpointConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      CHECKPOINTER_BYTES_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Ask the checkpointer to run every time we write this many bytes to the + log.
      +
      +
      CHECKPOINTER_DEADLOCK_RETRY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of times to retry a checkpoint if it runs into a deadlock.
      +
      +
      CHECKPOINTER_HIGH_PRIORITY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, the checkpointer uses more resources in order to complete the + checkpoint in a shorter time interval.
      +
      +
      CHECKPOINTER_WAKEUP_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The checkpointer wakeup interval in microseconds.
      +
      +
      ClassCatalog - Interface in com.sleepycat.bind.serial
      +
      +
      A catalog of class description information for use during object + serialization.
      +
      +
      ClassEnhancer - Class in com.sleepycat.persist.model
      +
      +
      Enhances the bytecode of persistent classes to provide efficient access to + fields and constructors, and to avoid special security policy settings for + accessing non-public members.
      +
      +
      ClassEnhancer() - Constructor for class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Creates a class enhancer that searches all packages.
      +
      +
      ClassEnhancer(Set<String>) - Constructor for class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Creates a class enhancer that searches a given set of packages.
      +
      +
      ClassEnhancerTask - Class in com.sleepycat.persist.model
      +
      +
      An ant task for running the ClassEnhancer.
      +
      +
      ClassEnhancerTask() - Constructor for class com.sleepycat.persist.model.ClassEnhancerTask
      +
       
      +
      classForName(String) - Static method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Deprecated. +
      use EntityModel.resolveClass(java.lang.String) instead. This method does not + use the environment's ClassLoader property.
      +
      +
      +
      ClassMetadata - Class in com.sleepycat.persist.model
      +
      +
      The metadata for a persistent class.
      +
      +
      ClassMetadata(String, int, String, boolean, PrimaryKeyMetadata, Map<String, SecondaryKeyMetadata>, List<FieldMetadata>) - Constructor for class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Used by an EntityModel to construct persistent class metadata.
      +
      +
      ClassMetadata(String, int, String, boolean, PrimaryKeyMetadata, Map<String, SecondaryKeyMetadata>, List<FieldMetadata>, Collection<FieldMetadata>) - Constructor for class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Used by an EntityModel to construct persistent class metadata.
      +
      +
      className - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      ClassResolver - Class in com.sleepycat.util
      +
      +
      Implements policies for loading user-supplied classes.
      +
      +
      ClassResolver() - Constructor for class com.sleepycat.util.ClassResolver
      +
       
      +
      ClassResolver.Stream - Class in com.sleepycat.util
      +
      +
      A specialized ObjectInputStream that supports use of a user-specified + ClassLoader.
      +
      +
      CLEANER_ADJUST_UTILIZATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      in JE 6.3. Adjustments are no longer needed because LN log + sizes have been stored in the Btree since JE 6.0.
      +
      +
      +
      CLEANER_BACKGROUND_PROACTIVE_MIGRATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      This parameter is ignored and proactive migration is no + longer supported due to its negative impact on eviction and + checkpointing. To reduce a cleaner backlog, configure more cleaner + threads.
      +
      +
      +
      CLEANER_BYTES_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The cleaner checks disk utilization every time we write this many bytes + to the log.
      +
      +
      CLEANER_DEADLOCK_RETRY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of times to retry cleaning if a deadlock occurs.
      +
      +
      CLEANER_DETAIL_MAX_MEMORY_PERCENTAGE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Tracking of detailed cleaning information will use no more than this + percentage of the cache.
      +
      +
      CLEANER_EXPUNGE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true (the default setting), the cleaner deletes log files after + successful cleaning.
      +
      +
      CLEANER_FETCH_OBSOLETE_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, the cleaner will fetch records to determine their size and more + accurately calculate log utilization.
      +
      +
      CLEANER_FORCE_CLEAN_FILES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Specifies a list of files or file ranges to be cleaned at a time when no + other log cleaning is necessary.
      +
      +
      CLEANER_FOREGROUND_PROACTIVE_MIGRATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      This parameter is ignored and proactive migration is no + longer supported due to its negative impact on eviction and Btree + splits. To reduce a cleaner backlog, configure more cleaner threads.
      +
      +
      +
      CLEANER_LAZY_MIGRATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      This parameter is ignored and lazy migration is no longer + supported due to its negative impact on eviction and checkpointing. + To reduce a cleaner backlog, configure more cleaner threads.
      +
      +
      +
      CLEANER_LOCK_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The lock timeout for cleaner transactions in microseconds.
      +
      +
      CLEANER_LOOK_AHEAD_CACHE_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The look ahead cache size for cleaning in bytes.
      +
      +
      CLEANER_MAX_BATCH_FILES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      in 7.0. No longer used because the cleaner no longer has a + backlog.
      +
      +
      +
      CLEANER_MIN_AGE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The minimum age of a file (number of files between it and the active + file) to qualify it for cleaning under any conditions.
      +
      +
      CLEANER_MIN_FILE_UTILIZATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A log file will be cleaned if its utilization percentage is below this + value, irrespective of total utilization.
      +
      +
      CLEANER_MIN_UTILIZATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The cleaner will keep the total disk space utilization percentage above + this value.
      +
      +
      CLEANER_READ_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The read buffer size for cleaning.
      +
      +
      CLEANER_THREADS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of threads allocated by the cleaner for log file processing.
      +
      +
      CLEANER_UPGRADE_TO_LOG_VERSION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      All log files having a log version prior to the specified version will + be cleaned at a time when no other log cleaning is necessary.
      +
      +
      CLEANER_USE_DELETED_DIR - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      When EnvironmentConfig.CLEANER_EXPUNGE is false, the CLEANER_USE_DELETED_DIR parameter determines whether successfully + cleaned files are moved to the "deleted" sub-directory.
      +
      +
      CLEANER_WAKEUP_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The cleaner checks whether cleaning is needed if this interval elapses + without any writing, to handle the case where cleaning or checkpointing + is necessary to reclaim disk space, but writing has stopped.
      +
      +
      cleanLog() - Method in class com.sleepycat.je.Environment
      +
      +
      Synchronously invokes log file (data file) cleaning until the target + disk space utilization has been reached; this method is called + periodically by the cleaner background threads.
      +
      +
      cleanLogFile() - Method in class com.sleepycat.je.Environment
      +
      +
      Synchronously invokes cleaning of a single log file (data file), if + the target disk space utilization has not been reached.
      +
      +
      clear() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Removes all mappings or elements from this map or collection (optional + operation).
      +
      +
      CLEAR - Static variable in class com.sleepycat.je.StatsConfig
      +
      +
      A convenience instance for which setClear(true) has been called, and + all other properties have default values.
      +
      +
      clone() - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.JoinConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.ReadOptions
      +
       
      +
      clone() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
       
      +
      clone() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
       
      +
      clone() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns a copy of this configuration object.
      +
      +
      clone() - Method in class com.sleepycat.je.WriteOptions
      +
       
      +
      clone() - Method in class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Returns a shallow copy of the configuration.
      +
      +
      clone() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns a shallow copy of the configuration.
      +
      +
      cloneConfig() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Deprecated. +
      As of JE 4.0.13, replaced by DatabaseConfig.clone().

      +
      +
      +
      cloneConfig() - Method in class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Deprecated. +
      As of JE 4.0.13, replaced by EvolveConfig.clone().
      +
      +
      +
      cloneConfig() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Deprecated. +
      As of JE 4.0.13, replaced by StoreConfig.clone().
      +
      +
      +
      close() - Method in interface com.sleepycat.bind.serial.ClassCatalog
      +
      +
      Close a catalog database and release any cached resources.
      +
      +
      close() - Method in class com.sleepycat.bind.serial.StoredClassCatalog
      +
       
      +
      close(Iterator<?>) - Static method in class com.sleepycat.collections.StoredIterator
      +
      +
      Closes the given iterator using StoredIterator.close() if it is a StoredIterator.
      +
      +
      close() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Closes this iterator.
      +
      +
      close() - Method in class com.sleepycat.je.Cursor
      +
      +
      Discards the cursor.
      +
      +
      close() - Method in class com.sleepycat.je.Database
      +
      +
      Discards the database handle.
      +
      +
      close() - Method in class com.sleepycat.je.DiskOrderedCursor
      +
      +
      Discards the cursor.
      +
      +
      close() - Method in class com.sleepycat.je.Environment
      +
      +
      The Environment.close method closes the Berkeley DB environment.
      +
      +
      close() - Method in interface com.sleepycat.je.ForwardCursor
      +
      +
      Discards the cursor.
      +
      +
      close() - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      close() - Method in class com.sleepycat.je.JoinCursor
      +
      +
      Closes the cursors that have been opened by this join cursor.
      +
      +
      close() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Close this ReplicatedEnvironment and release any resources used by the + handle.
      +
      +
      close() - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Closes a secondary database and dis-associates it from its primary + database.
      +
      +
      close() - Method in class com.sleepycat.je.Sequence
      +
      +
      Closes a sequence.
      +
      +
      close() - Method in class com.sleepycat.je.util.LogVerificationInputStream
      +
      close() - Method in class com.sleepycat.je.util.LogVerificationReadableByteChannel
      +
      close() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Closes the cursor.
      +
      +
      close() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Closes all databases and sequences that were opened via this store.
      +
      +
      close() - Method in interface com.sleepycat.persist.ForwardCursor
      +
      +
      Closes the cursor.
      +
      +
      close() - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Closes all databases and sequences that were opened by this model.
      +
      +
      closeClass(Class) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Closes the primary and secondary databases for the given entity class + that were opened via this store.
      +
      +
      com.sleepycat.bind - package com.sleepycat.bind
      +
      +
      Bindings between database entries and Java objects.
      +
      +
      com.sleepycat.bind.serial - package com.sleepycat.bind.serial
      +
      +
      Bindings that use Java serialization.
      +
      +
      com.sleepycat.bind.tuple - package com.sleepycat.bind.tuple
      +
      +
      Bindings that use sequences of primitive fields, or tuples.
      +
      +
      com.sleepycat.collections - package com.sleepycat.collections
      +
      +
      Data access based on the standard Java collections API.
      +
      +
      com.sleepycat.je - package com.sleepycat.je
      +
      +
      Foundation for creating environments, databases and transactions; provides +cursor based data access.
      +
      +
      com.sleepycat.je.jmx - package com.sleepycat.je.jmx
      +
      +
      Implementations of JMX MBeans for JE.
      +
      +
      com.sleepycat.je.rep - package com.sleepycat.je.rep
      +
      +
      +Berkeley DB Java Edition High Availability (JE HA) enables replication of JE +environments.
      +
      +
      com.sleepycat.je.rep.arbiter - package com.sleepycat.je.rep.arbiter
      +
      +
      Provides a mechanism to allow write availability for the Replication +group even when the number of replication nodes is less than majority.
      +
      +
      com.sleepycat.je.rep.monitor - package com.sleepycat.je.rep.monitor
      +
      +
      BDB JE HA support for applications that need to track the composition of a +replication group, in order to do tasks such as load balancing and +request routing.
      +
      +
      com.sleepycat.je.rep.util - package com.sleepycat.je.rep.util
      +
      +
      BDB JE High Availability command line utilities and helper classes.
      +
      +
      com.sleepycat.je.util - package com.sleepycat.je.util
      +
      +
      Supporting utilities.
      +
      +
      com.sleepycat.persist - package com.sleepycat.persist
      +
      +
      The Direct Persistence Layer (DPL) adds a persistent object model to the +Berkeley DB transactional engine.
      +
      +
      com.sleepycat.persist.evolve - package com.sleepycat.persist.evolve
      +
      +
      Utilities for managing class evolution of persistent objects.
      +
      +
      com.sleepycat.persist.model - package com.sleepycat.persist.model
      +
      +
      Annotations for defining a persistent object model.
      +
      +
      com.sleepycat.persist.raw - package com.sleepycat.persist.raw
      +
      +
      Raw data access for general purpose tools and manual conversions.
      +
      +
      com.sleepycat.util - package com.sleepycat.util
      +
      +
      General utilities used throughout Berkeley DB.
      +
      +
      commit() - Method in class com.sleepycat.je.Transaction
      +
      +
      End the transaction.
      +
      +
      commit(Durability) - Method in class com.sleepycat.je.Transaction
      +
      +
      End the transaction using the specified durability requirements.
      +
      +
      commit(Xid, boolean) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      COMMIT_NO_SYNC - Static variable in class com.sleepycat.je.Durability
      +
      +
      A convenience constant that defines a durability policy with + COMMIT_NO_SYNC for local commit synchronization.
      +
      +
      COMMIT_SYNC - Static variable in class com.sleepycat.je.Durability
      +
      +
      A convenience constant that defines a durability policy with COMMIT_SYNC + for local commit synchronization.
      +
      +
      COMMIT_WRITE_NO_SYNC - Static variable in class com.sleepycat.je.Durability
      +
      +
      A convenience constant that defines a durability policy with + COMMIT_WRITE_NO_SYNC for local commit synchronization.
      +
      +
      commitNoSync() - Method in class com.sleepycat.je.Transaction
      +
      +
      End the transaction, not writing to stable storage and not committing + synchronously.
      +
      +
      CommitPointConsistencyPolicy - Class in com.sleepycat.je.rep
      +
      +
      A consistency policy which ensures that the environment on a Replica node is + at least as current as denoted by the specified CommitToken.
      +
      +
      CommitPointConsistencyPolicy(CommitToken, long, TimeUnit) - Constructor for class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
      +
      Defines how current a Replica needs to be in terms of a specific + transaction that was committed on the Master.
      +
      +
      commitSync() - Method in class com.sleepycat.je.Transaction
      +
      +
      End the transaction, writing to stable storage and committing + synchronously.
      +
      +
      CommitToken - Class in com.sleepycat.je
      +
      +
      Defines an opaque token that can be used to identify a specific transaction + commit in a replicated environment.
      +
      +
      commitTransaction() - Method in class com.sleepycat.collections.CurrentTransaction
      +
      +
      Commits the transaction that is active for the current thread for this + environment and makes the parent transaction (if any) the current + transaction.
      +
      +
      commitWriteNoSync() - Method in class com.sleepycat.je.Transaction
      +
      +
      End the transaction, writing to stable storage but not committing + synchronously.
      +
      +
      comparator() - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns null since comparators are not supported.
      +
      +
      comparator() - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns null since comparators are not supported.
      +
      +
      comparator() - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns null since comparators are not supported.
      +
      +
      comparator() - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns null since comparators are not supported.
      +
      +
      compareDuplicates(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Compares two data elements using either the default comparator if no + duplicate comparator has been set or the duplicate comparator if one has + been set.
      +
      +
      compareKeys(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Compares two keys using either the default comparator if no BTree + comparator has been set or the BTree comparator if one has been set.
      +
      +
      compareTo(CommitToken) - Method in class com.sleepycat.je.CommitToken
      +
      +
      Implements the Comparable interface.
      +
      +
      compareTo(JEVersion) - Method in class com.sleepycat.je.JEVersion
      +
       
      +
      compress() - Method in class com.sleepycat.je.Environment
      +
      +
      Synchronously invokes the compressor mechanism which compacts in memory + data structures after delete operations.
      +
      +
      COMPRESSOR_DEADLOCK_RETRY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of times to retry a compression run if a deadlock occurs.
      +
      +
      COMPRESSOR_LOCK_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The lock timeout for compressor transactions in microseconds.
      +
      +
      COMPRESSOR_PURGE_ROOT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      as of 3.3.87. Compression of the root node no longer has + any benefit and this feature has been removed. This parameter has no + effect.
      +
      +
      +
      COMPRESSOR_WAKEUP_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The compressor thread wakeup interval in microseconds.
      +
      +
      ConfigBeanInfoBase - Class in com.sleepycat.util
      +
       
      +
      ConfigBeanInfoBase() - Constructor for class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      configuredCollection(Collection<E>, CursorConfig) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Creates a configured collection from a given stored collection.
      +
      +
      configuredList(List<E>, CursorConfig) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Creates a configured list from a given stored list.
      +
      +
      configuredMap(Map<K, V>, CursorConfig) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Creates a configured map from a given stored map.
      +
      +
      configuredSet(Set<E>, CursorConfig) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Creates a configured set from a given stored set.
      +
      +
      configuredSortedMap(SortedMap<K, V>, CursorConfig) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Creates a configured sorted map from a given stored sorted map.
      +
      +
      configuredSortedSet(SortedSet<E>, CursorConfig) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Creates a configured sorted set from a given stored sorted set.
      +
      +
      CONSISTENCY_POLICY - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The default consistency policy used by a replica.
      +
      +
      CONSOLE_LOGGING_LEVEL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Trace messages equal and above this level will be logged to the + console.
      +
      +
      ConsoleHandler - Class in com.sleepycat.je.util
      +
      +
      JE instances of java.util.logging.Logger are configured to use this + implementation of java.util.logging.ConsoleHandler.
      +
      +
      ConsoleHandler(Formatter, EnvironmentImpl) - Constructor for class com.sleepycat.je.util.ConsoleHandler
      +
       
      +
      CONSOLEHANDLER_LEVEL - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      contains(Object) - Method in class com.sleepycat.collections.StoredEntrySet
      +
      +
      Returns true if this set contains the specified element.
      +
      +
      contains(Object) - Method in class com.sleepycat.collections.StoredKeySet
      +
      +
      Returns true if this set contains the specified key.
      +
      +
      contains(Object) - Method in class com.sleepycat.collections.StoredValueSet
      +
      +
      Returns true if this set contains the specified element.
      +
      +
      contains(K) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Checks for existence of a key in this index.
      +
      +
      contains(Transaction, K, LockMode) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Checks for existence of a key in this index.
      +
      +
      containsAll(Collection<?>) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns true if this collection contains all of the elements in the + specified collection.
      +
      +
      containsKey(Object) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns true if this map contains the specified key.
      +
      +
      containsValue(Object) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns true if this map contains the specified value.
      +
      +
      Conversion - Interface in com.sleepycat.persist.evolve
      +
      +
      Converts an old version of an object value to conform to the current class + or field definition.
      +
      +
      convert() - Method in class com.sleepycat.je.rep.util.DbEnableReplication
      +
      +
      Modify the log files in the environment directory to add a modicum of + replication required metadata.
      +
      +
      convert(Object) - Method in interface com.sleepycat.persist.evolve.Conversion
      +
      +
      Converts an old version of an object value to conform to the current + class or field definition.
      +
      +
      Converter - Class in com.sleepycat.persist.evolve
      +
      +
      A mutation for converting an old version of an object value to conform to + the current class or field definition.
      +
      +
      Converter(String, int, Conversion) - Constructor for class com.sleepycat.persist.evolve.Converter
      +
      +
      Creates a mutation for converting all instances of the given class + version to the current version of the class.
      +
      +
      Converter(String, int, String, Conversion) - Constructor for class com.sleepycat.persist.evolve.Converter
      +
      +
      Creates a mutation for converting all values of the given field in the + given class version to a type compatible with the current declared type + of the field.
      +
      +
      convertProxy() - Method in interface com.sleepycat.persist.model.PersistentProxy
      +
      +
      Returns a new proxied class instance to which the state of this proxy + instance has been copied.
      +
      +
      convertRawObject(RawObject) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Converts a given raw object to a live object according to the current + class definitions.
      +
      +
      copy() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
       
      +
      count() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns the number of elements having the same key value as the key + value of the element last returned by next() or previous().
      +
      +
      count() - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns a count of the number of data items for the key to which the + cursor refers.
      +
      +
      count() - Method in class com.sleepycat.je.Database
      +
      +
      Counts the key/data pairs in the database.
      +
      +
      count(long) - Method in class com.sleepycat.je.Database
      +
      +
      Counts the key/data pairs in the database.
      +
      +
      count() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns the number of values (duplicates) for the key at the cursor + position, or returns zero if all values for the key have been deleted.
      +
      +
      count() - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Returns a non-transactional count of the entities in this index.
      +
      +
      count(long) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Returns a non-transactional count of the entities in this index.
      +
      +
      countEstimate() - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns a rough estimate of the count of the number of data items for + the key to which the cursor refers.
      +
      +
      countEstimate() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns a rough estimate of the number of values (duplicates) for the + key at the cursor position, or returns zero if all values for the key + have been deleted.
      +
      +
      createSecondaryKey(SecondaryDatabase, DatabaseEntry, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
       
      +
      createSecondaryKey(PK, D) - Method in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
      +
      Creates the index key object from primary key and data objects.
      +
      +
      createSecondaryKey(SecondaryDatabase, DatabaseEntry, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
       
      +
      createSecondaryKey(TupleInput, D, TupleOutput) - Method in class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
      +
      Creates the index key entry from primary key tuple entry and + deserialized data entry.
      +
      +
      createSecondaryKey(TupleInput, D, TupleOutput) - Method in class com.sleepycat.bind.serial.TupleSerialMarshalledKeyCreator
      +
       
      +
      createSecondaryKey(SecondaryDatabase, DatabaseEntry, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleTupleKeyCreator
      +
       
      +
      createSecondaryKey(TupleInput, TupleInput, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleKeyCreator
      +
      +
      Creates the index key from primary key tuple and data tuple.
      +
      +
      createSecondaryKey(TupleInput, TupleInput, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleMarshalledKeyCreator
      +
       
      +
      createSecondaryKey(SecondaryDatabase, DatabaseEntry, DatabaseEntry, DatabaseEntry) - Method in interface com.sleepycat.je.SecondaryKeyCreator
      +
      +
      Creates a secondary key entry, given a primary key and data entry.
      +
      +
      createSecondaryKeys(SecondaryDatabase, DatabaseEntry, DatabaseEntry, Set<DatabaseEntry>) - Method in interface com.sleepycat.je.SecondaryMultiKeyCreator
      +
      +
      Creates a secondary key entry, given a primary key and data entry.
      +
      +
      current() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns the value at the cursor position, or null if the value at the + cursor position has been deleted.
      +
      +
      current(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns the value at the cursor position, or null if the value at the + cursor position has been deleted.
      +
      +
      CURRENT_VERSION - Static variable in class com.sleepycat.je.JEVersion
      +
      +
      Release version.
      +
      +
      currentClass - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      CurrentTransaction - Class in com.sleepycat.collections
      +
      +
      Provides access to the current transaction for the current thread within the + context of a Berkeley DB environment.
      +
      +
      Cursor - Class in com.sleepycat.je
      +
      +
      A database cursor.
      +
      +
      CursorConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of database cursor.
      +
      +
      CursorConfig() - Constructor for class com.sleepycat.je.CursorConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      CustomStats - Interface in com.sleepycat.je
      +
      +
      A custom statistics object.
      +
      +
      + + + +

      D

      +
      +
      Database - Class in com.sleepycat.je
      +
      +
      A database handle.
      +
      +
      DatabaseComparator - Interface in com.sleepycat.je
      +
      +
      Implemented by btree and duplicate comparators that need to be initialized + before they are used or need access to the environment's ClassLoader + property.
      +
      +
      DatabaseConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a database.
      +
      +
      DatabaseConfig() - Constructor for class com.sleepycat.je.DatabaseConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      DatabaseEntry - Class in com.sleepycat.je
      +
      +
      Encodes database key and data items as a byte array.
      +
      +
      DatabaseEntry() - Constructor for class com.sleepycat.je.DatabaseEntry
      +
      +
      Constructs a DatabaseEntry with null data.
      +
      +
      DatabaseEntry(byte[]) - Constructor for class com.sleepycat.je.DatabaseEntry
      +
      +
      Constructs a DatabaseEntry with a given byte array.
      +
      +
      DatabaseEntry(byte[], int, int) - Constructor for class com.sleepycat.je.DatabaseEntry
      +
      +
      Constructs a DatabaseEntry with a given byte array, offset and size.
      +
      +
      DatabaseException - Exception in com.sleepycat.je
      +
      +
      The root of all BDB JE-defined exceptions.
      +
      +
      DatabaseExistsException - Exception in com.sleepycat.je
      +
      +
      Thrown by Environment.openDatabase and + Environment.openSecondaryDatabase + if the database already exists and the DatabaseConfig + ExclusiveCreate parameter is true.
      +
      +
      DatabaseNotFoundException - Exception in com.sleepycat.je
      +
      +
      Thrown when an operation requires a database and that database does not + exist.
      +
      +
      DatabasePreemptedException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown when attempting to use a Database handle that was forcibly closed by + replication.
      +
      +
      DatabaseStats - Class in com.sleepycat.je
      +
      +
      Statistics for a single database.
      +
      +
      DatabaseStats() - Constructor for class com.sleepycat.je.DatabaseStats
      +
       
      +
      dataBinding - Variable in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
       
      +
      dataBinding - Variable in class com.sleepycat.bind.serial.TupleSerialBinding
      +
       
      +
      dataBinding - Variable in class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
       
      +
      DbBackup - Class in com.sleepycat.je.util
      +
      +
      DbBackup is a helper class for stopping and restarting JE background + activity in an open environment in order to simplify backup operations.
      +
      +
      DbBackup(Environment) - Constructor for class com.sleepycat.je.util.DbBackup
      +
      +
      Creates a DbBackup helper for a full backup.
      +
      +
      DbBackup(Environment, long) - Constructor for class com.sleepycat.je.util.DbBackup
      +
      +
      Creates a DbBackup helper for an incremental backup.
      +
      +
      DbCacheSize - Class in com.sleepycat.je.util
      +
      +
      Estimates the in-memory cache size needed to hold a specified data set.
      +
      +
      DbDeleteReservedFiles - Class in com.sleepycat.je.util
      +
      +
      Command line utility used to delete reserved files explicitly, when + attempting to recover from a disk-full condition.
      +
      +
      DbDump - Class in com.sleepycat.je.util
      +
      +
      Dump the contents of a database.
      +
      +
      DbDump(Environment, String, PrintStream, String, boolean) - Constructor for class com.sleepycat.je.util.DbDump
      +
      +
      Deprecated. +
      Please use the 4-arg ctor without outputDirectory instead.
      +
      +
      +
      DbDump(Environment, String, PrintStream, boolean) - Constructor for class com.sleepycat.je.util.DbDump
      +
      +
      Create a DbDump object for a specific environment and database.
      +
      +
      DbEnableReplication - Class in com.sleepycat.je.rep.util
      +
      +
      A utility to convert an existing, non replicated JE environment for + replication.
      +
      +
      DbEnableReplication(File, String, String, String) - Constructor for class com.sleepycat.je.rep.util.DbEnableReplication
      +
      +
      Create a DbEnableReplication object for this node.
      +
      +
      DbFilterStats - Class in com.sleepycat.je.util
      +
      +
      Transform one or more je.stat.csv statistics files and + write the output to stdout.
      +
      +
      DbFilterStats() - Constructor for class com.sleepycat.je.util.DbFilterStats
      +
       
      +
      DbGroupAdmin - Class in com.sleepycat.je.rep.util
      +
      +
      DbGroupAdmin supplies the functionality of the administrative class ReplicationGroupAdmin in a convenient command line utility.
      +
      +
      DbGroupAdmin(String, Set<InetSocketAddress>) - Constructor for class com.sleepycat.je.rep.util.DbGroupAdmin
      +
      +
      Create a DbGroupAdmin instance for programmatic use.
      +
      +
      DbLoad - Class in com.sleepycat.je.util
      +
      +
      Loads a database from a dump file generated by DbDump.
      +
      +
      DbLoad() - Constructor for class com.sleepycat.je.util.DbLoad
      +
      +
      Creates a DbLoad object.
      +
      +
      dbName - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      DbPing - Class in com.sleepycat.je.rep.util
      +
      +
      This class provides the utility to request the current state of a replica in + a JE replication group, see more details in + NodeState.
      +
      +
      DbPing(ReplicationNode, String, int) - Constructor for class com.sleepycat.je.rep.util.DbPing
      +
      +
      Create a DbPing instance for programmatic use.
      +
      +
      DbPrintLog - Class in com.sleepycat.je.util
      +
      +
      Dumps the contents of the log in XML format to System.out.
      +
      +
      DbPrintLog() - Constructor for class com.sleepycat.je.util.DbPrintLog
      +
       
      +
      DbResetRepGroup - Class in com.sleepycat.je.rep.util
      +
      +
      A utility to reset the members of a replication group, replacing the group + with a new group consisting of a single new member as described by the + arguments supplied to the utility.
      +
      +
      DbResetRepGroup(File, String, String, String) - Constructor for class com.sleepycat.je.rep.util.DbResetRepGroup
      +
      +
      Create a DbResetRepGroup object for this node.
      +
      +
      DbScavenger - Class in com.sleepycat.je.util
      +
      +
      Used to retrieve as much data as possible from a corrupted environment.
      +
      +
      DbScavenger(Environment, String, boolean, boolean, boolean) - Constructor for class com.sleepycat.je.util.DbScavenger
      +
      +
      Create a DbScavenger object for a specific environment.
      +
      +
      DbSpace - Class in com.sleepycat.je.util
      +
      +
      DbSpace displays the disk space utilization for an environment.
      +
      +
      DbSpace(Environment, boolean, boolean, boolean) - Constructor for class com.sleepycat.je.util.DbSpace
      +
      +
      Creates a DbSpace object for calculating utilization using an open + Environment.
      +
      +
      DbStat - Class in com.sleepycat.je.util
      +
       
      +
      DbStat(Environment, String) - Constructor for class com.sleepycat.je.util.DbStat
      +
       
      +
      DbTruncateLog - Class in com.sleepycat.je.util
      +
      +
      DbTruncateLog is a utility that lets the user truncate JE log starting at a + specified file and offset to the last log file, inclusive.
      +
      +
      DbTruncateLog() - Constructor for class com.sleepycat.je.util.DbTruncateLog
      +
       
      +
      DbVerify - Class in com.sleepycat.je.util
      +
      +
      Verifies the internal structures of a database.
      +
      +
      DbVerify(Environment, String, boolean) - Constructor for class com.sleepycat.je.util.DbVerify
      +
      +
      Deprecated. + +
      +
      +
      DbVerifyLog - Class in com.sleepycat.je.util
      +
      +
      Verifies the checksums in one or more log files.
      +
      +
      DbVerifyLog(Environment) - Constructor for class com.sleepycat.je.util.DbVerifyLog
      +
      +
      Creates a utility object for verifying the checksums in log files.
      +
      +
      DbVerifyLog(Environment, int) - Constructor for class com.sleepycat.je.util.DbVerifyLog
      +
      +
      Creates a utility object for verifying log files.
      +
      +
      DeadlockException - Exception in com.sleepycat.je
      +
      +
      Thrown when a deadlock is detected.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.CheckpointConfig
      +
      +
      Default configuration used if null is passed to Environment.checkpoint.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.CursorConfig
      +
      +
      Default configuration used if null is passed to methods that create a + cursor.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.DatabaseConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Default configuration used if null is passed to methods that create a + cursor.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.JoinConfig
      +
      +
      Default configuration used if null is passed to Database.join.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      An instance created using the default constructor is initialized with + the default settings.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.SecondaryConfig
      +
       
      +
      DEFAULT - Static variable in class com.sleepycat.je.SequenceConfig
      +
      +
      Default configuration used if null is passed to methods that create a + cursor.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.StatsConfig
      +
      +
      A convenience instance embodying the default configuration.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.TransactionConfig
      +
      +
      Default configuration used if null is passed to methods that create a + transaction.
      +
      +
      DEFAULT - Static variable in class com.sleepycat.je.VerifyConfig
      +
       
      +
      DEFAULT - Static variable in class com.sleepycat.persist.StoreConfig
      +
      +
      The default store configuration containing properties as if the + configuration were constructed and not modified.
      +
      +
      DEFAULT_BUMP_SIZE - Static variable in class com.sleepycat.util.FastOutputStream
      +
      +
      The default amount that the buffer is increased when it is full.
      +
      +
      DEFAULT_INIT_SIZE - Static variable in class com.sleepycat.util.FastOutputStream
      +
      +
      The default initial size of the buffer if no initialSize parameter is + specified.
      +
      +
      DEFAULT_ITERATOR_BLOCK_SIZE - Static variable in class com.sleepycat.collections.StoredCollection
      +
      +
      The default number of records read at one time by iterators.
      +
      +
      DEFAULT_MAX_RETRIES - Static variable in class com.sleepycat.collections.TransactionRunner
      +
      +
      The default maximum number of retries.
      +
      +
      DEFAULT_PORT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The default port used for replication.
      +
      +
      delete(WriteOptions) - Method in class com.sleepycat.je.Cursor
      +
      +
      Deletes the record to which the cursor refers.
      +
      +
      delete() - Method in class com.sleepycat.je.Cursor
      +
      +
      Deletes the record to which the cursor refers.
      +
      +
      delete(Transaction, DatabaseEntry, WriteOptions) - Method in class com.sleepycat.je.Database
      +
      +
      Removes records with a given key from the database.
      +
      +
      delete(Transaction, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Removes records with a given key from the database.
      +
      +
      delete(WriteOptions) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Delete the record to which the cursor refers from the primary database + and all secondary indices.
      +
      +
      delete() - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Delete the record to which the cursor refers from the primary database + and all secondary indices.
      +
      +
      delete(Transaction, DatabaseEntry, WriteOptions) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Deletes the record associated with the given secondary key.
      +
      +
      delete(Transaction, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Deletes the record associated with the given secondary key.
      +
      +
      delete() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Deletes the entity at the cursor position.
      +
      +
      delete(WriteOptions) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Deletes the entity at the cursor position, using a WriteOptions + parameter and returning an OperationResult.
      +
      +
      delete(K) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Deletes all entities with a given index key.
      +
      +
      delete(Transaction, K) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Deletes all entities with a given index key.
      +
      +
      delete(Transaction, K, WriteOptions) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Deletes all entities with a given index key, using a WriteOptions + parameter and returning an OperationResult.
      +
      +
      DeleteAction - Enum in com.sleepycat.persist.model
      +
      +
      Specifies the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity.
      +
      +
      DeleteConstraintException - Exception in com.sleepycat.je
      +
      +
      Thrown when an attempt is made to delete a key from a foreign key database, + when that key is referenced by a secondary database, and the secondary is + configured to cause an abort in this situation.
      +
      +
      DeletedClassException - Exception in com.sleepycat.persist.evolve
      +
      +
      While reading from an index, an instance of a deleted class version was + encountered.
      +
      +
      Deleter - Class in com.sleepycat.persist.evolve
      +
      +
      A mutation for deleting an entity class or field.
      +
      +
      Deleter(String, int) - Constructor for class com.sleepycat.persist.evolve.Deleter
      +
      +
      Creates a mutation for deleting an entity class.
      +
      +
      Deleter(String, int, String) - Constructor for class com.sleepycat.persist.evolve.Deleter
      +
      +
      Creates a mutation for deleting the given field from all instances of + the given class version.
      +
      +
      DESCRIPTION - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      DESIGNATED_PRIMARY - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Identifies the Primary node in a two node group.
      +
      +
      DiskLimitException - Exception in com.sleepycat.je
      +
      +
      Thrown when a write operation cannot be performed because a disk limit has + been violated.
      +
      +
      DiskOrderedCursor - Class in com.sleepycat.je
      +
      +
      DiskOrderedCursor returns records in unsorted order in exchange for + generally faster retrieval times.
      +
      +
      DiskOrderedCursorConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a DiskOrderedCursor.
      +
      +
      DiskOrderedCursorConfig() - Constructor for class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      DiskOrderedCursorProducerException - Exception in com.sleepycat.je
      +
      +
      Thrown by ForwardCursor.getNext when a + DiskOrderedCursor producer thread throws an exception.
      +
      +
      doAggressiveScavengerRun - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      doRegister(Environment) - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      For EnvironmentImpl.MBeanRegistrar interface.
      +
      +
      doRegisterMBean(Environment) - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      doRegisterMBean(Environment) - Method in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      doRegisterMBean(Environment) - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      DOS_PRODUCER_QUEUE_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The timeout for Disk Ordered Scan producer thread queue offers in + milliseconds.
      +
      +
      doScavengerRun - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      DoubleBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for an unsorted Double + primitive wrapper or an unsorted double primitive.
      +
      +
      DoubleBinding() - Constructor for class com.sleepycat.bind.tuple.DoubleBinding
      +
       
      +
      doubleToEntry(double, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.DoubleBinding
      +
      +
      Converts a simple double value into an entry buffer.
      +
      +
      doubleToEntry(double, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedDoubleBinding
      +
      +
      Converts a simple double value into an entry buffer.
      +
      +
      doUnregister() - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      For EnvironmentImpl.MBeanRegistrar interface.
      +
      +
      doWork() - Method in interface com.sleepycat.collections.TransactionWorker
      +
      +
      Perform the work for a single transaction.
      +
      +
      dump() - Method in class com.sleepycat.je.util.DbDump
      +
      +
      Perform the dump.
      +
      +
      dump(File, String, String, long, long, boolean, boolean, boolean, boolean, boolean, boolean, String) - Method in class com.sleepycat.je.util.DbPrintLog
      +
      +
      Dump a JE log into human readable form.
      +
      +
      dump() - Method in class com.sleepycat.je.util.DbScavenger
      +
      +
      Start the scavenger run.
      +
      +
      dumpGroup() - Method in class com.sleepycat.je.rep.util.DbGroupAdmin
      +
      +
      Display group information.
      +
      +
      dumpOne(PrintStream, byte[], boolean) - Method in class com.sleepycat.je.util.DbDump
      +
       
      +
      dup(boolean) - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns a new cursor with the same transaction and locker ID as the + original cursor.
      +
      +
      dup(boolean) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Returns a new SecondaryCursor for the same transaction as + the original cursor.
      +
      +
      dup() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Duplicates the cursor at the cursor position.
      +
      +
      DuplicateDataException - Exception in com.sleepycat.je
      +
      +
      Thrown by Cursor.putCurrent if the old and new + data are not equal according to the configured duplicate comparator or + default comparator.
      +
      +
      duplicates(K) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns a new collection containing the values mapped to the given key + in this map.
      +
      +
      duplicatesMap(K, EntryBinding) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns a new map from primary key to value for the subset of records + having a given secondary key (duplicates).
      +
      +
      dupSecondary(boolean) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Deprecated. +
      As of JE 4.0.13, replaced by Cursor.dup(boolean).

      +
      +
      +
      Durability - Class in com.sleepycat.je
      +
      +
      Durability defines the overall durability characteristics associated with a + transaction.
      +
      +
      Durability(Durability.SyncPolicy, Durability.SyncPolicy, Durability.ReplicaAckPolicy) - Constructor for class com.sleepycat.je.Durability
      +
      +
      Creates an instance of a Durability specification.
      +
      +
      Durability.ReplicaAckPolicy - Enum in com.sleepycat.je
      +
      +
      A replicated environment makes it possible to increase an application's + transaction commit guarantees by committing changes to its replicas on + the network.
      +
      +
      Durability.SyncPolicy - Enum in com.sleepycat.je
      +
      +
      Defines the synchronization policy to be used when committing a + transaction.
      +
      +
      + + + +

      E

      +
      +
      ELECTABLE_GROUP_SIZE_OVERRIDE - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      An escape mechanism to modify the way in which the number of electable + nodes, and consequently the quorum requirements for elections and commit + acknowledgments, is calculated.
      +
      +
      ELECTIONS_PRIMARY_RETRIES - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The number of times an unsuccessful election will be retried by a + designated Primary in a two node group before it is + activated and becomes the Master.
      +
      +
      ELECTIONS_REBROADCAST_PERIOD - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The time interval between rebroadcasts of election results by the master + node to all nodes not currently connected to it.
      +
      +
      end(Xid, int) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      endBackup() - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      End backup mode, thereby re-enabling normal deletion of log files by the + JE log cleaner.
      +
      +
      enhance(String, byte[]) - Method in class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Enhances the given class bytes if the class is annotated with Entity or Persistent.
      +
      +
      ensureConsistency(EnvironmentImpl) - Method in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
       
      +
      entities() - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing all entities in this index.
      +
      +
      entities(Transaction, CursorConfig) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing all entities in this index.
      +
      +
      entities(K, boolean, K, boolean) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing entities in a key range.
      +
      +
      entities(Transaction, K, boolean, K, boolean, CursorConfig) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing entities in a key range.
      +
      +
      entities() - Method in class com.sleepycat.persist.EntityJoin
      +
      +
      Opens a cursor that returns the entities qualifying for the join.
      +
      +
      entities(Transaction, CursorConfig) - Method in class com.sleepycat.persist.EntityJoin
      +
      +
      Opens a cursor that returns the entities qualifying for the join.
      +
      +
      Entity - Annotation Type in com.sleepycat.persist.model
      +
      +
      Indicates a persistent entity class.
      +
      +
      EntityBinding<E> - Interface in com.sleepycat.bind
      +
      +
      A binding between a key-value entry pair and an entity object.
      +
      +
      EntityConverter - Class in com.sleepycat.persist.evolve
      +
      +
      A subclass of Converter that allows specifying keys to be deleted.
      +
      +
      EntityConverter(String, int, Conversion, Set<String>) - Constructor for class com.sleepycat.persist.evolve.EntityConverter
      +
      +
      Creates a mutation for converting all instances of the given entity + class version to the current version of the class.
      +
      +
      EntityCursor<V> - Interface in com.sleepycat.persist
      +
      +
      Traverses entity values or key values and allows deleting or updating the + entity at the current cursor position.
      +
      +
      EntityIndex<K,V> - Interface in com.sleepycat.persist
      +
      +
      The interface for accessing keys and entities via a primary or secondary + index.
      +
      +
      EntityJoin<PK,E> - Class in com.sleepycat.persist
      +
      +
      Performs an equality join on two or more secondary keys.
      +
      +
      EntityJoin(PrimaryIndex<PK, E>) - Constructor for class com.sleepycat.persist.EntityJoin
      +
      +
      Creates a join object for a given primary index.
      +
      +
      EntityMetadata - Class in com.sleepycat.persist.model
      +
      +
      The metadata for a persistent entity class.
      +
      +
      EntityMetadata(String, PrimaryKeyMetadata, Map<String, SecondaryKeyMetadata>) - Constructor for class com.sleepycat.persist.model.EntityMetadata
      +
      +
      Used by an EntityModel to construct entity metadata.
      +
      +
      EntityModel - Class in com.sleepycat.persist.model
      +
      +
      The base class for classes that provide entity model metadata.
      +
      +
      EntityModel() - Constructor for class com.sleepycat.persist.model.EntityModel
      +
      +
      The default constructor for use by subclasses.
      +
      +
      EntityResult<V> - Class in com.sleepycat.persist
      +
      +
      Used to return an entity value from a 'get' operation along with an + OperationResult.
      +
      +
      EntityStore - Class in com.sleepycat.persist
      +
      +
      A store for managing persistent entity objects.
      +
      +
      EntityStore(Environment, String, StoreConfig) - Constructor for class com.sleepycat.persist.EntityStore
      +
      +
      Opens an entity store in a given environment.
      +
      +
      EntryBinding<E> - Interface in com.sleepycat.bind
      +
      +
      A binding between a key or data entry and a key or data object.
      +
      +
      entrySet() - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns a set view of the mappings contained in this map.
      +
      +
      entryToBigDecimal(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.BigDecimalBinding
      +
      +
      Converts an entry buffer into a BigDecimal value.
      +
      +
      entryToBigDecimal(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedBigDecimalBinding
      +
      +
      Converts an entry buffer into a BigDecimal value.
      +
      +
      entryToBigInteger(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.BigIntegerBinding
      +
      +
      Converts an entry buffer into a BigInteger value.
      +
      +
      entryToBoolean(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.BooleanBinding
      +
      +
      Converts an entry buffer into a simple boolean value.
      +
      +
      entryToByte(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.ByteBinding
      +
      +
      Converts an entry buffer into a simple byte value.
      +
      +
      entryToChar(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.CharacterBinding
      +
      +
      Converts an entry buffer into a simple char value.
      +
      +
      entryToDouble(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.DoubleBinding
      +
      +
      Converts an entry buffer into a simple double value.
      +
      +
      entryToDouble(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedDoubleBinding
      +
      +
      Converts an entry buffer into a simple double value.
      +
      +
      entryToFloat(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.FloatBinding
      +
      +
      Converts an entry buffer into a simple float value.
      +
      +
      entryToFloat(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedFloatBinding
      +
      +
      Converts an entry buffer into a simple float value.
      +
      +
      entryToInput(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Utility method to create a new tuple input object for reading the data + from a given buffer.
      +
      +
      entryToInt(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.IntegerBinding
      +
      +
      Converts an entry buffer into a simple int value.
      +
      +
      entryToInt(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.PackedIntegerBinding
      +
      +
      Converts an entry buffer into a simple int value.
      +
      +
      entryToInt(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedPackedIntegerBinding
      +
      +
      Converts an entry buffer into a simple int value.
      +
      +
      entryToLong(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.LongBinding
      +
      +
      Converts an entry buffer into a simple long value.
      +
      +
      entryToLong(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.PackedLongBinding
      +
      +
      Converts an entry buffer into a simple Long value.
      +
      +
      entryToLong(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedPackedLongBinding
      +
      +
      Converts an entry buffer into a simple Long value.
      +
      +
      entryToObject(DatabaseEntry) - Method in class com.sleepycat.bind.ByteArrayBinding
      +
       
      +
      entryToObject(DatabaseEntry, DatabaseEntry) - Method in interface com.sleepycat.bind.EntityBinding
      +
      +
      Converts key and data entry buffers into an entity Object.
      +
      +
      entryToObject(DatabaseEntry) - Method in interface com.sleepycat.bind.EntryBinding
      +
      +
      Converts a entry buffer into an Object.
      +
      +
      entryToObject(DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialBinding
      +
      +
      Deserialize an object from an entry buffer.
      +
      +
      entryToObject(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialSerialBinding
      +
       
      +
      entryToObject(K, D) - Method in class com.sleepycat.bind.serial.SerialSerialBinding
      +
      +
      Constructs an entity object from deserialized key and data objects.
      +
      +
      entryToObject(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.bind.serial.TupleSerialBinding
      +
       
      +
      entryToObject(TupleInput, D) - Method in class com.sleepycat.bind.serial.TupleSerialBinding
      +
      +
      Constructs an entity object from TupleInput key entry and + deserialized data entry objects.
      +
      +
      entryToObject(TupleInput, E) - Method in class com.sleepycat.bind.serial.TupleSerialMarshalledBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.BigDecimalBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.BigIntegerBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.BooleanBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.ByteBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.CharacterBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.DoubleBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.FloatBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.IntegerBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.LongBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.PackedIntegerBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.PackedLongBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.ShortBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.SortedBigDecimalBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.SortedDoubleBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.SortedFloatBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.SortedPackedIntegerBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.SortedPackedLongBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.StringBinding
      +
       
      +
      entryToObject(DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.TupleBinding
      +
      +
      Constructs a key or data object from a TupleInput entry.
      +
      +
      entryToObject(DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleInputBinding
      +
       
      +
      entryToObject(TupleInput) - Method in class com.sleepycat.bind.tuple.TupleMarshalledBinding
      +
       
      +
      entryToObject(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleTupleBinding
      +
       
      +
      entryToObject(TupleInput, TupleInput) - Method in class com.sleepycat.bind.tuple.TupleTupleBinding
      +
      +
      Constructs an entity object from TupleInput key and data + entries.
      +
      +
      entryToObject(TupleInput, TupleInput) - Method in class com.sleepycat.bind.tuple.TupleTupleMarshalledBinding
      +
       
      +
      entryToShort(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.ShortBinding
      +
      +
      Converts an entry buffer into a simple short value.
      +
      +
      entryToString(DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.StringBinding
      +
      +
      Converts an entry buffer into a simple String value.
      +
      +
      env - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      env - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      env - Variable in class com.sleepycat.je.util.DbLoad
      +
       
      +
      ENV_BACKGROUND_READ_LIMIT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum number of read operations performed by JE background + activities (e.g., cleaning) before sleeping to ensure that application + threads can perform I/O.
      +
      +
      ENV_BACKGROUND_SLEEP_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The duration that JE background activities will sleep when the EnvironmentConfig.ENV_BACKGROUND_WRITE_LIMIT or EnvironmentConfig.ENV_BACKGROUND_READ_LIMIT is + reached.
      +
      +
      ENV_BACKGROUND_WRITE_LIMIT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum number of write operations performed by JE background + activities (e.g., checkpointing and eviction) before sleeping to ensure + that application threads can perform I/O.
      +
      +
      ENV_CHECK_LEAKS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Debugging support: check leaked locks and txns at env close.
      +
      +
      ENV_CONSISTENCY_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The amount of time to wait for a Replica to become consistent with the + Master, when a ReplicatedEnvironment handle is created and + no ConsistencyPolicy is specified.
      +
      +
      ENV_DB_EVICTION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, enable eviction of metadata for closed databases.
      +
      +
      ENV_DUP_CONVERT_PRELOAD_ALL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true (the default) preload all duplicates databases at once when + upgrading from JE 4.1 and earlier.
      +
      +
      ENV_EXPIRATION_ENABLED - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true (the default), expired data is filtered from queries and purged + by the cleaner.
      +
      +
      ENV_FAIR_LATCHES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, use latches instead of synchronized blocks to implement the + lock table and log write mutexes.
      +
      +
      ENV_FORCED_YIELD - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Debugging support: call Thread.yield() at strategic points.
      +
      +
      ENV_IS_LOCKING - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the database environment for no locking.
      +
      +
      ENV_IS_TRANSACTIONAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the use of transactions.
      +
      +
      ENV_LATCH_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The timeout for detecting internal latch timeouts, so that deadlocks can + be detected.
      +
      +
      ENV_READ_ONLY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the database environment to be read-only, and any attempt to + modify a database will fail.
      +
      +
      ENV_RECOVERY_FORCE_CHECKPOINT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, a checkpoint is forced following recovery, even if the + log ends with a checkpoint.
      +
      +
      ENV_RECOVERY_FORCE_NEW_FILE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Used after performing a restore from backup to force creation of a new + log file prior to recovery.
      +
      +
      ENV_RUN_CHECKPOINTER - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, starts up the checkpointer thread.
      +
      +
      ENV_RUN_CLEANER - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, starts up the cleaner thread.
      +
      +
      ENV_RUN_EVICTOR - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, eviction is done by a pool of evictor threads, as well as being + done inline by application threads.
      +
      +
      ENV_RUN_IN_COMPRESSOR - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, starts up the INCompressor thread.
      +
      +
      ENV_RUN_OFFHEAP_EVICTOR - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, off-heap eviction is done by a pool of evictor threads, as well + as being done inline by application threads.
      +
      +
      ENV_RUN_VERIFIER - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Whether to run the background verifier.
      +
      +
      ENV_SETUP_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The maximum amount of time for the internal housekeeping, like + elections, syncup with the master, etc.
      +
      +
      ENV_TTL_CLOCK_TOLERANCE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The interval added to the system clock time for determining that a + record may have expired.
      +
      +
      ENV_UNKNOWN_STATE_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Permits opening of a ReplicatedEnvironment handle in the + ReplicatedEnvironment.State.UNKNOWN state, if a Master cannot be + determined within this timeout period.
      +
      +
      envHome - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      Environment - Class in com.sleepycat.je
      +
      +
      A database environment.
      +
      +
      Environment(File, EnvironmentConfig) - Constructor for class com.sleepycat.je.Environment
      +
      +
      Creates a database environment handle.
      +
      +
      EnvironmentConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of an environment.
      +
      +
      EnvironmentConfig() - Constructor for class com.sleepycat.je.EnvironmentConfig
      +
      +
      Creates an EnvironmentConfig initialized with the system default + settings.
      +
      +
      EnvironmentConfig(Properties) - Constructor for class com.sleepycat.je.EnvironmentConfig
      +
      +
      Creates an EnvironmentConfig which includes the properties specified in + the properties parameter.
      +
      +
      EnvironmentFailureException - Exception in com.sleepycat.je
      +
      +
      Indicates that a failure has occurred that could impact the Environment as a whole.
      +
      +
      EnvironmentLockedException - Exception in com.sleepycat.je
      +
      +
      Thrown by the Environment constructor when an environment cannot be + opened for write access because another process has the same environment + open for write access.
      +
      +
      EnvironmentMutableConfig - Class in com.sleepycat.je
      +
      +
      Specifies the environment attributes that may be changed after the + environment has been opened.
      +
      +
      EnvironmentMutableConfig() - Constructor for class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      EnvironmentNotFoundException - Exception in com.sleepycat.je
      +
      +
      Thrown by the Environment constructor when EnvironmentConfig + AllowCreate property is false (environment creation is not permitted), but + there are no log files in the environment directory.
      +
      +
      EnvironmentStats - Class in com.sleepycat.je
      +
      +
      Statistics for a single environment.
      +
      +
      EnvironmentWedgedException - Exception in com.sleepycat.je
      +
      +
      Thrown by the Environment.close() when the current process must be + shut down and restarted before re-opening the Environment.
      +
      +
      equals(Object) - Method in class com.sleepycat.collections.MapEntryParameter
      +
      +
      Compares this entry to a given entry as specified by Map.Entry.equals(java.lang.Object).
      +
      +
      equals(Object) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Compares the specified object with this collection for equality.
      +
      +
      equals(Object) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Compares the specified object with this map for equality.
      +
      +
      equals(Object) - Method in class com.sleepycat.je.CommitToken
      +
       
      +
      equals(Object) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Compares the data of two entries for byte-by-byte equality.
      +
      +
      equals(Object) - Method in class com.sleepycat.je.Durability
      +
       
      +
      equals(Object) - Method in class com.sleepycat.je.JEVersion
      +
       
      +
      equals(Object) - Method in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
       
      +
      equals(Object) - Method in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
       
      +
      equals(Object) - Method in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
       
      +
      equals(Object) - Method in interface com.sleepycat.persist.evolve.Conversion
      +
      +
      The standard equals method that must be implemented by + conversion class.
      +
      +
      equals(Object) - Method in class com.sleepycat.persist.evolve.Converter
      +
      +
      Returns true if the conversion objects are equal in this object and + given object, and if the Mutation.equals(java.lang.Object) superclass method + returns true.
      +
      +
      equals(Object) - Method in class com.sleepycat.persist.evolve.EntityConverter
      +
      +
      Returns true if the deleted and renamed keys are equal in this object + and given object, and if the Converter.equals(java.lang.Object) superclass method + returns true.
      +
      +
      equals(Object) - Method in class com.sleepycat.persist.evolve.Mutation
      +
      +
      Returns true if the class name, class version and field name are equal + in this object and given object.
      +
      +
      equals(Object) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns true if this collection has the same set of mutations as the + given collection and all mutations are equal.
      +
      +
      equals(Object) - Method in class com.sleepycat.persist.evolve.Renamer
      +
      +
      Returns true if the new class name is equal in this object and given + object, and if the Mutation.equals(java.lang.Object) method returns true.
      +
      +
      equals(Object) - Method in class com.sleepycat.persist.model.ClassMetadata
      +
       
      +
      equals(Object) - Method in class com.sleepycat.persist.model.EntityMetadata
      +
       
      +
      equals(Object) - Method in class com.sleepycat.persist.model.FieldMetadata
      +
       
      +
      equals(Object) - Method in class com.sleepycat.persist.model.PrimaryKeyMetadata
      +
       
      +
      equals(Object) - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
       
      +
      equals(Object) - Method in class com.sleepycat.persist.raw.RawObject
      +
       
      +
      evictMemory() - Method in class com.sleepycat.je.Environment
      +
      +
      Synchronously invokes the mechanism for keeping memory usage within the + cache size boundaries.
      +
      +
      EVICTOR_ALLOW_BIN_DELTAS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Allow Bottom Internal Nodes (BINs) to be written in a delta format + during eviction.
      +
      +
      EVICTOR_CORE_THREADS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The minimum number of threads in the eviction thread pool.
      +
      +
      EVICTOR_CRITICAL_PERCENTAGE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      At this percentage over the allotted cache, critical eviction will + start.
      +
      +
      EVICTOR_DEADLOCK_RETRY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      as of JE 4.1, since the single evictor thread has + been replaced be a more robust thread pool.
      +
      +
      +
      EVICTOR_EVICT_BYTES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      When eviction occurs, the evictor will push memory usage to this number + of bytes below EnvironmentConfig.MAX_MEMORY.
      +
      +
      EVICTOR_FORCED_YIELD - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Call Thread.yield() at each check for cache overflow.
      +
      +
      EVICTOR_KEEP_ALIVE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The duration that excess threads in the eviction thread pool will stay + idle; after this period, idle threads will terminate.
      +
      +
      EVICTOR_LRU_ONLY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      as of JE 6.0. This parameter is ignored by the new, + more efficient and more accurate evictor.
      +
      +
      +
      EVICTOR_MAX_THREADS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum number of threads in the eviction thread pool.
      +
      +
      EVICTOR_N_LRU_LISTS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of LRU lists in the main JE cache.
      +
      +
      EVICTOR_NODES_PER_SCAN - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      as of JE 6.0. This parameter is ignored by the new, more + efficient and more accurate evictor.
      +
      +
      +
      evolve(EvolveConfig) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Performs conversion of unevolved objects in order to reduce lazy + conversion overhead.
      +
      +
      EvolveConfig - Class in com.sleepycat.persist.evolve
      +
      +
      Configuration properties for eager conversion of unevolved objects.
      +
      +
      EvolveConfig() - Constructor for class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Creates an evolve configuration with default properties.
      +
      +
      EvolveConfigBeanInfo - Class in com.sleepycat.persist.evolve
      +
       
      +
      EvolveConfigBeanInfo() - Constructor for class com.sleepycat.persist.evolve.EvolveConfigBeanInfo
      +
       
      +
      EvolveEvent - Class in com.sleepycat.persist.evolve
      +
      +
      The event passed to the EvolveListener interface during eager entity + evolution.
      +
      +
      EvolveListener - Interface in com.sleepycat.persist.evolve
      +
      +
      The listener interface called during eager entity evolution.
      +
      +
      evolveProgress(EvolveEvent) - Method in interface com.sleepycat.persist.evolve.EvolveListener
      +
      +
      The listener method called during eager entity evolution.
      +
      +
      EvolveStats - Class in com.sleepycat.persist.evolve
      +
      +
      Statistics accumulated during eager entity evolution.
      +
      +
      EXCEEDED_TIME - Static variable in class com.sleepycat.je.PreloadStatus
      +
      +
      Database.preload + took more than maxMillisecs.
      +
      +
      ExceptionEvent - Class in com.sleepycat.je
      +
      +
      A class representing an exception event.
      +
      +
      ExceptionEvent(Exception, String) - Constructor for class com.sleepycat.je.ExceptionEvent
      +
       
      +
      ExceptionEvent(Exception) - Constructor for class com.sleepycat.je.ExceptionEvent
      +
       
      +
      ExceptionListener - Interface in com.sleepycat.je
      +
      +
      A callback to notify the application program when an exception occurs in a + JE Daemon thread.
      +
      +
      exceptionThrown(ExceptionEvent) - Method in interface com.sleepycat.je.ExceptionListener
      +
      +
      This method is called if an exception is seen in a JE Daemon thread.
      +
      +
      ExceptionUnwrapper - Class in com.sleepycat.util
      +
      +
      Unwraps nested exceptions by calling the ExceptionWrapper.getCause() method for exceptions that implement the + ExceptionWrapper interface.
      +
      +
      ExceptionUnwrapper() - Constructor for class com.sleepycat.util.ExceptionUnwrapper
      +
       
      +
      ExceptionWrapper - Interface in com.sleepycat.util
      +
      +
      Interface implemented by exceptions that can contain nested exceptions.
      +
      +
      execute(InsufficientLogException, NetworkRestoreConfig) - Method in class com.sleepycat.je.rep.NetworkRestore
      +
      +
      Restores the log files from one of the members of the replication group.
      +
      +
      execute(String[]) - Method in class com.sleepycat.je.util.DbFilterStats
      +
      +
      Performs the processing of the DbFilterStats command.
      +
      +
      execute() - Method in class com.sleepycat.persist.model.ClassEnhancerTask
      +
       
      +
      + + + +

      F

      +
      +
      FastInputStream - Class in com.sleepycat.util
      +
      +
      A replacement for ByteArrayInputStream that does not synchronize every + byte read.
      +
      +
      FastInputStream(byte[]) - Constructor for class com.sleepycat.util.FastInputStream
      +
      +
      Creates an input stream.
      +
      +
      FastInputStream(byte[], int, int) - Constructor for class com.sleepycat.util.FastInputStream
      +
      +
      Creates an input stream.
      +
      +
      FastOutputStream - Class in com.sleepycat.util
      +
      +
      A replacement for ByteArrayOutputStream that does not synchronize every + byte read.
      +
      +
      FastOutputStream() - Constructor for class com.sleepycat.util.FastOutputStream
      +
      +
      Creates an output stream with default sizes.
      +
      +
      FastOutputStream(int) - Constructor for class com.sleepycat.util.FastOutputStream
      +
      +
      Creates an output stream with a default bump size and a given initial + size.
      +
      +
      FastOutputStream(int, int) - Constructor for class com.sleepycat.util.FastOutputStream
      +
      +
      Creates an output stream with a given bump size and initial size.
      +
      +
      FastOutputStream(byte[]) - Constructor for class com.sleepycat.util.FastOutputStream
      +
      +
      Creates an output stream with a given initial buffer and a default + bump size.
      +
      +
      FastOutputStream(byte[], int) - Constructor for class com.sleepycat.util.FastOutputStream
      +
      +
      Creates an output stream with a given initial buffer and a given + bump size.
      +
      +
      FEEDER_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      A heartbeat is exchanged between the feeder and replica to ensure they + are alive.
      +
      +
      FieldMetadata - Class in com.sleepycat.persist.model
      +
      +
      The metadata for a key field.
      +
      +
      FieldMetadata(String, String, String) - Constructor for class com.sleepycat.persist.model.FieldMetadata
      +
      +
      Used by an EntityModel to construct field metadata.
      +
      +
      FILE_LOGGING_LEVEL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Trace messages equal and above this level will be logged to the je.info + file, which is in the Environment home directory.
      +
      +
      FileHandler - Class in com.sleepycat.je.util
      +
      +
      JE instances of java.util.logging.Logger are configured to use this + implementation of java.util.logging.FileHandler.
      +
      +
      FileHandler(String, int, int, Formatter, EnvironmentImpl) - Constructor for class com.sleepycat.je.util.FileHandler
      +
       
      +
      FILEHANDLER_LEVEL - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      FILLED_CACHE - Static variable in class com.sleepycat.je.PreloadStatus
      +
      +
      Database.preload + filled maxBytes of the cache.
      +
      +
      first() - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns the first (lowest) element currently in this sorted set.
      +
      +
      first() - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns the first (lowest) element currently in this sorted set.
      +
      +
      first() - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns the first (lowest) element currently in this sorted set.
      +
      +
      first() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the first value and returns it, or returns null if + the cursor range is empty.
      +
      +
      first(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the first value and returns it, or returns null if + the cursor range is empty.
      +
      +
      firstKey() - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns the first (lowest) key currently in this sorted map.
      +
      +
      FloatBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for an unsorted Float + primitive wrapper or an unsorted float primitive.
      +
      +
      FloatBinding() - Constructor for class com.sleepycat.bind.tuple.FloatBinding
      +
       
      +
      floatToEntry(float, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.FloatBinding
      +
      +
      Converts a simple float value into an entry buffer.
      +
      +
      floatToEntry(float, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedFloatBinding
      +
      +
      Converts a simple float value into an entry buffer.
      +
      +
      flushLog(boolean) - Method in class com.sleepycat.je.Environment
      +
      +
      Writes buffered data to the log, and optionally performs an fsync to + guarantee that data is written to the physical device.
      +
      +
      ForeignConstraintException - Exception in com.sleepycat.je
      +
      +
      Thrown when an attempt to write a primary database record would insert a + secondary record with a key that does not exist in a foreign key database, + when the secondary key is configured as a foreign key.
      +
      +
      ForeignKeyDeleteAction - Enum in com.sleepycat.je
      +
      +
      The action taken when a referenced record in the foreign key database is + deleted.
      +
      +
      ForeignKeyNullifier - Interface in com.sleepycat.je
      +
      +
      The interface implemented for setting single-valued foreign keys to null.
      +
      +
      ForeignMultiKeyNullifier - Interface in com.sleepycat.je
      +
      +
      The interface implemented for setting multi-valued foreign keys to null.
      +
      +
      forget(Xid) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      formatUsingPrintable - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      ForwardCursor - Interface in com.sleepycat.je
      +
      +
      The interface for forward-moving Cursor operations.
      +
      +
      ForwardCursor<V> - Interface in com.sleepycat.persist
      +
      +
      Cursor operations limited to traversing forward.
      +
      +
      FREE_DISK - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A lower limit on the number of bytes of free space to maintain on a + volume and per JE Environment.
      +
      +
      + + + +

      G

      +
      +
      get(Object) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns the value to which this map maps the specified key.
      +
      +
      get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to a record according to the specified Get + type.
      +
      +
      get(Transaction, DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.Database
      +
      +
      Retrieves a record according to the specified Get type.
      +
      +
      get(Transaction, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Database
      +
      +
      Retrieves the key/data pair with the given key.
      +
      +
      get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.DiskOrderedCursor
      +
       
      +
      get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in interface com.sleepycat.je.ForwardCursor
      +
      +
      Moves the cursor to a record according to the specified Get + type.
      +
      +
      Get - Enum in com.sleepycat.je
      +
      +
      The operation type passed to "get" methods on databases and cursors.
      +
      +
      get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.JoinCursor
      +
      +
      Returns the next primary key and data resulting from the join operation.
      +
      +
      get() - Method in class com.sleepycat.je.rep.util.AtomicLongMax
      +
      +
      Gets the current value.
      +
      +
      get(DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to a record according to the specified Get + type.
      +
      +
      get(DatabaseEntry, DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to a record according to the specified Get + type.
      +
      +
      get(Transaction, DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Moves the cursor to a record according to the specified Get + type.
      +
      +
      get(Transaction, DatabaseEntry, DatabaseEntry, DatabaseEntry, Get, ReadOptions) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Retrieves a record according to the specified Get type.
      +
      +
      get(Transaction, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryDatabase
      +
       
      +
      get(Transaction, DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Retrieves the key/data pair with the given key.
      +
      +
      get(Transaction, int) - Method in class com.sleepycat.je.Sequence
      +
      +
      Returns the next available element in the sequence and changes the + sequence value by delta.
      +
      +
      get(Get, ReadOptions) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor according to the specified Get type and returns + the value at the updated position.
      +
      +
      get(K) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Gets an entity via a key of this index.
      +
      +
      get(Transaction, K, LockMode) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Gets an entity via a key of this index.
      +
      +
      get(Transaction, K, Get, ReadOptions) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Gets an entity via a key of this index, using Get type and ReadOptions + parameters, and returning an EntityResult.
      +
      +
      get(PK) - Method in class com.sleepycat.persist.PrimaryIndex
      +
       
      +
      get(Transaction, PK, LockMode) - Method in class com.sleepycat.persist.PrimaryIndex
      +
       
      +
      get(Transaction, PK, Get, ReadOptions) - Method in class com.sleepycat.persist.PrimaryIndex
      +
       
      +
      get(SK) - Method in class com.sleepycat.persist.SecondaryIndex
      +
       
      +
      get(Transaction, SK, LockMode) - Method in class com.sleepycat.persist.SecondaryIndex
      +
       
      +
      get(Transaction, SK, Get, ReadOptions) - Method in class com.sleepycat.persist.SecondaryIndex
      +
       
      +
      getAcks() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The number of transactions that has been + acknowledged.
      +
      +
      getAckWaitMs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total time in milliseconds that the master spent waiting for the + Durability.ReplicaAckPolicy to be satisfied during successful transaction + commits.
      +
      +
      getActiveFeeders() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the number of current active Feeders running on this node.
      +
      +
      getActiveLogSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Bytes used by all active data files: files required for basic JE operation."
      +
      +
      getActiveTxns() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      Return the array of active transactions.
      +
      +
      getAdminBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes of JE main cache used for cleaner and checkpointer metadata, in bytes."
      +
      +
      getAggressive() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns true if the Environment.verify and Database.verify are configured to perform fine granularity consistency + checking that includes verifying in memory constructs.
      +
      +
      getAllowCreate() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the Environment.openDatabase method is configured to create the database + if it does not already exist.
      +
      +
      getAllowCreate() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns a flag that specifies if we may create this environment.
      +
      +
      getAllowCreate() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns true if the Database.openSequence method is configured to create the sequence if it + does not already exist.
      +
      +
      getAllowCreate() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns whether creation of a new store is allowed.
      +
      +
      getAllowNestedTransactions() - Method in class com.sleepycat.collections.TransactionRunner
      +
      +
      Returns whether nested transactions will be created if + run() is called when a transaction is already active for + the current thread.
      +
      +
      getAllowPopulate() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns whether automatic population of the secondary is allowed.
      +
      +
      getAllRawTypes() - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns all versions of all known types.
      +
      +
      getAllRawTypeVersions(String) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns all known versions of type information for a given class name, + or null if no persistent version of the class is known.
      +
      +
      getAppState() - Method in interface com.sleepycat.je.rep.AppStateMonitor
      +
      +
      Return a byte array which holds information about the application's + state.
      +
      +
      getAppState() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the application state which is obtained via + AppStateMonitor.getAppState().
      +
      +
      getArbiterHome() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Gets the Arbiter home directory.
      +
      +
      getArbiterMutableConfig() - Method in class com.sleepycat.je.rep.arbiter.Arbiter
      +
      +
      Returns the Arbiter mutable attributes.
      +
      +
      getArbiterNodes() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the subset of nodes in the group that participates in elections + but does not have a copy of the data and cannot become a master.
      +
      +
      getAttribute(String) - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      getAttribute(Environment, String) - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Get an attribute value for the given environment.
      +
      +
      getAttribute(String) - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      getAttributeList() - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      getAttributeList() - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      Get attribute metadata for this MBean.
      +
      +
      getAttributeList(Environment) - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Get MBean attribute metadata for this environment.
      +
      +
      getAttributeList() - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      getAttributes(String[]) - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      getAttributes(String[]) - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      getAutoCommitNoSync() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns true if the auto-commit operations on the sequence are configure + to not flush the transaction log..
      +
      +
      getAvailableLogSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Bytes available for write operations when unprotected reserved files are deleted: free space + reservedLogSize - protectedLogSize."
      +
      +
      getAvailableReplicas() - Method in exception com.sleepycat.je.rep.InsufficientReplicasException
      +
      +
      Returns the set of Replicas that were in contact with the master at the + time of the commit operation.
      +
      +
      getAvgBatchCacheMode() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getAvgBatchCritical() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getAvgBatchDaemon() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getAvgBatchEvictorThread() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getAvgBatchManual() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getBaseClass() - Method in class com.sleepycat.bind.serial.SerialBinding
      +
      +
      Returns the base class for this binding.
      +
      +
      getBatchDelay(TimeUnit) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the batch delay.
      +
      +
      getBatchSize() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the batchSize value.
      +
      +
      getBdescriptor(Class) - Static method in class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      getBeanDescriptor() - Method in class com.sleepycat.je.rep.monitor.MonitorConfigBeanInfo
      +
       
      +
      getBeanDescriptor() - Method in class com.sleepycat.persist.evolve.EvolveConfigBeanInfo
      +
       
      +
      getBeanDescriptor() - Method in class com.sleepycat.persist.StoreConfigBeanInfo
      +
       
      +
      getBeanDescriptor(Class) - Method in class com.sleepycat.util.ConfigBeanInfoBase
      +
      +
      Gets the bean's BeanDescriptors.
      +
      +
      getBigDecimalByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of an unsorted BigDecimal.
      +
      +
      getBigDecimalMaxByteLength(BigDecimal) - Static method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Returns the maximum byte length that would be output for a given BigDecimal value if TupleOutput.writeBigDecimal(java.math.BigDecimal) were called.
      +
      +
      getBigIntegerByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a BigInteger.
      +
      +
      getBigIntegerByteLength(BigInteger) - Static method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Returns the exact byte length that would would be output for a given + BigInteger value if TupleOutput.writeBigInteger(java.math.BigInteger) were + called.
      +
      +
      getBINEntriesHistogram() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns an array representing a histogram of the number of Bottom + Internal Nodes with various percentages of non-deleted entry counts.
      +
      +
      getBINsByLevel() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the count of Bottom Internal Nodes per level, indexed by level.
      +
      +
      getBINsOnly() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns true if the DiskOrderedCursor is configured to scan BINs only, + returning all record keys and only those record data that are embedded + in the BINs.
      +
      +
      getBottomInternalNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the number of Bottom Internal Nodes in the database tree.
      +
      +
      getBtreeComparator() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the Comparator used for key comparison on this database.
      +
      +
      getBtreeComparatorByClassName() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the btree comparator is set by class name, not by + serializable Comparator object
      +
      +
      getBufferBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The total memory currently consumed by log buffers, in bytes.
      +
      +
      getBufferBytes() - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Returns the underlying data being read.
      +
      +
      getBufferBytes() - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Returns the buffer owned by this object.
      +
      +
      getBufferLength() - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Returns the end of the buffer being read.
      +
      +
      getBufferLength() - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Returns the length used in the internal buffer, i.e., the offset at + which data will be written next.
      +
      +
      getBufferOffset() - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Returns the offset at which data is being read from the buffer.
      +
      +
      getBufferOffset() - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Returns the offset of the internal buffer.
      +
      +
      getByteLength(char[]) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Returns the byte length of the UTF string that would be created by + converting the given characters to UTF.
      +
      +
      getByteLength(char[], int, int) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Returns the byte length of the UTF string that would be created by + converting the given characters to UTF.
      +
      +
      getCacheDataBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      Please use EnvironmentStats.getDataBytes() to get the amount of cache + used for data and use EnvironmentStats.getAdminBytes(), EnvironmentStats.getLockBytes() and + EnvironmentStats.getBufferBytes() to get other components of the total cache usage + (EnvironmentStats.getCacheTotalBytes()).
      +
      +
      +
      getCacheMode() - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns the default CacheMode used for subsequent operations + performed using this cursor.
      +
      +
      getCacheMode() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the default CacheMode used for operations performed on + this database, or null if the environment default is used.
      +
      +
      getCacheMode() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Returns the default CacheMode used for operations performed in + this environment, or null if CacheMode.DEFAULT is used.
      +
      +
      getCacheMode() - Method in class com.sleepycat.je.ReadOptions
      +
      +
      Returns the CacheMode to be used for the operation, or null + if the Cursor, Database or Environment default will be used.
      +
      +
      getCacheMode() - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Returns the CacheMode to be used for the operation, or null + if the Cursor, Database or Environment default will be used.
      +
      +
      getCacheMode() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns the default CacheMode used for subsequent operations + performed using this cursor.
      +
      +
      getCachePercent() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for getting EnvironmentConfig.MAX_MEMORY_PERCENT.
      +
      +
      getCacheSize() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Returns the memory available to the database system, in bytes.
      +
      +
      getCacheSize() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns the number of elements cached by a sequence handle..
      +
      +
      getCacheSize() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the number of values that will be cached in this handle.
      +
      +
      getCacheTotalBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Total amount of JE main cache in use, in bytes."
      +
      +
      getCatalog() - Method in class com.sleepycat.collections.TupleSerialFactory
      +
      +
      Returns the class catalog associated with this factory.
      +
      +
      getCause() - Method in interface com.sleepycat.util.ExceptionWrapper
      +
      +
      Returns the nested exception or null if none is present.
      +
      +
      getCause() - Method in exception com.sleepycat.util.IOExceptionWrapper
      +
       
      +
      getChangeType() - Method in class com.sleepycat.je.rep.monitor.GroupChangeEvent
      +
      +
      Returns the type of the change (the addition of a new member or the + removal of an existing member) made to the group.
      +
      +
      getCharLength(byte[]) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Returns the number of characters represented by the given UTF string.
      +
      +
      getCharLength(byte[], int, int) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Returns the number of characters represented by the given UTF string.
      +
      +
      getClassesToEvolve() - Method in class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Returns an unmodifiable set of the entity classes to be evolved.
      +
      +
      getClassFormat(byte[]) - Method in interface com.sleepycat.bind.serial.ClassCatalog
      +
      +
      Return the ObjectStreamClass for the given class ID.
      +
      +
      getClassFormat(byte[]) - Method in class com.sleepycat.bind.serial.StoredClassCatalog
      +
       
      +
      getClassID(ObjectStreamClass) - Method in interface com.sleepycat.bind.serial.ClassCatalog
      +
      +
      Return the class ID for the current version of the given class + description.
      +
      +
      getClassID(ObjectStreamClass) - Method in class com.sleepycat.bind.serial.StoredClassCatalog
      +
       
      +
      getClassLoader() - Method in interface com.sleepycat.bind.serial.ClassCatalog
      +
      +
      Returns the ClassLoader to be used by bindings that use this catalog, or + null if a default class loader should be used.
      +
      +
      getClassLoader() - Method in class com.sleepycat.bind.serial.SerialBinding
      +
      +
      Returns the class loader to be used during deserialization, or null if a + default class loader should be used.
      +
      +
      getClassLoader() - Method in class com.sleepycat.bind.serial.StoredClassCatalog
      +
      +
      For BDB JE, returns the ClassLoader property of the catalog database + environment.
      +
      +
      getClassLoader() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns the ClassLoader for loading user-supplied classes by name, or + null if no specified ClassLoader is configured.
      +
      +
      getClassMetadata(String) - Method in class com.sleepycat.persist.model.AnnotationModel
      +
       
      +
      getClassMetadata(String) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns the metadata for a given persistent class name, including proxy + classes and entity classes.
      +
      +
      getClassMetadata() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the original model class metadata used to create this class, or + null if this is not a model class.
      +
      +
      getClassName() - Method in class com.sleepycat.persist.evolve.Mutation
      +
      +
      Returns the class to which this mutation applies.
      +
      +
      getClassName() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns the name of the persistent class.
      +
      +
      getClassName() - Method in class com.sleepycat.persist.model.EntityMetadata
      +
      +
      Returns the name of the entity class.
      +
      +
      getClassName() - Method in class com.sleepycat.persist.model.FieldMetadata
      +
      +
      Returns the class name of the field type.
      +
      +
      getClassName() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the class name for this type in the format specified by Class.getName().
      +
      +
      getClassVersion() - Method in class com.sleepycat.persist.evolve.Mutation
      +
      +
      Returns the class version to which this mutation applies.
      +
      +
      getCleanerBacklog() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      in 7.0, always returns zero. Use EnvironmentStats.getCurrentMinUtilization() and EnvironmentStats.getCurrentMaxUtilization() to + monitor cleaner behavior.
      +
      +
      +
      getClear() - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Returns true if the statistics operation is configured to reset + statistics after they are returned.
      +
      +
      getCollection() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns the collection associated with this iterator.
      +
      +
      getCommitPolicy() - Method in exception com.sleepycat.je.rep.InsufficientReplicasException
      +
      +
      Returns the Replica ack policy that was in effect for the transaction.
      +
      +
      getCommitToken() - Method in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
      +
      Return the CommitToken used to create this consistency + policy.
      +
      +
      getCommitToken() - Method in class com.sleepycat.je.Transaction
      +
      +
      This method is intended for use with a replicated environment.
      +
      +
      getComponentType() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the array component type, or null if this is not an array type.
      +
      +
      getCompositeKeyFields() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns an unmodifiable list of metadata for the fields making up a + composite key, or null if this is a not a composite key class.
      +
      +
      getConfig() - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns this cursor's configuration.
      +
      +
      getConfig() - Method in class com.sleepycat.je.Database
      +
      +
      Returns this Database object's configuration.
      +
      +
      getConfig() - Method in class com.sleepycat.je.DiskOrderedCursor
      +
      +
      Returns this cursor's configuration.
      +
      +
      getConfig() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns this object's configuration.
      +
      +
      getConfig() - Method in class com.sleepycat.je.JoinCursor
      +
      +
      Returns this object's configuration.
      +
      +
      getConfig() - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Returns a copy of the secondary configuration of this database.
      +
      +
      getConfig() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns a copy of the entity store configuration.
      +
      +
      getConfig() - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Returns a copy of the entity store configuration.
      +
      +
      getConfigParam(String) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Returns the value for this configuration parameter.
      +
      +
      getConfigParam(String) - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Return the value for this parameter.
      +
      +
      getConnection(String, EnvironmentConfig) - Method in interface com.sleepycat.je.jca.ra.JEConnectionFactory
      +
       
      +
      getConnection(String, EnvironmentConfig, TransactionConfig) - Method in interface com.sleepycat.je.jca.ra.JEConnectionFactory
      +
       
      +
      getConsistencyPolicy() - Method in exception com.sleepycat.je.rep.ReplicaConsistencyException
      +
      +
      Returns the Replica consistency policy that could not be satisfied.
      +
      +
      getConsistencyPolicy() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the default consistency policy associated with the + configuration.
      +
      +
      getConsistencyPolicy() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns the consistency policy associated with the configuration.
      +
      +
      getConsoleLoggingLevel() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Gets the console logging level.
      +
      +
      getConstructors() - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      Get constructor metadata for this MBean.
      +
      +
      getConversion() - Method in class com.sleepycat.persist.evolve.Converter
      +
      +
      Returns the converter instance specified to the constructor.
      +
      +
      getConverter(String, int, String) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns the converter mutation for the given class, version and field, + or null if none exists.
      +
      +
      getConverters() - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns an unmodifiable collection of all converter mutations.
      +
      +
      getCorrectedAvgLNSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      in JE 5.0.56, use EnvironmentStats.getCorrectedAvgLNSize() instead.
      +
      +
      +
      getCurrent(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns the key/data pair to which the cursor refers.
      +
      +
      getCurrent(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.DiskOrderedCursor
      +
       
      +
      getCurrent(DatabaseEntry, DatabaseEntry, LockMode) - Method in interface com.sleepycat.je.ForwardCursor
      +
      +
      Returns the key/data pair to which the cursor refers.
      +
      +
      getCurrent(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.JoinCursor
      +
      +
      This operation is not allowed on a join cursor.
      +
      +
      getCurrent(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Returns the key/data pair to which the cursor refers.
      +
      +
      getCurrent(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Returns the key/data pair to which the cursor refers.
      +
      +
      getCurrent() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the current value of the sequence in the database.
      +
      +
      getCurrentMaxUtilization() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "The current maximum (upper bound) log utilization as a percentage."
      +
      +
      getCurrentMinUtilization() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "The current minimum (lower bound) log utilization as a percentage."
      +
      +
      getCurrentTxnEndVLSN() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the latest transaction end VLSN on this replication node.
      +
      +
      getCursorConfig() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns the cursor configuration that is used for all operations + performed via this container.
      +
      +
      getCursorsBins() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of BINs encountered by the INCompressor that had cursors + referring to them when the compressor ran.
      +
      +
      getCustomStats() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Gets the custom statstics object.
      +
      +
      getData() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns the byte array.
      +
      +
      getDataAdminBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Amount of JE main cache used for holding per-database cleaner utilization metadata, in bytes."
      +
      +
      getDatabase() - Method in class com.sleepycat.je.Cursor
      +
      +
      Returns the Database handle associated with this Cursor.
      +
      +
      getDatabase() - Method in class com.sleepycat.je.DiskOrderedCursor
      +
      +
      Returns the Database handle for the database that contains the + latest record returned by getNext().
      +
      +
      getDatabase() - Method in interface com.sleepycat.je.ForwardCursor
      +
      +
      Returns the Database handle associated with this ForwardCursor.
      +
      +
      getDatabase() - Method in class com.sleepycat.je.JoinCursor
      +
      +
      Returns the primary database handle associated with this cursor.
      +
      +
      getDatabase() - Method in exception com.sleepycat.je.rep.DatabasePreemptedException
      +
      +
      Returns the database handle that was forcibly closed.
      +
      +
      getDatabase() - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Returns the Database handle associated with this Cursor.
      +
      +
      getDatabase() - Method in class com.sleepycat.je.Sequence
      +
      +
      Returns the Database handle associated with this sequence.
      +
      +
      getDatabase() - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Returns the underlying database for this index.
      +
      +
      getDatabase() - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns the underlying secondary database for this index.
      +
      +
      getDatabaseName() - Method in class com.sleepycat.je.Database
      +
      +
      Returns the database name.
      +
      +
      getDatabaseName() - Method in exception com.sleepycat.je.rep.DatabasePreemptedException
      +
      +
      Returns the name of the database that was forcibly closed.
      +
      +
      getDatabaseNames() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns a List of database names for the database environment.
      +
      +
      getDataBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Amount of JE main cache used for holding data, keys and internal Btree nodes, in bytes."
      +
      +
      getDataNodes() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the subset of nodes in the group that store replication data.
      +
      +
      getDbClosedBins() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of BINs encountered by the INCompressor that had their + database closed between the time they were put on the compressor queue + and when the compressor ran.
      +
      +
      getDBINsByLevel() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Deprecated. +
      as of 5.0, returns an empty array.
      +
      +
      +
      getDeclaringClassName() - Method in class com.sleepycat.persist.model.FieldMetadata
      +
      +
      Returns the name of the class where the field is declared.
      +
      +
      getDecrement() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns true if the sequence is configured to decrement.
      +
      +
      getDefaultEventIndex() - Method in class com.sleepycat.util.ConfigBeanInfoBase
      +
      +
      A bean may have a "default" event that is the event that will + mostly commonly be used by human's when using the bean.
      +
      +
      getDefaultPropertyIndex() - Method in class com.sleepycat.util.ConfigBeanInfoBase
      +
      +
      A bean may have a "default" property that is the property that will + mostly commonly be initially chosen for update by human's who are + customizing the bean.
      +
      +
      getDeferredWrite() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the deferred-write option.
      +
      +
      getDeferredWrite() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the deferred-write configuration property.
      +
      +
      getDeleteAction() - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
      +
      Returns the action to take when a related entity is deleted having a + primary key value that exists as a secondary key value for this entity.
      +
      +
      getDeletedKeys() - Method in class com.sleepycat.persist.evolve.EntityConverter
      +
      +
      Returns the set of key names that are to be deleted.
      +
      +
      getDeletedLeafNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the number of deleted data records in the database tree that + are pending removal by the compressor.
      +
      +
      getDeleter(String, int, String) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns the deleter mutation for the given class, version and field, or + null if none exists.
      +
      +
      getDeleters() - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns an unmodifiable collection of all deleter mutations.
      +
      +
      getDesignatedPrimary() - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Determines whether this node is the currently designated Primary.
      +
      +
      getDetail() - Method in interface com.sleepycat.util.ExceptionWrapper
      +
      +
      Deprecated. + +
      +
      +
      getDetail() - Method in exception com.sleepycat.util.IOExceptionWrapper
      +
      +
      Deprecated. + +
      +
      +
      getDetail() - Method in exception com.sleepycat.util.RuntimeExceptionWrapper
      +
      +
      Deprecated. +
      replaced by Throwable.getCause().
      +
      +
      +
      getDimensions() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the number of array dimensions, or zero if this is not an array + type.
      +
      +
      getDINsByLevel() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Deprecated. +
      as of 5.0, returns an empty array.
      +
      +
      +
      getDirtyLRUSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of INs in the dirty/priority-2 LRU "
      +
      +
      getDOSBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Amount of JE main cache consumed by disk-ordered cursor and Database.count operations, in bytes."
      +
      +
      getDTVLSN() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The highest commit DTVLSN that has been + acknowledged.
      +
      +
      getDupCountLeafNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Deprecated. +
      as of 5.0, returns zero.
      +
      +
      +
      getDuplicateBottomInternalNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Deprecated. +
      as of 5.0, returns zero.
      +
      +
      +
      getDuplicateComparator() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the Comparator used for duplicate record comparison on this + database.
      +
      +
      getDuplicateComparatorByClassName() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the duplicate comparator is set by class name, not by + serializable Comparator object.
      +
      +
      getDuplicateInternalNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Deprecated. +
      as of 5.0, returns zero.
      +
      +
      +
      getDuplicateTreeMaxDepth() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Deprecated. +
      as of 5.0, returns zero.
      +
      +
      +
      getDurability() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Convenience method for setting EnvironmentConfig.TXN_DURABILITY.
      +
      +
      getDurability() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns the durability associated with the configuration.
      +
      +
      getEarliestTransactionCommitTime() - Method in exception com.sleepycat.je.rep.RollbackException
      +
      +
      Return the time in milliseconds of the earliest transaction commit that + has been rolled back.
      +
      +
      getEarliestTransactionCommitTime() - Method in exception com.sleepycat.je.rep.RollbackProhibitedException
      +
      +
      Return the time in milliseconds of the earliest transaction commit that + will be rolled back if the log is truncated to the location specified by + RollbackProhibitedException.getTruncationFileNumber() and RollbackProhibitedException.getTruncationFileOffset()
      +
      +
      getEarliestTransactionId() - Method in exception com.sleepycat.je.rep.RollbackException
      +
      +
      Return the id of the earliest transaction commit that has been + rolled back.
      +
      +
      getEarliestTransactionId() - Method in exception com.sleepycat.je.rep.RollbackProhibitedException
      +
      +
      Return the id of the earliest transaction commit that will be + rolled back if the log is truncated to the location specified by + RollbackProhibitedException.getTruncationFileNumber() and RollbackProhibitedException.getTruncationFileOffset()
      +
      +
      getElectableGroupSizeOverride() - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Returns the value associated with the override.
      +
      +
      getElectableNodes() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the subset of nodes in the group with replicated environments + that participate in elections and can become masters, ignoring node + priority.
      +
      +
      getElementClassName() - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
      +
      Returns the class name of the array or collection element for a ONE_TO_MANY or MANY_TO_MANY relationship, or null for a + Relationship#ONE_TO_ONE ONE_TO_ONE} or MANY_TO_ONE relationship.
      +
      +
      getElements() - Method in class com.sleepycat.persist.raw.RawObject
      +
      +
      Returns the array of elements for an array type, or null for a complex + type or an enum type.
      +
      +
      getEndOfLog() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The location of the next entry to be written to the log.
      +
      +
      getEntityBinding(Class<V>) - Method in class com.sleepycat.collections.TupleSerialFactory
      +
       
      +
      getEntityBinding() - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Returns the entity binding for this index.
      +
      +
      getEntityClass() - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Returns the entity class for this index.
      +
      +
      getEntityClassName() - Method in class com.sleepycat.persist.evolve.EvolveEvent
      +
      +
      The class name of the current entity class being converted.
      +
      +
      getEntityMetadata(String) - Method in class com.sleepycat.persist.model.AnnotationModel
      +
       
      +
      getEntityMetadata(String) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns the metadata for a given entity class name.
      +
      +
      getEntityMetadata() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the original model entity metadata used to create this class, or + null if this is not an entity class.
      +
      +
      getEnum() - Method in class com.sleepycat.persist.raw.RawObject
      +
      +
      Returns the enum constant String for an enum type, or null for a complex + type or an array type.
      +
      +
      getEnumConstants() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns an unmodifiable list of the names of the enum instances, or null + if this is not an enum type.
      +
      +
      getEnvironment() - Method in class com.sleepycat.collections.CurrentTransaction
      +
      +
      Returns the underlying Berkeley DB environment.
      +
      +
      getEnvironment() - Method in class com.sleepycat.je.Database
      +
      +
      Returns the Environment handle for + the database environment underlying the Database.
      +
      +
      getEnvironment() - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      getEnvironment() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the environment associated with this store.
      +
      +
      getEnvironment() - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Returns the environment associated with this store.
      +
      +
      getEnvironmentCreationTime() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The time the Environment was created.
      +
      +
      getEnvironmentHome() - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Return the target environment directory.
      +
      +
      getEnvironmentOpenConfig() - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      If the helper was instantiated with canConfigure==true, it shows + environment configuration attributes.
      +
      +
      getEstimatedAvgLNSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      in JE 5.0.56, use EnvironmentStats.getCorrectedAvgLNSize() instead.
      +
      +
      +
      getEvent() - Method in exception com.sleepycat.je.rep.StateChangeException
      +
      +
      Returns the event that resulted in this exception.
      +
      +
      getEventSetDescriptors() - Method in class com.sleepycat.util.ConfigBeanInfoBase
      +
      +
      Gets the bean's EventSetDescriptors.
      +
      +
      getEventTime() - Method in class com.sleepycat.je.rep.StateChangeEvent
      +
      +
      Returns the time (in nano second units) the event occurred, as reported + by System.nanoTime()
      +
      +
      getEvolveListener() - Method in class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Returns the progress listener that is notified each time an entity is + read.
      +
      +
      getException() - Method in class com.sleepycat.je.ExceptionEvent
      +
      +
      Returns the exception in the event.
      +
      +
      getExceptionListener() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Returns the exception listener, if set.
      +
      +
      getExclusiveCreate() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the Environment.openDatabase method is configured to fail if the database + already exists.
      +
      +
      getExclusiveCreate() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns true if the Database.openSequence method is configured to fail if the database + already exists.
      +
      +
      getExclusiveCreate() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns whether opening an existing store is prohibited.
      +
      +
      getExpirationTime() - Method in class com.sleepycat.je.OperationResult
      +
      +
      Returns the expiration time of the record, in milliseconds, or zero + if the record has no TTL and does not expire.
      +
      +
      getExpirationTime() - Method in exception com.sleepycat.je.SecondaryReferenceException
      +
      +
      Returns the expiration time of the record being accessed during the + failure.
      +
      +
      getFast() - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Returns true if the statistics operation is configured to return only + the values which do not require expensive actions.
      +
      +
      getFieldName() - Method in class com.sleepycat.persist.evolve.Mutation
      +
      +
      Returns the field name to which this mutation applies, or null if this + mutation applies to the class itself.
      +
      +
      getFieldNames() - Method in interface com.sleepycat.je.CustomStats
      +
      +
      The field names that are output to the je.stats.csv file.
      +
      +
      getFields() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns a map of field name to raw field for each non-static + non-transient field declared in this class, or null if this is not a + complex type (in other words, this is a simple type or an array type).
      +
      +
      getFieldValues() - Method in interface com.sleepycat.je.CustomStats
      +
      +
      The field values that are output to the je.stats.csv file.
      +
      +
      getFileDeletionBacklog() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      in 7.5, always returns zero. Use EnvironmentStats.getProtectedLogSize() EnvironmentStats.getProtectedLogSizeMap() to monitor + file protection.
      +
      +
      +
      getFileLoggingLevel() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Gets the file logging level.
      +
      +
      getFirst(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the first key/data pair of the database, and returns + that pair.
      +
      +
      getFirst(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the first key/data pair of the database, and returns + that pair.
      +
      +
      getFirst(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the first key/data pair of the database, and return + that pair.
      +
      +
      getForce() - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Returns the configuration of the checkpoint force option.
      +
      +
      getForeignKeyDatabase() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the database used to check the foreign key integrity constraint, + or null if no foreign key constraint will be checked.
      +
      +
      getForeignKeyDeleteAction() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the action taken when a referenced record in the foreign key + database is deleted.
      +
      +
      getForeignKeyNullifier() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the user-supplied object used for setting single-valued foreign + keys to null.
      +
      +
      getForeignMultiKeyNullifier() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the user-supplied object used for setting multi-valued foreign + keys to null.
      +
      +
      getFSyncMaxTime() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The maximum number of milliseconds used to perform a single fsync.
      +
      +
      getFSyncs() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The number of file fsyncs.
      +
      +
      getFSyncTime() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The total number of milliseconds used to perform fsyncs.
      +
      +
      getGroup() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Returns the current composition of the group.
      +
      +
      getGroup() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Returns a description of the replication group as known by this node.
      +
      +
      getGroup() - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Returns the current composition of the group from the Master.
      +
      +
      getGroupName() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Gets the name associated with the replication group.
      +
      +
      getGroupName() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Returns the name of the group associated with the Monitor.
      +
      +
      getGroupName() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Gets the name associated with the replication group.
      +
      +
      getGroupName() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the name of the group which the node joins.
      +
      +
      getGroupName() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Gets the name associated with the replication group.
      +
      +
      getGroupName() - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Returns the name of the replication group.
      +
      +
      getHeartbeatInterval() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Gets the heartbeat interval in milliseconds.
      +
      +
      getHelperHosts() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Returns the string identifying one or more helper host and port pairs in + this format:
      +
      +
      getHelperHosts() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the string identifying one or more helper host and port pairs in + this format:
      +
      +
      getHelperHosts() - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Returns the string identifying one or more helper host and port pairs in + this format:
      +
      +
      getHelperSockets() - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Returns the helper sockets being used to contact a replication group + member, in order to query for the information.
      +
      +
      getHome() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns the database environment's home directory.
      +
      +
      getHostName() - Method in interface com.sleepycat.je.rep.ReplicationNode
      +
      +
      Returns the host name associated with the node.
      +
      +
      getIcon(int) - Method in class com.sleepycat.util.ConfigBeanInfoBase
      +
      +
      This method returns an image object that can be used to + represent the bean in toolboxes, toolbars, etc.
      +
      +
      getId() - Method in class com.sleepycat.je.Transaction
      +
      +
      Return the transaction's unique ID.
      +
      +
      getId() - Method in class com.sleepycat.je.TransactionStats.Active
      +
      +
      The transaction ID of the transaction.
      +
      +
      getId() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the internal unique ID for this type.
      +
      +
      getImmutableSecondaryKey() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns whether the secondary key is immutable.
      +
      +
      getInCompQueueSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of entries in the INCompressor queue when the getStats() + call was made.
      +
      +
      getInitialValue() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns the initial value for a sequence..
      +
      +
      getINsByLevel() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the count of Internal Nodes per level, indexed by level.
      +
      +
      getInstance(Environment) - Static method in class com.sleepycat.collections.CurrentTransaction
      +
      +
      Gets the CurrentTransaction accessor for a specified Berkeley DB + environment.
      +
      +
      getInternalMemoryLimit() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns the maximum amount of JE Cache Memory that the + DiskOrderedScan can use at one time.
      +
      +
      getInternalMemoryLimit() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Returns the maximum amount of non JE Cache Memory that preload can use at + one time.
      +
      +
      getInternalNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the number of Internal Nodes in the database tree.
      +
      +
      getInvalidatingException() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns the exception that caused the environment to be invalidated, or + null if the environment was not invalidated by an exception.
      +
      +
      getIteratorBlockSize() - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns the number of records read at one time by iterators returned by + the StoredCollection.iterator() method.
      +
      +
      getJEVersion() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the current JEVersion that this node runs on.
      +
      +
      getJoinTime() - Method in class com.sleepycat.je.rep.monitor.JoinGroupEvent
      +
      +
      Returns the time at which the node joined the group.
      +
      +
      getJoinTime() - Method in class com.sleepycat.je.rep.monitor.LeaveGroupEvent
      +
       
      +
      getJoinTime() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the time when this node joins the replication group.
      +
      +
      getKBytes() - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Returns the checkpoint log data threshold, in kilobytes.
      +
      +
      getKey() - Method in class com.sleepycat.collections.MapEntryParameter
      +
      +
      Returns the key of this entry.
      +
      +
      getKey() - Method in class com.sleepycat.je.Sequence
      +
      +
      Returns the DatabaseEntry used to open this sequence.
      +
      +
      getKeyBinding() - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Returns the primary key binding for this index.
      +
      +
      getKeyBinding() - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns the secondary key binding for the index.
      +
      +
      getKeyClass() - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Returns the primary key class for this index.
      +
      +
      getKeyClass() - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns the secondary key class for this index.
      +
      +
      getKeyCreator(Class<V>, String) - Method in class com.sleepycat.collections.TupleSerialFactory
      +
      +
      Creates a SecondaryKeyCreator object for use in configuring + a SecondaryDatabase.
      +
      +
      getKeyCreator() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the user-supplied object used for creating single-valued + secondary keys.
      +
      +
      getKeyName() - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
      +
      Returns the key name, which may be different from the field name.
      +
      +
      getKeyPrefixing() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the key prefixing configuration.
      +
      +
      getKeysDatabase() - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns the underlying secondary database that is not associated with + the primary database and is used for the SecondaryIndex.keysIndex.
      +
      +
      getKeysOnly() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns true if the DiskOrderedCursor is configured to return only + keys.
      +
      +
      getKnownClasses() - Method in class com.sleepycat.persist.model.AnnotationModel
      +
       
      +
      getKnownClasses() - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns the names of all known persistent classes.
      +
      +
      getKnownMasterTxnEndVLSN() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the transaction end VLSN on the master known by this node.
      +
      +
      getKnownSpecialClasses() - Method in class com.sleepycat.persist.model.AnnotationModel
      +
       
      +
      getKnownSpecialClasses() - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns the names of all known persistent enum and array classes that + may be used to store persistent data.
      +
      +
      getLast(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the last key/data pair of the database, and returns + that pair.
      +
      +
      getLast(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the last key/data pair of the database, and returns + that pair.
      +
      +
      getLast(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the last key/data pair of the database, and return + that pair.
      +
      +
      getLastCheckpointEnd() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The location in the log of the last checkpoint end.
      +
      +
      getLastCheckpointId() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The Id of the last checkpoint.
      +
      +
      getLastCheckpointInterval() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Byte length from last checkpoint start to the previous checkpoint start.
      +
      +
      getLastCheckpointStart() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The location in the log of the last checkpoint start.
      +
      +
      getLastCommitTimestamp() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The commit timestamp of the last committed transaction on the master, or + 0 if not known or this node is not the master.
      +
      +
      getLastCommitVLSN() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The VLSN of the last committed transaction on the master, or 0 if not + known or this node is not the master.
      +
      +
      getLastFileInBackupSet() - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      Can only be called in backup mode, after startBackup() has been called.
      +
      +
      getLastKnownUtilization() - Method in class com.sleepycat.je.EnvironmentStats
      +
      + +
      +
      getLastValue() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the last cached value of the sequence.
      +
      +
      getLeafNodeCount() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the number of leaf nodes in the database tree, which can equal + the number of records.
      +
      +
      getLeaveReason() - Method in class com.sleepycat.je.rep.monitor.LeaveGroupEvent
      +
      +
      Returns the reason why the node left the group.
      +
      +
      getLeaveTime() - Method in class com.sleepycat.je.rep.monitor.LeaveGroupEvent
      +
      +
      Returns the time at which the node left the group.
      +
      +
      getLNSizeCorrectionFactor() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      in JE 6.3. Adjustments are no longer needed because LN log + sizes have been stored in the Btree since JE 6.0.
      +
      +
      +
      getLoadLNs() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Return the configuration of the preload load LNs option.
      +
      +
      getLocalSync() - Method in class com.sleepycat.je.Durability
      +
      +
      Returns the transaction synchronization policy to be used locally when + committing a transaction.
      +
      +
      getLocalWrite() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns whether local-write is configured for this transaction.
      +
      +
      getLockBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes of JE cache used for holding locks and transactions, in bytes."
      +
      +
      getLocking() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns true if the database environment is configured for locking.
      +
      +
      getLockMode() - Method in class com.sleepycat.je.ReadOptions
      +
      +
      Returns the LockMode to be used for the operation.
      +
      +
      getLockStats(StatsConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Deprecated. +
      as of 4.0.10, replaced by Environment.getStats(StatsConfig).

      +
      +
      +
      getLockTimeout(TimeUnit) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns the lock timeout setting.
      +
      +
      getLockTimeout() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. + +
      +
      +
      getLockTimeout(TimeUnit) - Method in class com.sleepycat.je.Transaction
      +
      +
      Returns the lock request timeout value for the transaction.
      +
      +
      getLogFilesInBackupSet() - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      Get the minimum list of files that must be copied for this backup.
      +
      +
      getLogFilesInBackupSet(long) - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      Deprecated. +
      replaced by DbBackup.getLogFilesInBackupSet(); pass + lastFileInPrevBackup to the DbBackup.DbBackup(Environment,long) + constructor.
      +
      +
      +
      getLogFilesInSnapshot() - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      Get the list of all active files that are needed for the environment at + the point of time when backup mode started, i.e., the current snapshot.
      +
      +
      getLoggingHandler() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns the custom java.util.logging.Handler specified by the + application.
      +
      +
      getLoggingHandler() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Returns the custom java.util.logging.Handler specified by the + application.
      +
      +
      getLogProviders() - Method in exception com.sleepycat.je.rep.InsufficientLogException
      +
      +
      Returns the members of the replication group that can serve as candidate + log providers to supply the logs needed by this node.
      +
      +
      getLogProviders() - Method in class com.sleepycat.je.rep.NetworkRestoreConfig
      +
      +
      Returns the candidate list of data nodes, either ELECTABLE or SECONDARY + members, that may be used to obtain log files.
      +
      +
      getLogVersion() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the log version of this node.
      +
      +
      getLSNBatchSize() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns the maximum number of LSNs to be sorted that this + DiskOrderedCursor is configured for.
      +
      +
      getLSNBatchSize() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Preload is implemented to optimize I/O cost by fetching the records of + a Database by disk order, so that disk access is are sequential rather + than random.
      +
      +
      getMainTreeMaxDepth() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the maximum depth of the main database tree.
      +
      +
      getMajor() - Method in class com.sleepycat.je.JEVersion
      +
      +
      Major number of the release version.
      +
      +
      getMaster() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The current master node.
      +
      +
      getMasterName() - Method in class com.sleepycat.je.rep.monitor.MemberChangeEvent
      +
      +
      Returns the name of the master at the time of this event.
      +
      +
      getMasterName() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the name of the current + master known by this node.
      +
      +
      getMasterNodeName() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Identifies the master of the replication group, resulting from the last + successful election.
      +
      +
      getMasterNodeName() - Method in class com.sleepycat.je.rep.StateChangeEvent
      +
      +
      Returns the node name identifying the master at the time of the event.
      +
      +
      getMasterNodeName() - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Returns the node name associated with the master
      +
      +
      getMax() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the maximum permitted value of the sequence.
      +
      +
      getMaxBytes() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Return the number of bytes in the cache to stop the preload at.
      +
      +
      getMaxClockDelta(TimeUnit) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the maximum acceptable clock skew between this Replica and its + Feeder, which is the node that is the source of its replication stream.
      +
      +
      getMaxDisk() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for getting EnvironmentConfig.MAX_DISK.
      +
      +
      getMaxMillisecs() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Return the number of millisecs to stop the preload after.
      +
      +
      getMaxRetries() - Method in class com.sleepycat.collections.TransactionRunner
      +
      +
      Returns the maximum number of retries that will be performed when + deadlocks are detected.
      +
      +
      getMaxSeedMillisecs() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Deprecated. +
      this method returns zero and will be removed in a future + release.
      +
      +
      +
      getMaxSeedNodes() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Deprecated. +
      this method returns zero and will be removed in a future + release.
      +
      +
      +
      getMBeanInfo() - Method in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      getMember(String) - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Get administrative information about a node by its node name.
      +
      +
      getMessage() - Method in exception com.sleepycat.je.DatabaseException
      +
       
      +
      getMessage() - Method in exception com.sleepycat.je.EnvironmentFailureException
      +
       
      +
      getMin() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the minimum permitted value of the sequence.
      +
      +
      getMinimizeRecoveryTime() - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Returns the configuration of the minimize recovery time option.
      +
      +
      getMinor() - Method in class com.sleepycat.je.JEVersion
      +
      +
      Minor number of the release version.
      +
      +
      getMinutes() - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Returns the checkpoint time threshold, in minutes.
      +
      +
      getMixedLRUSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of INs in the mixed/priority-1 LRU "
      +
      +
      getModel() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the current entity model for this store.
      +
      +
      getModel() - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Returns the last configured and stored entity model for this store.
      +
      +
      getModel() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the entity model that defines entity classes and index keys.
      +
      +
      getMonitorNodes() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the subset of nodes in the group that monitor group membership + but do not maintain replicated environments.
      +
      +
      getMonitorSocketAddress() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Returns the socket used by this monitor to listen for group changes
      +
      +
      getMultiKeyCreator() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the user-supplied object used for creating multi-valued + secondary keys.
      +
      +
      getMutableConfig() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns database environment attributes.
      +
      +
      getMutations() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the set of mutations that were configured when the store was + opened, or if none were configured, the set of mutations that were + configured and stored previously.
      +
      +
      getMutations() - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Returns the set of mutations that were configured and stored previously.
      +
      +
      getMutations() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the configured mutations for performing lazy evolution of stored + instances.
      +
      +
      getNAborts() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of transactions that have aborted.
      +
      +
      getNAcquiresNoWaiters() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of acquires of lock table latch with no contention.
      +
      +
      getNAcquiresNoWaiters() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Number of acquires of lock table latch with no contention.
      +
      +
      getNAcquiresNoWaitSuccessful() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful no-wait acquires of the lock table latch.
      +
      +
      getNAcquiresNoWaitSuccessful() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Number of successful no-wait acquires of the lock table latch.
      +
      +
      getNAcquiresNoWaitUnSuccessful() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of unsuccessful no-wait acquires of the lock table latch.
      +
      +
      getNAcquiresNoWaitUnSuccessful() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Number of unsuccessful no-wait acquires of the lock table latch.
      +
      +
      getNAcquiresSelfOwned() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of acquires of lock table latch when it was already owned + by the caller.
      +
      +
      getNAcquiresSelfOwned() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Number of acquires of lock table latch when it was already owned + by the caller.
      +
      +
      getNAcquiresWithContention() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of acquires of lock table latch when it was already owned by + another thread.
      +
      +
      getNAcquiresWithContention() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Number of acquires of lock table latch when it was already owned by + another thread.
      +
      +
      getNActive() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of transactions that are currently active.
      +
      +
      getName() - Method in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
      +
      Returns the name:"CommitPointConsistencyPolicy", associated with this policy.
      +
      +
      getName() - Method in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
      +
      Returns the name:"NoConsistencyRequiredPolicy", associated with this policy.
      +
      +
      getName() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the name associated with the group.
      +
      +
      getName() - Method in interface com.sleepycat.je.rep.ReplicationNode
      +
      +
      Returns the unique name associated with the node.
      +
      +
      getName() - Method in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
      +
      Returns the name:"TimeConsistencyPolicy", associated with this policy.
      +
      +
      getName() - Method in interface com.sleepycat.je.ReplicaConsistencyPolicy
      +
      +
      Returns the name used to identify the policy.
      +
      +
      getName() - Method in class com.sleepycat.je.Transaction
      +
      +
      Get the user visible name for the transaction.
      +
      +
      getName() - Method in class com.sleepycat.je.TransactionStats.Active
      +
      +
      The transaction name, including the thread name if available.
      +
      +
      getName() - Method in class com.sleepycat.persist.model.FieldMetadata
      +
      +
      Returns the field name.
      +
      +
      getName() - Method in interface com.sleepycat.persist.raw.RawField
      +
      +
      Returns the name of the field.
      +
      +
      getNBatchesCacheMode() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBatchesCritical() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBatchesDaemon() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBatchesEvictorThread() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBatchesManual() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBegins() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of transactions that have begun.
      +
      +
      getNBINDeltaBlindOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "The number of operations performed blindly in BIN deltas"
      +
      +
      getNBinDeltaDeleteOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of user (non-internal) Cursor and Database delete operations + performed in BIN deltas.
      +
      +
      getNBinDeltaGetOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of user (non-internal) Cursor and Database get operations + performed in BIN deltas.
      +
      +
      getNBinDeltaInsertOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of user (non-internal) Cursor and Database insert operations + performed in BIN deltas (these are insertions performed via the various + put methods).
      +
      +
      getNBINDeltasCleaned() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of BIN-deltas cleaned."
      +
      +
      getNBINDeltasDead() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of BIN-deltas that were not found in the tree anymore (deleted)."
      +
      +
      getNBINDeltasFetchMiss() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BIN-deltas (partial BINs) fetched to satisfy btree operations that were not in main cache."
      +
      +
      getNBINDeltasMigrated() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of BIN-deltas migrated."
      +
      +
      getNBINDeltasObsolete() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of BIN-deltas obsolete."
      +
      +
      getNBinDeltaUpdateOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of user (non-internal) Cursor and Database update operations + performed in BIN deltas (these are updates performed via the various + put methods).
      +
      +
      getNBINsEvictedCacheMode() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBINsEvictedCritical() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBINsEvictedDaemon() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBINsEvictedEvictorThread() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBINsEvictedManual() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNBINsFetch() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BINs (bottom internal nodes) and BIN-deltas requested by btree operations."
      +
      +
      getNBINsFetchMiss() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of full BINs (bottom internal nodes) and BIN-deltas fetched to satisfy btree operations that were not in main cache."
      +
      +
      getNBINsFetchMissRatio() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "The BIN fetch miss ratio (nBINsFetchMiss / nBINsFetch)"
      +
      +
      getNBINsLoaded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns the number of BINs that were loaded into the cache during the + preload() operation.
      +
      +
      getNBINsMutated() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. + +
      +
      +
      getNBINsStripped() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. + +
      +
      +
      getNBytesEvictedCacheMode() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes evicted by operations for which CacheMode.EVICT_BIN is specified."
      +
      +
      getNBytesEvictedCritical() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes evicted in the application thread because the cache is over budget."
      +
      +
      getNBytesEvictedDeamon() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes evicted by JE deamon threads."
      +
      +
      getNBytesEvictedEvictorThread() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes evicted by evictor pool threads."
      +
      +
      getNBytesEvictedManual() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of bytes evicted by the Environment.evictMemory or during Environment startup."
      +
      +
      getNBytesReadFromWriteQueue() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of bytes read to fulfill file read operations by reading out + of the pending write queue.
      +
      +
      getNBytesWrittenFromWriteQueue() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of bytes written from the pending write queue.
      +
      +
      getNCachedBINDeltas() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BIN-deltas (partial BINs) in main cache. This is a subset of the nCachedBINs value."
      +
      +
      getNCachedBINs() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BINs (bottom internal nodes) and BIN-deltas in main cache."
      +
      +
      getNCachedGets() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the number of times that Sequence.get was called and a cached + value was returned.
      +
      +
      getNCachedUpperINs() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of upper INs (non-bottom internal nodes) in main cache."
      +
      +
      getNCacheMiss() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The total number of requests for database objects which were not in + memory.
      +
      +
      getNCheckpoints() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The total number of checkpoints run so far.
      +
      +
      getNCleanerDeletions() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of cleaner file deletions."
      +
      +
      getNCleanerDiskRead() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of disk reads by the cleaner."
      +
      +
      getNCleanerEntriesRead() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of log entries read by the cleaner."
      +
      +
      getNCleanerProbeRuns() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      in JE 6.3, always returns zero.
      +
      +
      +
      getNCleanerRevisalRuns() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of cleaner runs that ended in revising expiration info, but not in any cleaning."
      +
      +
      getNCleanerRuns() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of cleaner runs, including two-pass runs."
      +
      +
      getNCleanerTwoPassRuns() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of cleaner two-pass runs."
      +
      +
      getNClusterLNsProcessed() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs processed because they qualify for clustering."
      +
      +
      getNCommits() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of transactions that have committed.
      +
      +
      getNConverted() - Method in class com.sleepycat.persist.evolve.EvolveStats
      +
      +
      The total number of entities converted during eager evolution.
      +
      +
      getNCountMemoryExceeded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns the count of the number of times that the internal memory budget + specified by PreloadConfig.setInternalMemoryLimit() was exceeded.
      +
      +
      getNDBINsLoaded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Deprecated. +
      returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
      +
      +
      +
      getNDeltaINFlush() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The accumulated number of Delta INs flushed to the log.
      +
      +
      getNDINsLoaded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Deprecated. +
      returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
      +
      +
      +
      getNDirtyNodesEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of dirty target nodes logged and evicted."
      +
      +
      getNDupCountLNsLoaded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Deprecated. +
      returns zero for data written using JE 5.0 and later, but + may return non-zero values when reading older data.
      +
      +
      +
      getNeedReset() - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Tell the MBean if the available set of functionality has changed.
      +
      +
      getNEmbeddedLNs() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns the number of embedded LNs encountered during the preload() + operation.
      +
      +
      getNEvictionRuns() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of times the background eviction thread is awoken."
      +
      +
      getNEvictPasses() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. + +
      +
      +
      getNewName() - Method in class com.sleepycat.persist.evolve.Renamer
      +
      +
      Returns the new class or field name specified in the constructor.
      +
      +
      getNext(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the next key/data pair and returns that pair.
      +
      +
      getNext(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.DiskOrderedCursor
      +
       
      +
      getNext(DatabaseEntry, DatabaseEntry, LockMode) - Method in interface com.sleepycat.je.ForwardCursor
      +
      +
      Moves the cursor to the next key/data pair and returns that pair.
      +
      +
      getNext(DatabaseEntry, LockMode) - Method in class com.sleepycat.je.JoinCursor
      +
      +
      Returns the next primary key resulting from the join operation.
      +
      +
      getNext(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.JoinCursor
      +
      +
      Returns the next primary key and data resulting from the join operation.
      +
      +
      getNext(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the next key/data pair and returns that pair.
      +
      +
      getNext(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the next key/data pair and return that pair.
      +
      +
      getNextDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      If the next key/data pair of the database is a duplicate data record for + the current key/data pair, moves the cursor to the next key/data pair of + the database and returns that pair.
      +
      +
      getNextDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      If the next key/data pair of the database is a duplicate data record for + the current key/data pair, moves the cursor to the next key/data pair of + the database and returns that pair.
      +
      +
      getNextDup(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      If the next key/data pair of the database is a duplicate data record for + the current key/data pair, move the cursor to the next key/data pair of + the database and return that pair.
      +
      +
      getNextNoDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the next non-duplicate key/data pair and returns + that pair.
      +
      +
      getNextNoDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the next non-duplicate key/data pair and returns + that pair.
      +
      +
      getNextNoDup(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the next non-duplicate key/data pair and return that + pair.
      +
      +
      getNFeedersCreated() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of Feeder threads since this node was started.
      +
      +
      getNFeedersShutdown() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of Feeder threads that were shut down, either because this + node, or the Replica terminated the connection.
      +
      +
      getNFileOpens() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of times a log file has been opened.
      +
      +
      getNFSyncRequests() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of fsyncs requested through the group commit manager.
      +
      +
      getNFSyncs() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of fsyncs issued through the group commit manager.
      +
      +
      getNFSyncTimeouts() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of fsync requests submitted to the group commit manager which + timed out.
      +
      +
      getNFullBINFlush() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The accumulated number of full BINs flushed to the log.
      +
      +
      getNFullBINsMiss() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of times a BIN-delta had to be mutated to a full BIN (and as a result a full BIN had to be read in from the log)."
      +
      +
      getNFullINFlush() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The accumulated number of full INs flushed to the log.
      +
      +
      getNGets() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the number of times that Sequence.get was called successfully.
      +
      +
      getNINCompactKeyIN() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of INs that use a compact key representation to minimize the key object representation overhead."
      +
      +
      getNINNoTarget() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of INs that use a compact representation when none of its child nodes are in the main cache."
      +
      +
      getNINsCleaned() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of INs cleaned."
      +
      +
      getNINsDead() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of INs that were not found in the tree anymore (deleted)."
      +
      +
      getNINsLoaded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns the number of INs that were loaded into the cache during the + preload() operation.
      +
      +
      getNINsMigrated() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of INs migrated."
      +
      +
      getNINsObsolete() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of INs obsolete."
      +
      +
      getNINSparseTarget() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of INs that use a compact sparse array representation to point to child nodes in the main cache."
      +
      +
      getNLNQueueHits() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs processed without a tree lookup."
      +
      +
      getNLNsCleaned() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs cleaned."
      +
      +
      getNLNsDead() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs that were not found in the tree anymore (deleted)."
      +
      +
      getNLNsEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs evicted as a result of LRU-based eviction (but not CacheMode.EVICT_LN)."
      +
      +
      getNLNsExpired() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of obsolete LNs that were expired."
      +
      +
      getNLNsFetch() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs (data records) requested by btree operations."
      +
      +
      getNLNsFetchMiss() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs (data records) requested by btree operations that were not in main cache."
      +
      +
      getNLNsLoaded() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns the number of LNs that were loaded into the cache during the + preload() operation.
      +
      +
      getNLNsLocked() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs encountered that were locked."
      +
      +
      getNLNsMarked() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs in temporary DBs that were dirtied by the cleaner and subsequently logging during checkpoint/eviction."
      +
      +
      getNLNsMigrated() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs that were migrated forward in the log by the cleaner."
      +
      +
      getNLNsObsolete() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs obsolete."
      +
      +
      getNLogBuffers() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of log buffers currently instantiated.
      +
      +
      getNLogFSyncs() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The total number of fsyncs of the JE log.
      +
      +
      getNMarkedLNsProcessed() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs processed because they were previously marked for migration."
      +
      +
      getNMaxReplicaLag() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The lag (in VLSNs) associated with the replica that's farthest behind in + replaying the replication stream.
      +
      +
      getNMaxReplicaLagName() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The name of the replica that's farthest behind in replaying the + replication stream.
      +
      +
      getNNodesEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target nodes (INs) evicted from the main cache."
      +
      +
      getNNodesExplicitlyEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. + +
      +
      +
      getNNodesMovedToDirtyLRU() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of nodes (INs) moved from the mixed/priority-1 to the dirty/priority-2 LRU list."
      +
      +
      getNNodesMutated() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target BINs mutated to BIN-deltas."
      +
      +
      getNNodesPutBack() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target nodes (INs) moved to the cold end of the LRU list without any action taken on them."
      +
      +
      getNNodesScanned() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has no meaning after the implementation + of the new evictor in JE 6.0. The method returns 0 always.
      +
      +
      +
      getNNodesSelected() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. + +
      +
      +
      getNNodesSkipped() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of nodes (INs) that did not require any action."
      +
      +
      getNNodesStripped() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target BINs whose child LNs were evicted (stripped)."
      +
      +
      getNNodesTargeted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of nodes (INs) selected as eviction targets."
      +
      +
      getNNotResident() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of requests for database objects not contained within the + in memory data structures.
      +
      +
      getNodeHostname() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the hostname component of the nodeHost property.
      +
      +
      getNodeHostname() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the hostname component of the nodeHost property.
      +
      +
      getNodeHostPort() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Returns the hostname and port associated with this node.
      +
      +
      getNodeHostPort() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the hostname and port associated with this node.
      +
      +
      getNodeHostPort() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the hostname and port associated with this node.
      +
      +
      getNodeMaxDupTreeEntries() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Deprecated. +
      this property no longer has any effect and zero is always + returned; DatabaseConfig.getNodeMaxEntries() should be used instead.
      +
      +
      +
      getNodeMaxEntries() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the maximum number of children a B+Tree node can have.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns the user defined nodeName for the Environment.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Returns the unique name associated with this Arbiter.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Returns the group-wide unique name associated with the monitor
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.monitor.MonitorChangeEvent
      +
      +
      Returns the name of the node associated with the event.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the unique name associated with this monitor.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the name of the node whose state is requested.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Returns the unique name used to identify this replicated environment.
      +
      +
      getNodeName() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the unique name associated with this node.
      +
      +
      getNodePort() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the port component of the nodeHost property.
      +
      +
      getNodePort() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the port component of the nodeHost property.
      +
      +
      getNodePriority() - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Returns the election priority associated with the node.
      +
      +
      getNodes() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the set of all nodes in the group.
      +
      +
      getNodeState() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the replication state of + this node.
      +
      +
      getNodeState() - Method in class com.sleepycat.je.rep.util.DbPing
      +
       
      +
      getNodeState(ReplicationNode, int) - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Returns the state of a replicated + node and state of the application where the node is + running in.
      +
      +
      getNodeType() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the NodeType of this node.
      +
      +
      getNonEmptyBins() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of BINs encountered by the INCompressor that were not + actually empty when the compressor ran.
      +
      +
      getNonSticky() - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Returns the non-sticky setting.
      +
      +
      getNOpenFiles() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of files currently open in the file cache.
      +
      +
      getNoSort() - Method in class com.sleepycat.je.JoinConfig
      +
      +
      Returns whether automatic sorting of the input cursors is disabled.
      +
      +
      getNoSync() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Deprecated. + +
      +
      +
      getNotificationInfo() - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      Get notification metadata for this MBean.
      +
      +
      getNotificationInfo(Environment) - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      No notifications are supported.
      +
      +
      getNoWait() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns true if the transaction is configured to not wait if a lock + request cannot be immediately granted.
      +
      +
      getNOwners() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total lock owners in lock table.
      +
      +
      getNOwners() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total lock owners in lock table.
      +
      +
      getNPendingLNsLocked() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of pending LNs that could not be locked for migration because of a long duration application lock."
      +
      +
      getNPendingLNsProcessed() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs processed because they were previously locked."
      +
      +
      getNProtocolBytesRead() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of bytes of Replication Stream read over the network.
      +
      +
      getNProtocolBytesWritten() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of Replication Stream bytes written over the network.
      +
      +
      getNProtocolEntriesWrittenOldVersion() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns the number of messages containing log entries that were written + to the replication stream using the previous log format to support + replication to a replica running an earlier version during an upgrade.
      +
      +
      getNProtocolMessageBatches() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of Replication Stream message batches written to the network.
      +
      +
      getNProtocolMessagesBatched() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of Replication Stream messages that were written as part + of a message batch instead of being written individually.
      +
      +
      getNProtocolMessagesRead() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of Replication Stream messages read over the network.
      +
      +
      getNProtocolMessagesWritten() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total number of Replication Stream messages written over the + network.
      +
      +
      getNRandomReadBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of bytes read which required repositioning the disk head + more than 1MB from the previous file position.
      +
      +
      getNRandomReads() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of disk reads which required repositioning the disk head + more than 1MB from the previous file position.
      +
      +
      getNRandomWriteBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of bytes written which required repositioning the disk head + more than 1MB from the previous file position.
      +
      +
      getNRandomWrites() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of disk writes which required repositioning the disk head by + more than 1MB from the previous file position.
      +
      +
      getNRead() - Method in class com.sleepycat.persist.evolve.EvolveStats
      +
      +
      The total number of entities read during eager evolution.
      +
      +
      getNReadLocks() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total read locks currently held.
      +
      +
      getNReadLocks() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total read locks currently held.
      +
      +
      getNReadsFromWriteQueue() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of file read operations which were fulfilled by reading out + of the pending write queue.
      +
      +
      getNReleases() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of releases of the lock table latch.
      +
      +
      getNReleases() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Number of releases of the lock table latch.
      +
      +
      getNRepeatFaultReads() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of reads which had to be repeated when faulting in an object + from disk because the read chunk size controlled by je.log.faultReadSize + is too small.
      +
      +
      getNRepeatIteratorReads() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of attempts to read a log entry larger than the read buffer size during which the log buffer couldn\'t be grown enough to accommodate the object."
      +
      +
      getNReplayAborts() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of abort records which were replayed while the node was in + the Replica state.
      +
      +
      getNReplayCommitAcks() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of commit log records that needed to be acknowledged to the + Master by this node when it was a Replica.
      +
      +
      getNReplayCommitNoSyncs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of commitNoSync() calls executed when satisfying transaction + commit acknowledgment requests from the Master.
      +
      +
      getNReplayCommits() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of commit log records that were replayed by this node when + it was a Replica.
      +
      +
      getNReplayCommitSyncs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of commitSync() calls executed when satisfying transaction + commit acknowledgment requests from the Master.
      +
      +
      getNReplayCommitWriteNoSyncs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of commitNoSync() calls executed when satisfying transaction + commit acknowledgment requests from the Master.
      +
      +
      getNReplayGroupCommitMaxExceeded() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of group commits that were initiated due the + max group size being + exceeded.
      +
      +
      getNReplayGroupCommits() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of group commit operations.
      +
      +
      getNReplayGroupCommitTimeouts() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of group commits that were initiated due to the + group timeout + interval being exceeded.
      +
      +
      getNReplayGroupCommitTxns() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of replay transaction commits that were part of a group + commit operation.
      +
      +
      getNReplayLNs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of data records (creation, update, deletion) which were + replayed while the node was in the Replica state.
      +
      +
      getNReplayNameLNs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of NameLN records which were replayed while the node was in + the Replica state.
      +
      +
      getNRequests() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total number of lock requests to date.
      +
      +
      getNRequests() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total number of lock requests to date.
      +
      +
      getNRootNodesEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of database root nodes (INs) evicted."
      +
      +
      getNSequentialReadBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of bytes read which did not require repositioning the disk + head more than 1MB from the previous file position.
      +
      +
      getNSequentialReads() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of disk reads which did not require repositioning the disk + head more than 1MB from the previous file position.
      +
      +
      getNSequentialWriteBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of bytes written which did not require repositioning the + disk head more than 1MB from the previous file position.
      +
      +
      getNSequentialWrites() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of disk writes which did not require repositioning the disk + head by more than 1MB from the previous file position.
      +
      +
      getNSharedCacheEnvironments() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of Environments sharing the main cache."
      +
      +
      getNTempBufferWrites() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of writes which had to be completed using the temporary + marshalling buffer because the fixed size log buffers specified by + je.log.totalBufferBytes and je.log.numBuffers were not large enough.
      +
      +
      getNThreadUnavailable() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of eviction tasks that were submitted to the background evictor pool, but were refused because all eviction threads were busy."
      +
      +
      getNToBeCleanedLNsProcessed() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Accumulated number of LNs processed because they are soon to be cleaned."
      +
      +
      getNTotalLocks() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total locks currently in lock table.
      +
      +
      getNTotalLocks() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total locks currently in lock table.
      +
      +
      getNTxnsAcked() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of transactions that were successfully acknowledged based + upon the Durability.ReplicaAckPolicy policy associated with the + transaction commit.
      +
      +
      getNTxnsNotAcked() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of transactions that were not acknowledged as required by the + Durability.ReplicaAckPolicy policy associated with the transaction commit.
      +
      +
      getNumericVersionString() - Method in class com.sleepycat.je.JEVersion
      +
      +
      The numeric version string, without the patch tag.
      +
      +
      getNumRetries() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the number of times a ping thread attempts to contact a node + before deeming it unreachable.
      +
      +
      getNUpperINsEvictedCacheMode() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNUpperINsEvictedCritical() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNUpperINsEvictedDaemon() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNUpperINsEvictedEvictorThread() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNUpperINsEvictedManual() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      This statistic has been removed. The method returns 0 + always.
      +
      +
      +
      getNUpperINsFetch() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of Upper INs (non-bottom internal nodes) requested by btree operations."
      +
      +
      getNUpperINsFetchMiss() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of Upper INs (non-bottom internal nodes) requested by btree operations that were not in main cache."
      +
      +
      getNWaiters() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total transactions waiting for locks.
      +
      +
      getNWaiters() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total transactions waiting for locks.
      +
      +
      getNWaits() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total number of lock waits to date.
      +
      +
      getNWaits() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total number of lock waits to date.
      +
      +
      getNWriteLocks() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Total write locks currently held.
      +
      +
      getNWriteLocks() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Total write locks currently held.
      +
      +
      getNWriteQueueOverflow() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of writes operations which would overflow the Write Queue.
      +
      +
      getNWriteQueueOverflowFailures() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of writes operations which would overflow the Write Queue + and could not be queued.
      +
      +
      getNWritesFromWriteQueue() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of file writes operations executed from the pending write + queue.
      +
      +
      getNXAAborts() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of XA transactions that have aborted.
      +
      +
      getNXACommits() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of XA transactions that have committed.
      +
      +
      getNXAPrepares() - Method in class com.sleepycat.je.TransactionStats
      +
      +
      The number of XA transactions that have been prepared.
      +
      +
      getOffHeapAllocFailures() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of off-heap allocation failures due to lack of system memory."
      +
      +
      getOffHeapAllocOverflows() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of off-heap allocation attempts that exceeded the cache size."
      +
      +
      getOffHeapBINsLoaded() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BINs loaded from the off-heap cache."
      +
      +
      getOffHeapBINsStored() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BINs stored into the off-heap cache."
      +
      +
      getOffHeapCachedBINDeltas() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BIN-deltas residing in the off-heap cache."
      +
      +
      getOffHeapCachedBINs() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BINs (full BINs and BIN-deltas) residing in the off-heap cache."
      +
      +
      getOffHeapCachedLNs() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs residing in the off-heap cache."
      +
      +
      getOffHeapCacheSize() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for getting + EnvironmentConfig.MAX_OFF_HEAP_MEMORY.
      +
      +
      getOffHeapCriticalNodesTargeted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of nodes targeted in \'critical eviction\' mode."
      +
      +
      getOffHeapDirtyNodesEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target BINs evicted from the off-heap cache that were dirty and therefore were logged."
      +
      +
      getOffHeapLNsEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs evicted from the off-heap cache as a result of BIN stripping."
      +
      +
      getOffHeapLNsLoaded() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs loaded from the off-heap cache."
      +
      +
      getOffHeapLNsStored() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs stored into the off-heap cache."
      +
      +
      getOffHeapLRUSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LRU entries used for the off-heap cache."
      +
      +
      getOffHeapNodesEvicted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target BINs (including BIN-deltas) evicted from the off-heap cache."
      +
      +
      getOffHeapNodesMutated() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of off-heap target BINs mutated to BIN-deltas."
      +
      +
      getOffHeapNodesSkipped() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of off-heap target BINs on which no action was taken."
      +
      +
      getOffHeapNodesStripped() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of target BINs whose off-heap child LNs were evicted (stripped)."
      +
      +
      getOffHeapNodesTargeted() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of BINs selected as off-heap eviction targets."
      +
      +
      getOffHeapThreadUnavailable() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of eviction tasks that were submitted to the background off-heap evictor pool, but were refused because all eviction threads were busy."
      +
      +
      getOffHeapTotalBlocks() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Total number of memory blocks in off-heap cache."
      +
      +
      getOffHeapTotalBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Total number of estimated bytes in off-heap cache."
      +
      +
      getOffset() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns the byte offset into the data array.
      +
      +
      getOperationList(Environment) - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Get mbean operation metadata for this environment.
      +
      +
      getOverrideBtreeComparator() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the override setting for the btree comparator.
      +
      +
      getOverrideDuplicateComparator() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the override setting for the duplicate comparator.
      +
      +
      getOwnerTxnIds() - Method in exception com.sleepycat.je.LockConflictException
      +
      +
      Returns an array of longs containing transaction ids of owners at the + the time of the timeout.
      +
      +
      getPackedIntByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a packed integer.
      +
      +
      getPackedLongByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a packed long integer.
      +
      +
      getParentId() - Method in class com.sleepycat.je.TransactionStats.Active
      +
      +
      The transaction ID of the parent transaction (or 0, if no parent).
      +
      +
      getPartial() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns whether this DatabaseEntry is configured to read or write + partial records.
      +
      +
      getPartialLength() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns the byte length of the partial record being read or written by + the application, in bytes.
      +
      +
      getPartialOffset() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns the offset of the partial record being read or written by the + application, in bytes.
      +
      +
      getPatch() - Method in class com.sleepycat.je.JEVersion
      +
      +
      Patch number of the release version.
      +
      +
      getPdescriptor(Class) - Static method in class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      getPendingLNQueueSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Number of LNs pending because they were locked and could not be migrated."
      +
      +
      getPermissibleLag(TimeUnit) - Method in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
      +
      Returns the allowed time lag associated with this policy.
      +
      +
      getPersistentFields() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns an unmodifiable list of metadata for the persistent fields in + this class, or null if the default rules for persistent fields should be + used.
      +
      +
      getPort() - Method in interface com.sleepycat.je.rep.ReplicationNode
      +
      +
      Returns the port number associated with the node.
      +
      +
      getPrev(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the previous key/data pair and returns that pair.
      +
      +
      getPrev(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the previous key/data pair and returns that pair.
      +
      +
      getPrev(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the previous key/data pair and return that pair.
      +
      +
      getPrevDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      If the previous key/data pair of the database is a duplicate data record + for the current key/data pair, moves the cursor to the previous key/data + pair of the database and returns that pair.
      +
      +
      getPrevDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      If the previous key/data pair of the database is a duplicate data record + for the current key/data pair, moves the cursor to the previous key/data + pair of the database and returns that pair.
      +
      +
      getPrevDup(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      If the previous key/data pair of the database is a duplicate data record + for the current key/data pair, move the cursor to the previous key/data + pair of the database and return that pair.
      +
      +
      getPrevNoDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the previous non-duplicate key/data pair and returns + that pair.
      +
      +
      getPrevNoDup(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the previous non-duplicate key/data pair and returns + that pair.
      +
      +
      getPrevNoDup(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the previous non-duplicate key/data pair and return + that pair.
      +
      +
      getPriDeleteFailOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of failed primary DB deletion operations.
      +
      +
      getPriDeleteOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful primary DB deletion operations.
      +
      +
      getPriInsertFailOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of failed primary DB insertion operations.
      +
      +
      getPriInsertOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful primary DB insertion operations.
      +
      +
      getPrimaryConfig(Class) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the default primary database Berkeley DB engine API + configuration for an entity class.
      +
      +
      getPrimaryDatabase() - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Returns the primary Database + associated with this cursor.
      +
      +
      getPrimaryDatabase() - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Returns the primary database associated with this secondary database.
      +
      +
      getPrimaryIndex(Class<PK>, Class<E>) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the primary index for a given entity class, opening it if + necessary.
      +
      +
      getPrimaryIndex(String) - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Opens the primary index for a given entity class.
      +
      +
      getPrimaryIndex() - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns the primary index associated with this secondary index.
      +
      +
      getPrimaryKey() - Method in exception com.sleepycat.je.SecondaryReferenceException
      +
      +
      Returns the primary key being accessed during the failure.
      +
      +
      getPrimaryKey() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns the primary key metadata for a key declared in this class, or + null if none is declared.
      +
      +
      getPrimaryKey() - Method in class com.sleepycat.persist.model.EntityMetadata
      +
      +
      Returns the primary key metadata for this entity.
      +
      +
      getPrimitiveBinding(Class<T>) - Static method in class com.sleepycat.bind.tuple.TupleBinding
      +
      +
      Creates a tuple binding for a primitive Java class.
      +
      +
      getPrintInfo() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns true if the Environment.verify and Database.verify are configured to print basic verification information.
      +
      +
      getPriPositionOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful primary DB position operations.
      +
      +
      getPriSearchFailOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of failed primary DB key search operations.
      +
      +
      getPriSearchOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful primary DB key search operations.
      +
      +
      getPriUpdateOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful primary DB update operations.
      +
      +
      getProcessedBins() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of BINs that were successfully processed by the IN + Compressor.
      +
      +
      getProgressListener() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Return the ProgressListener for this PreloadConfig.
      +
      +
      getPropagateExceptions() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns true if the Environment.verify and Database.verify are configured to propagate exceptions found during + verification.
      +
      +
      getPropertiesInfo(Class) - Static method in class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      getPropertyDescriptors() - Method in class com.sleepycat.je.rep.monitor.MonitorConfigBeanInfo
      +
       
      +
      getPropertyDescriptors() - Method in class com.sleepycat.persist.evolve.EvolveConfigBeanInfo
      +
       
      +
      getPropertyDescriptors() - Method in class com.sleepycat.persist.StoreConfigBeanInfo
      +
       
      +
      getPropertyDescriptors(Class) - Method in class com.sleepycat.util.ConfigBeanInfoBase
      +
      +
      Gets the bean's PropertyDescriptors.
      +
      +
      getProps() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
       
      +
      getProtectedLogSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Bytes used by all protected data files: the subset of reserved files that are temporarily protected and cannot be deleted."
      +
      +
      getProtectedLogSizeMap() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "A breakdown of protectedLogSize as a map of protecting entity name to protected size in bytes."
      +
      +
      getProtocolBytesReadRate() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Bytes read throughput, in terms of bytes received from the replication + network channels per second.
      +
      +
      getProtocolBytesWriteRate() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Bytes written throughput, in terms of bytes written to the replication + network channels per second.
      +
      +
      getProtocolMessageReadRate() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Incoming replication message throughput, in terms of messages received + from the replication network channels per second.
      +
      +
      getProtocolMessageWriteRate() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Outgoing message throughput, in terms of message written to the + replication network channels per second.
      +
      +
      getProtocolReadNanos() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of nanoseconds spent reading from the network channel.
      +
      +
      getProtocolWriteNanos() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of nanoseconds spent writing to the network channel.
      +
      +
      getProxiedClassName() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns the class name of the proxied class if this class is a PersistentProxy, or null otherwise.
      +
      +
      getQueueSize() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns the maximum number of entries in the queue before the + DiskOrderedCursor producer thread blocks.
      +
      +
      getRangeMax() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns the maximum value for the sequence.
      +
      +
      getRangeMin() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns the minimum value for the sequence.
      +
      +
      getRawType(String) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns the type information for the current version of a given class, + or null if the class is not currently persistent.
      +
      +
      getRawTypeVersion(String, int) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns the type information for a given version of a given class, + or null if the given version of the class is unknown.
      +
      +
      getReadCommitted() - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Returns true if read operations performed by the cursor are configured + to obey read committed isolation.
      +
      +
      getReadCommitted() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns true if the transaction is configured for read committed + isolation.
      +
      +
      getReadIntLength(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be read by PackedInteger.readInt(byte[], int).
      +
      +
      getReadLongLength(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be read by PackedInteger.readLong(byte[], int).
      +
      +
      getReadOnly() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the database is configured in read-only mode.
      +
      +
      getReadOnly() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns true if the database environment is configured to be read only.
      +
      +
      getReadOnly() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns whether read-only is configured for this transaction.
      +
      +
      getReadOnly() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the read-only configuration property.
      +
      +
      getReadSortedIntLength(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be read by PackedInteger.readSortedInt(byte[], int).
      +
      +
      getReadSortedLongLength(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be read by PackedInteger.readSortedLong(byte[], int).
      +
      +
      getReadUncommitted() - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Returns true if read operations performed by the cursor are configured + to return modified but not yet committed data.
      +
      +
      getReadUncommitted() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns true if read operations performed by the transaction are + configured to return modified but not yet committed data.
      +
      +
      getReceiveBufferSize() - Method in class com.sleepycat.je.rep.NetworkRestoreConfig
      +
      +
      Returns the size of the receive buffer associated with the socket used + to transfer files during the NetworkRestore operation.
      +
      +
      getRecoveryProgressListener() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Return the ProgressListener to be used at this environment startup.
      +
      +
      getRelatches() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      Returns the number of latch upgrades (relatches) required while + operating on this database's BTree.
      +
      +
      getRelatchesRequired() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Returns the number of latch upgrades (relatches) required while + operating on this Environment.
      +
      +
      getRelatedEntity() - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
      +
      Returns the class name of the related (foreign) entity, for which + foreign key constraints are specified using the SecondaryKey.relatedEntity() annotation.
      +
      +
      getRelationship() - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
      +
      Returns the relationship between instances of the entity class and the + secondary keys.
      +
      +
      getRenamer(String, int, String) - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns the renamer mutation for the given class, version and field, or + null if none exists.
      +
      +
      getRenamers() - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns an unmodifiable collection of all renamer mutations.
      +
      +
      getRepConfig() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Return the replication configuration that has been used to create this + handle.
      +
      +
      getRepenvUUID() - Method in class com.sleepycat.je.CommitToken
      +
       
      +
      getRepGroup() - Method in class com.sleepycat.je.rep.monitor.GroupChangeEvent
      +
      +
      Returns the current description of the replication group.
      +
      +
      getReplayElapsedTxnTime() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total elapsed time in milliseconds spent replaying committed and + aborted transactions.
      +
      +
      getReplayMaxCommitProcessingNanos() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The maximum time taken to replay a transaction commit operation.
      +
      +
      getReplayMinCommitProcessingNanos() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The minimum time taken to replay a transaction commit operation.
      +
      +
      getReplayQueueOverflow() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The number of attempts to queue a response when + the queue was full.
      +
      +
      getReplayTotalCommitProcessingNanos() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total time spent to replay all commit operations.
      +
      +
      getReplicaAck() - Method in class com.sleepycat.je.Durability
      +
      +
      Returns the replica acknowledgment policy used by the master when + committing changes to a replicated environment.
      +
      +
      getReplicaAckTimeout(TimeUnit) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Returns the configured replica timeout value.
      +
      +
      getReplicaDelayMap() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns a map from replica node name to the delay, in milliseconds, + between when a transaction was committed on the master and when the + master learned that the transaction was processed on the replica, if + known.
      +
      +
      getReplicaLastCommitTimestampMap() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns a map from replica node name to the commit timestamp of the last + committed transaction that was processed on the replica, if known.
      +
      +
      getReplicaLastCommitVLSNMap() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns a map from replica node name to the VLSN of the last committed + transaction that was processed on the replica, if known.
      +
      +
      getReplicaSync() - Method in class com.sleepycat.je.Durability
      +
      +
      Returns the transaction synchronization policy to be used by the replica + as it replays a transaction that needs an acknowledgment.
      +
      +
      getReplicated() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the replicated property for the database.
      +
      +
      getReplicated() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the replicated property for the store.
      +
      +
      getReplicaVLSNLagMap() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns a map from replica node name to the lag, in VLSNs, between the + replication state of the replica and the master, if known.
      +
      +
      getReplicaVLSNRateMap() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns a map from replica node name to a moving average of the rate, in + VLSNs per minute, that the replica is processing replication data, if + known.
      +
      +
      getRepMutableConfig() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
       
      +
      getRepStats(StatsConfig) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Returns statistics associated with this environment.
      +
      +
      getRequiredEvictBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Deprecated. +
      The method returns 0 always.
      +
      +
      +
      getRequiredNodeCount() - Method in exception com.sleepycat.je.rep.InsufficientReplicasException
      +
      +
      Returns the number of nodes (including the master) that were + required to be active in order to satisfy the Replica ack + policy.
      +
      +
      getReservedLogSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Bytes used by all reserved data files: files that have beencleaned and can be deleted if they are not protected."
      +
      +
      getRetainLogFiles() - Method in class com.sleepycat.je.rep.NetworkRestoreConfig
      +
      +
      Returns a boolean indicating whether existing log files should be + retained or deleted.
      +
      +
      getRetryInterval() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the number of milliseconds between ping thread retries.
      +
      +
      getRootSplits() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      The number of times the root of the BTree was split.
      +
      +
      getSearchBoth(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the specified key/data pair, where both the key and + data items must match.
      +
      +
      getSearchBoth(Transaction, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Database
      +
      +
      Retrieves the key/data pair with the given key and data value, that is, + both the key and data items must match.
      +
      +
      getSearchBoth(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed with this method signature.
      +
      +
      getSearchBoth(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the specified secondary and primary key, where both + the primary and secondary key items must match.
      +
      +
      getSearchBoth(Transaction, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      This operation is not allowed with this method signature.
      +
      +
      getSearchBoth(Transaction, DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Retrieves the key/data pair with the specified secondary and primary + key, that is, both the primary and secondary key items must match.
      +
      +
      getSearchBothRange(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the specified key and closest matching data item of + the database.
      +
      +
      getSearchBothRange(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed with this method signature.
      +
      +
      getSearchBothRange(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the specified secondary key and closest matching + primary key of the database.
      +
      +
      getSearchKey(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the given key of the database, and returns the datum + associated with the given key.
      +
      +
      getSearchKey(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the given key of the database, and returns the datum + associated with the given key.
      +
      +
      getSearchKey(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the given key of the database, and return the datum + associated with the given key.
      +
      +
      getSearchKeyRange(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Moves the cursor to the closest matching key of the database, and + returns the data item associated with the matching key.
      +
      +
      getSearchKeyRange(DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Moves the cursor to the closest matching key of the database, and + returns the data item associated with the matching key.
      +
      +
      getSearchKeyRange(DatabaseEntry, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      Move the cursor to the closest matching key of the database, and return + the data item associated with the matching key.
      +
      +
      getSecDeleteOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful secondary DB deletion operations.
      +
      +
      getSecInsertOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful secondary DB insertion operations.
      +
      +
      getSecondaryBulkLoad() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the bulk-load-secondaries configuration property.
      +
      +
      getSecondaryConfig() - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Deprecated. +
      As of JE 4.0.13, replaced by SecondaryDatabase.getConfig().
      +
      +
      +
      getSecondaryConfig(Class, String) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the default secondary database Berkeley DB engine API + configuration for an entity class and key name.
      +
      +
      getSecondaryDatabaseName() - Method in exception com.sleepycat.je.SecondaryReferenceException
      +
      +
      Returns the name of the secondary database being accessed during the + failure.
      +
      +
      getSecondaryDatabases() - Method in class com.sleepycat.je.Database
      +
      +
      Returns a list of all SecondaryDatabase objects associated with a primary database.
      +
      +
      getSecondaryDatabases() - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Returns an empty list, since this database is itself a secondary + database.
      +
      +
      getSecondaryIndex(PrimaryIndex<PK, E>, Class<SK>, String) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns a secondary index for a given primary index and secondary key, + opening it if necessary.
      +
      +
      getSecondaryIndex(String, String) - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Opens the secondary index for a given entity class and secondary key + name.
      +
      +
      getSecondaryKey() - Method in exception com.sleepycat.je.SecondaryReferenceException
      +
      +
      Returns the secondary key being accessed during the failure.
      +
      +
      getSecondaryKeys() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns an unmodifiable map of key name (which may be different from + field name) to secondary key metadata for all secondary keys declared in + this class, or null if no secondary keys are declared in this class.
      +
      +
      getSecondaryKeys() - Method in class com.sleepycat.persist.model.EntityMetadata
      +
      +
      Returns an unmodifiable map of key name to secondary key metadata, or + an empty map if no secondary keys are defined for this entity.
      +
      +
      getSecondaryNodes() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns the subset of nodes in the group with replicated environments + that do not participate in elections and cannot become masters.
      +
      +
      getSecPositionOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful secondary DB position operations.
      +
      +
      getSecSearchFailOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of failed secondary DB key search operations.
      +
      +
      getSecSearchOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful secondary DB key search operations.
      +
      +
      getSecUpdateOps() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Number of successful secondary DB update operations.
      +
      +
      getSequence(String) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns a named sequence for using Berkeley DB engine API directly, + opening it if necessary.
      +
      +
      getSequenceConfig(String) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the default Berkeley DB engine API configuration for a named key + sequence.
      +
      +
      getSequenceName() - Method in class com.sleepycat.persist.model.PrimaryKeyMetadata
      +
      +
      Returns the name of the sequence for assigning key values.
      +
      +
      getSerialBufferSize() - Method in class com.sleepycat.bind.serial.SerialBase
      +
      +
      Returns the initial byte size of the output buffer.
      +
      +
      getSerializableIsolation() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns true if the transaction has been explicitly configured to have + serializable (degree 3) isolation.
      +
      +
      getSerialOutput(Object) - Method in class com.sleepycat.bind.serial.SerialBase
      +
      +
      Returns an empty SerialOutput instance that will be used by the serial + binding or key creator.
      +
      +
      getSharedCache() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A convenience method for getting the + EnvironmentConfig.SHARED_CACHE parameter.
      +
      +
      getSharedCacheTotalBytes() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Total amount of the shared JE main cache in use, in bytes."
      +
      +
      getShowProgressInterval() - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Returns the showProgressInterval value, if set.
      +
      +
      getShowProgressInterval() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the showProgressInterval value, if set.
      +
      +
      getShowProgressStream() - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Returns the PrintStream on which the progress messages will be displayed + during long running statistics gathering operations.
      +
      +
      getShowProgressStream() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the PrintStream on which the progress messages will be displayed + during long running verify operations.
      +
      +
      getSize() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns the byte size of the data array.
      +
      +
      getSocketAddress() - Method in class com.sleepycat.je.rep.monitor.NewMasterEvent
      +
      +
      Returns the socket address associated with the new master
      +
      +
      getSocketAddress() - Method in interface com.sleepycat.je.rep.ReplicationNode
      +
      +
      The socket address used by other nodes in the replication group to + communicate with this node.
      +
      +
      getSocketConnectTimeout() - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Returns the socketConnection timeout, in milliseconds, used + when the ping thread attempts to establish a connection with a + replication node.
      +
      +
      getSortedBigDecimalByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a sorted BigDecimal.
      +
      +
      getSortedBigDecimalMaxByteLength(BigDecimal) - Static method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Returns the maximum byte length that would be output for a given BigDecimal value if TupleOutput.writeSortedBigDecimal(java.math.BigDecimal) were + called.
      +
      +
      getSortedDuplicates() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the database is configured to support records with + duplicate keys.
      +
      +
      getSortedPackedIntByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a sorted packed integer.
      +
      +
      getSortedPackedLongByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a sorted packed long integer.
      +
      +
      getSplitBins() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      The number of BINs encountered by the INCompressor that were split + between the time they were put on the compressor queue and when the + compressor ran.
      +
      +
      getState() - Method in class com.sleepycat.je.rep.arbiter.Arbiter
      +
      +
      Gets the Arbiter state.
      +
      +
      getState() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The ReplicatedEnvironment.State of the node.
      +
      +
      getState() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Returns the current state of the node associated with this replication + environment.
      +
      +
      getState() - Method in class com.sleepycat.je.rep.StateChangeEvent
      +
      +
      Returns the state that the node has transitioned to.
      +
      +
      getState() - Method in class com.sleepycat.je.Transaction
      +
      +
      Returns the current state of the transaction.
      +
      +
      getStateChangeListener() - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Returns the listener used to receive asynchronous replication node state + change events.
      +
      +
      getStats(StatsConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Returns database statistics.
      +
      +
      getStats(StatsConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Returns the general database environment statistics.
      +
      +
      getStats(StatsConfig) - Method in class com.sleepycat.je.rep.arbiter.Arbiter
      +
      +
      Gets the Arbiter statistics.
      +
      +
      getStats(StatsConfig) - Method in class com.sleepycat.je.Sequence
      +
      +
      Returns statistical information about the sequence.
      +
      +
      getStats() - Method in class com.sleepycat.persist.evolve.EvolveEvent
      +
      +
      The cumulative statistics gathered during eager evolution.
      +
      +
      getStatsConfig(Object[]) - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      Helper for creating a StatsConfig object to use as an operation + parameter.
      +
      +
      getStatus() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns the PreloadStatus value for the preload() operation.
      +
      +
      getStoreName() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the name of this store.
      +
      +
      getStoreName() - Method in class com.sleepycat.persist.raw.RawStore
      +
      +
      Returns the name of this store.
      +
      +
      getStoreNames(Environment) - Static method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns the names of all entity stores in the given environment.
      +
      +
      getStreamHeader() - Static method in class com.sleepycat.bind.serial.SerialOutput
      +
      +
      Returns the fixed stream header used for all serialized streams in + PROTOCOL_VERSION_2 format.
      +
      +
      getStringByteLength() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Returns the byte length of a null-terminated UTF string in the data + buffer, including the terminator.
      +
      +
      getSubclassIndex(PrimaryIndex<PK, E1>, Class<E2>, Class<SK>, String) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Returns a secondary index for a secondary key in an entity subclass, + opening it if necessary.
      +
      +
      getSuper() - Method in class com.sleepycat.persist.raw.RawObject
      +
      +
      Returns the instance of the superclass, or null if the superclass is + Object or Enum.
      +
      +
      getSuperType() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the type of the superclass, or null if the superclass is Object + or this is not a complex type (in other words, this is a simple type or + an array type).
      +
      +
      getSync() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns true if the transaction is configured to write and synchronously + flush the log it when commits.
      +
      +
      getSyncupProgressListener() - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Return the ProgressListener to be used at this environment startup.
      +
      +
      getSystemLoad() - Method in class com.sleepycat.je.rep.NodeState
      +
      +
      Returns the system load average for the last minute.
      +
      +
      getTemporary() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the temporary database option.
      +
      +
      getTemporary() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the temporary configuration property.
      +
      +
      getterAndSetterMethods - Static variable in class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      getThreadName() - Method in class com.sleepycat.je.ExceptionEvent
      +
      +
      Returns the name of the daemon thread that threw the exception.
      +
      +
      getThreadTransaction() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns the transaction associated with this thread if implied + transactions are being used.
      +
      +
      getTimeout(TimeUnit) - Method in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
      +
      Return the timeout specified when creating this consistency policy.
      +
      +
      getTimeout(TimeUnit) - Method in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
      +
      Always returns 0, no timeout is needed for this policy.
      +
      +
      getTimeout(TimeUnit) - Method in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
      +
      Returns the consistency timeout associated with this policy.
      +
      +
      getTimeout(TimeUnit) - Method in interface com.sleepycat.je.ReplicaConsistencyPolicy
      +
      +
      The timeout associated with the consistency policy.
      +
      +
      getTips() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
       
      +
      getTotalLogSize() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      "Total bytes used by data files on disk: activeLogSize + reservedLogSize."
      +
      +
      getTotalTxnMs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total time in milliseconds spent in replicated transactions.
      +
      +
      getTrackerLagConsistencyWaitMs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total time (in msec) for which a Replica held back a + Environment.beginTransaction(Transaction,TransactionConfig) + operation to satisfy the TimeConsistencyPolicy.
      +
      +
      getTrackerLagConsistencyWaits() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of times a Replica held back a + Environment.beginTransaction(Transaction,TransactionConfig) + operation to satisfy the TimeConsistencyPolicy.
      +
      +
      getTrackerVLSNConsistencyWaitMs() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The total time (in msec) for which a Replica held back a + Environment.beginTransaction(Transaction,TransactionConfig) + operation to satisfy the CommitPointConsistencyPolicy.
      +
      +
      getTrackerVLSNConsistencyWaits() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      The number of times a Replica held back a + Environment.beginTransaction(Transaction,TransactionConfig) + operation to satisfy the CommitPointConsistencyPolicy.
      +
      +
      getTransaction() - Method in class com.sleepycat.collections.CurrentTransaction
      +
      +
      Returns the transaction associated with the current thread for this + environment, or null if no transaction is active.
      +
      +
      getTransaction() - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      getTransactional() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns true if the database open is enclosed within a transaction.
      +
      +
      getTransactional() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Returns true if the database environment is configured for transactions.
      +
      +
      getTransactional() - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Returns the transactional configuration property.
      +
      +
      getTransactionConfig() - Method in class com.sleepycat.collections.TransactionRunner
      +
      + +
      +
      getTransactionStats(StatsConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Returns the database environment's transactional statistics.
      +
      +
      getTransactionTimeout() - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      getTruncationFileNumber() - Method in exception com.sleepycat.je.rep.RollbackProhibitedException
      +
       
      +
      getTruncationFileOffset() - Method in exception com.sleepycat.je.rep.RollbackProhibitedException
      +
      +
      The JE log must be truncated to this offset in the specified + file in order for this node to rejoin the group.
      +
      +
      getTTL() - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Returns the Time-To-Live property for a 'put' operation.
      +
      +
      getTTLUnit() - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Returns the Time-To-Live time unit for a 'put' operation.
      +
      +
      getTupleBufferSize() - Method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Returns the initial byte size of the output buffer.
      +
      +
      getTupleOutput(BigDecimal) - Method in class com.sleepycat.bind.tuple.BigDecimalBinding
      +
       
      +
      getTupleOutput(BigInteger) - Method in class com.sleepycat.bind.tuple.BigIntegerBinding
      +
       
      +
      getTupleOutput(Boolean) - Method in class com.sleepycat.bind.tuple.BooleanBinding
      +
       
      +
      getTupleOutput(Byte) - Method in class com.sleepycat.bind.tuple.ByteBinding
      +
       
      +
      getTupleOutput(Character) - Method in class com.sleepycat.bind.tuple.CharacterBinding
      +
       
      +
      getTupleOutput(Double) - Method in class com.sleepycat.bind.tuple.DoubleBinding
      +
       
      +
      getTupleOutput(Float) - Method in class com.sleepycat.bind.tuple.FloatBinding
      +
       
      +
      getTupleOutput(Integer) - Method in class com.sleepycat.bind.tuple.IntegerBinding
      +
       
      +
      getTupleOutput(Long) - Method in class com.sleepycat.bind.tuple.LongBinding
      +
       
      +
      getTupleOutput(Integer) - Method in class com.sleepycat.bind.tuple.PackedIntegerBinding
      +
       
      +
      getTupleOutput(Long) - Method in class com.sleepycat.bind.tuple.PackedLongBinding
      +
       
      +
      getTupleOutput(Short) - Method in class com.sleepycat.bind.tuple.ShortBinding
      +
       
      +
      getTupleOutput(BigDecimal) - Method in class com.sleepycat.bind.tuple.SortedBigDecimalBinding
      +
       
      +
      getTupleOutput(Double) - Method in class com.sleepycat.bind.tuple.SortedDoubleBinding
      +
       
      +
      getTupleOutput(Float) - Method in class com.sleepycat.bind.tuple.SortedFloatBinding
      +
       
      +
      getTupleOutput(Integer) - Method in class com.sleepycat.bind.tuple.SortedPackedIntegerBinding
      +
       
      +
      getTupleOutput(Long) - Method in class com.sleepycat.bind.tuple.SortedPackedLongBinding
      +
       
      +
      getTupleOutput(String) - Method in class com.sleepycat.bind.tuple.StringBinding
      +
       
      +
      getTupleOutput(E) - Method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Returns an empty TupleOutput instance that will be used by the tuple + binding or key creator.
      +
      +
      getTxnNoSync() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Deprecated. + +
      +
      +
      getTxnSerializableIsolation() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A convenience method for getting + EnvironmentConfig.TXN_SERIALIZABLE_ISOLATION.
      +
      +
      getTxnTimeout(TimeUnit) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A convenience method for getting EnvironmentConfig.TXN_TIMEOUT.
      +
      +
      getTxnTimeout() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. + +
      +
      +
      getTxnTimeout(TimeUnit) - Method in class com.sleepycat.je.Transaction
      +
      +
      Returns the timeout value for the transaction lifetime.
      +
      +
      getTxnWriteNoSync() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Deprecated. + +
      +
      +
      getType() - Method in interface com.sleepycat.je.rep.ReplicationNode
      +
      +
      Returns the type associated with the node.
      +
      +
      getType() - Method in interface com.sleepycat.persist.raw.RawField
      +
      +
      Returns the type of the field, without expanding parameterized types, + or null if the type is an interface type or the Object class.
      +
      +
      getType() - Method in class com.sleepycat.persist.raw.RawObject
      +
      +
      Returns the raw type information for this raw object.
      +
      +
      getUnknownStateTimeout(TimeUnit) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Returns the Unknown state timeout.
      +
      +
      getUpdateTTL() - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Returns the update-TTL property for a 'put' operation.
      +
      +
      getUseExistingConfig() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Return the value of the useExistingConfig property.
      +
      +
      getValue() - Method in class com.sleepycat.collections.MapEntryParameter
      +
      +
      Returns the value of this entry.
      +
      +
      getValue() - Method in class com.sleepycat.je.SequenceStats
      +
      +
      Returns the current cached value of the sequence.
      +
      +
      getValues() - Method in class com.sleepycat.persist.raw.RawObject
      +
      +
      Returns a map of field name to value for a complex type, or null for an + array type or an enum type.
      +
      +
      getVerbose() - Method in class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Gets verbose mode.
      +
      +
      getVerifyDataRecords() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the verifyDataRecords value.
      +
      +
      getVerifySecondaries() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the verifySecondaries value.
      +
      +
      getVersion() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns the version of this persistent class.
      +
      +
      getVersion() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns the class version for this type.
      +
      +
      getVersionString() - Method in class com.sleepycat.je.JEVersion
      +
      +
      Release version, suitable for display.
      +
      +
      getVLSN() - Method in class com.sleepycat.je.CommitToken
      +
       
      +
      getVLSN() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The highest commit VLSN that has been + acknowledged.
      +
      +
      getVLSNRate() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      A moving average of the rate replication data is being generated by the + master, in VLSNs per minute, or 0 if not known or this node is not the + master.
      +
      +
      getWaiterTxnIds() - Method in exception com.sleepycat.je.LockConflictException
      +
      +
      Returns an array of longs containing transaction ids of waiters at the + the time of the timeout.
      +
      +
      getWrap() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns true if the sequence will wrap around when it is incremented + (decremented) past the specified maximum (minimum) value.
      +
      +
      getWriteIntLength(int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be written by PackedInteger.writeInt(byte[], int, int).
      +
      +
      getWriteLongLength(long) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be written by PackedInteger.writeLong(byte[], int, long).
      +
      +
      getWriteNoSync() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Deprecated. + +
      +
      +
      getWrites() - Method in class com.sleepycat.je.rep.arbiter.ArbiterStats
      +
      +
      The number of file writes.
      +
      +
      getWriteSortedIntLength(int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be written by PackedInteger.writeSortedInt(byte[], int, int).
      +
      +
      getWriteSortedLongLength(long) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Returns the number of bytes that would be written by PackedInteger.writeSortedLong(byte[], int, long).
      +
      +
      getZeroTerminatedByteLength(byte[], int) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Returns the byte length of a null terminated UTF string, not including + the terminator.
      +
      +
      GROUP_NAME - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The name for the replication group.
      +
      +
      GroupChangeEvent - Class in com.sleepycat.je.rep.monitor
      +
      +
      The event generated when the group composition changes.
      +
      +
      GroupChangeEvent.GroupChangeType - Enum in com.sleepycat.je.rep.monitor
      +
      +
      The kind of GroupChangeEvent.
      +
      +
      GroupShutdownException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown when an attempt is made to access an environment that was + shutdown by the Master as a result of a call to + ReplicatedEnvironment.shutdownGroup(long, TimeUnit).
      +
      +
      + + + +

      H

      +
      +
      HALT_ON_COMMIT_AFTER_CHECKSUMEXCEPTION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      By default, if a checksum exception is found at the end of the log + during Environment startup, JE will assume the checksum is due to + previously interrupted I/O and will quietly truncate the log and + restart.
      +
      +
      handleException(Exception, int, int) - Method in class com.sleepycat.collections.TransactionRunner
      +
      +
      Handles exceptions that occur during a transaction, and may implement + transaction retry policy.
      +
      +
      hashCode() - Method in class com.sleepycat.collections.MapEntryParameter
      +
      +
      Computes a hash code as specified by Map.Entry.hashCode().
      +
      +
      hashCode() - Method in class com.sleepycat.collections.StoredCollection
      +
       
      +
      hashCode() - Method in class com.sleepycat.collections.StoredMap
      +
       
      +
      hashCode() - Method in class com.sleepycat.je.CommitToken
      +
       
      +
      hashCode() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns a hash code based on the data value.
      +
      +
      hashCode() - Method in class com.sleepycat.je.Durability
      +
       
      +
      hashCode() - Method in class com.sleepycat.je.JEVersion
      +
       
      +
      hashCode() - Method in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
       
      +
      hashCode() - Method in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
       
      +
      hashCode() - Method in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.evolve.Converter
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.evolve.EntityConverter
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.evolve.Mutation
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.evolve.Mutations
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.evolve.Renamer
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.model.EntityMetadata
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.model.FieldMetadata
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.model.PrimaryKeyMetadata
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
       
      +
      hashCode() - Method in class com.sleepycat.persist.raw.RawObject
      +
       
      +
      hasNext() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns true if this iterator has more elements when traversing in the + forward direction.
      +
      +
      hasPrevious() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns true if this iterator has more elements when traversing in the + reverse direction.
      +
      +
      headMap(K) - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns a view of the portion of this sorted set whose keys are + strictly less than toKey.
      +
      +
      headMap(K, boolean) - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns a view of the portion of this sorted map whose elements are + strictly less than toKey, optionally including toKey.
      +
      +
      headSet(Map.Entry<K, V>) - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly less than toMapEntry.
      +
      +
      headSet(Map.Entry<K, V>, boolean) - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly less than toMapEntry, optionally including toMapEntry.
      +
      +
      headSet(K) - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly less than toKey.
      +
      +
      headSet(K, boolean) - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly less than toKey, optionally including toKey.
      +
      +
      headSet(E) - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly less than toValue.
      +
      +
      headSet(E, boolean) - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly less than toValue, optionally including toValue.
      +
      +
      HELPER_HOSTS - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Deprecated. + +
      +
      +
      HELPER_HOSTS - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      The string identifying one or more helper host and port pairs in + this format:
      +
      +
      + + + +

      I

      +
      +
      ignoreMethods - Static variable in class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      IncompatibleClassException - Exception in com.sleepycat.persist.evolve
      +
      +
      A class has been changed incompatibly and no mutation has been configured to + handle the change or a new class version number has not been assigned.
      +
      +
      IncompatibleClassException(String) - Constructor for exception com.sleepycat.persist.evolve.IncompatibleClassException
      +
       
      +
      indexKeyBinding - Variable in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
       
      +
      IndexNotAvailableException - Exception in com.sleepycat.persist
      +
      +
      Thrown by the getPrimaryIndex, getSecondaryIndex and getSubclassIndex when an index has not yet + been created.
      +
      +
      initClassFields() - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      initClassFields() - Method in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      initClassFields() - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      initialize(ClassLoader) - Method in interface com.sleepycat.je.DatabaseComparator
      +
      +
      Called to initialize a comparator object after it is instantiated or + deserialized, and before it is used.
      +
      +
      initialize(EntityModel) - Method in interface com.sleepycat.persist.evolve.Conversion
      +
      +
      Initializes the conversion, allowing it to obtain raw type information + from the entity model.
      +
      +
      initializeProxy(T) - Method in interface com.sleepycat.persist.model.PersistentProxy
      +
      +
      Copies the state of a given proxied class instance to this proxy + instance.
      +
      +
      inputToEntry(TupleInput, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Utility method to set the data in a entry buffer to the data in a tuple + input object.
      +
      +
      INSUFFICIENT_REPLICAS_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The amount of time that a + Environment.beginTransaction(com.sleepycat.je.Transaction, com.sleepycat.je.TransactionConfig) + on the Master will wait for a sufficient number of electable Replicas, + as determined by the default Durability policy, to contact + the Master.
      +
      +
      InsufficientAcksException - Exception in com.sleepycat.je.rep
      +
      +
      + This exception is thrown at the time of a commit in a Master, if the Master + could not obtain transaction commit acknowledgments from its Replicas in + accordance with the Durability.ReplicaAckPolicy currently in effect and within + the requested timeout interval.
      +
      +
      InsufficientLogException - Exception in com.sleepycat.je.rep
      +
      +
      This exception indicates that the log files constituting the Environment are + insufficient and cannot be used as the basis for continuing with the + replication stream provided by the current master.
      +
      +
      InsufficientReplicasException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown by Environment.beginTransaction(com.sleepycat.je.Transaction, com.sleepycat.je.TransactionConfig) and Transaction.commit() when these operations are initiated at a Master which is + not in contact with a quorum of Replicas as determined by the Durability.ReplicaAckPolicy that is in effect for the operation.
      +
      +
      InsufficientReplicasException(Locker, Durability.ReplicaAckPolicy, int, Set<String>) - Constructor for exception com.sleepycat.je.rep.InsufficientReplicasException
      +
      +
      Creates a Commit exception.
      +
      +
      IntegerBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a Integer primitive + wrapper or an int primitive.
      +
      +
      IntegerBinding() - Constructor for class com.sleepycat.bind.tuple.IntegerBinding
      +
       
      +
      intToEntry(int, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.IntegerBinding
      +
      +
      Converts a simple int value into an entry buffer.
      +
      +
      intToEntry(int, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.PackedIntegerBinding
      +
      +
      Converts a simple int value into an entry buffer, using + PackedInteger format.
      +
      +
      intToEntry(int, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedPackedIntegerBinding
      +
      +
      Converts a simple int value into an entry buffer, using + SortedPackedInteger format.
      +
      +
      invoke(String, Object[], String[]) - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      invoke(Environment, String, Object[], String[]) - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Invoke an operation for the given environment.
      +
      +
      invoke(String, Object[], String[]) - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      IOExceptionWrapper - Exception in com.sleepycat.util
      +
      +
      An IOException that can contain nested exceptions.
      +
      +
      IOExceptionWrapper(Throwable) - Constructor for exception com.sleepycat.util.IOExceptionWrapper
      +
       
      +
      isActive() - Method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
       
      +
      isArbiter() - Method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns whether this is the NodeType.ARBITER type.
      +
      +
      isArray() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns whether this is an array type.
      +
      +
      isClosed() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns whether the environment has been closed by the application.
      +
      +
      isCorrupted() - Method in exception com.sleepycat.je.EnvironmentFailureException
      +
      +
      Whether the EnvironmentFailureException indicates that the log is + corrupt, meaning that a network restore (or restore from backup) should + be performed.
      +
      +
      isDataNode() - Method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns whether this type represents a data node, either NodeType.ELECTABLE or NodeType.SECONDARY.
      +
      +
      isDeleted() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns whether this type has been deleted using a class Deleter + mutation.
      +
      +
      isDetached() - Method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
       
      +
      isElectable() - Method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns whether this is the NodeType.ELECTABLE type.
      +
      +
      isEmpty() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns true if this map or collection contains no mappings or elements.
      +
      +
      isEmpty() - Method in class com.sleepycat.persist.evolve.Mutations
      +
      +
      Returns true if no mutations are present.
      +
      +
      isEntityClass() - Method in class com.sleepycat.persist.model.ClassMetadata
      +
      +
      Returns whether this class is an entity class.
      +
      +
      isEnum() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns whether this is an enum type.
      +
      +
      isInternalHandle() - Method in class com.sleepycat.je.Environment
      +
       
      +
      isMaster() - Method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
       
      +
      isMonitor() - Method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns whether this is the NodeType.MONITOR type.
      +
      +
      isOpen() - Method in class com.sleepycat.je.util.LogVerificationReadableByteChannel
      +
      isOpen() - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Returns whether the model is associated with an open store.
      +
      +
      isOrdered() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether keys are ordered in this container.
      +
      +
      isPrimitive() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns whether this type is a Java primitive: char, byte, short, int, + long, float or double.
      +
      +
      isReadModifyWrite() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns whether write-locks will be obtained when reading with this + cursor.
      +
      +
      isReplica() - Method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
       
      +
      isSameRM(XAResource) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      isSecondary() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether this container is a view on a secondary database rather + than directly on a primary database.
      +
      +
      isSecondary() - Method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns whether this is the NodeType.SECONDARY type.
      +
      +
      isSimple() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns whether this is a + simple type: + primitive, primitive wrapper, BigInteger, BigDecimal, String or Date.
      +
      +
      isTransactional() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns whether the databases underlying this container are + transactional.
      +
      +
      isUnknown() - Method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
       
      +
      isUpdate() - Method in class com.sleepycat.je.OperationResult
      +
      +
      Returns whether the operation was an update, for distinguishing inserts + and updates performed by a Put.OVERWRITE operation.
      +
      +
      isValid() - Method in class com.sleepycat.je.Environment
      +
      +
      Returns whether this Environment is open, valid and can be used.
      +
      +
      isValid() - Method in class com.sleepycat.je.Transaction
      +
      +
      Returns whether this Transaction is open, which is equivalent + to when Transaction.getState() returns Transaction.State.OPEN.
      +
      +
      isWriteAllowed() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns true if this is a read-write container or false if this is a + read-only container.
      +
      +
      iterator() - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns an iterator over the elements in this collection.
      +
      +
      iterator(boolean) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Deprecated. +
      Please use StoredCollection.storedIterator() or StoredCollection.storedIterator(boolean) instead. Because the iterator returned must + be closed, the method name iterator is confusing since standard + Java iterators do not need to be closed.
      +
      +
      +
      iterator(Iterator<E>) - Static method in class com.sleepycat.collections.StoredCollections
      +
      +
      Clones an iterator preserving its current position.
      +
      +
      iterator() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
      +
      +
      iterator(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
      +
      +
      iterator() - Method in interface com.sleepycat.persist.ForwardCursor
      +
      +
      Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
      +
      +
      iterator(LockMode) - Method in interface com.sleepycat.persist.ForwardCursor
      +
      +
      Returns an iterator over the key range, starting with the value + following the current position or at the first value if the cursor is + uninitialized.
      +
      +
      + + + +

      J

      +
      +
      JEConnection - Class in com.sleepycat.je.jca.ra
      +
      +
      A JEConnection provides access to JE services.
      +
      +
      JEConnection(JEManagedConnection) - Constructor for class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      JEConnectionFactory - Interface in com.sleepycat.je.jca.ra
      +
      +
      An application may obtain a JEConnection in this manner:
      +
      +
      JEDiagnostics - Class in com.sleepycat.je.jmx
      +
      +
      + JEDiagnostics is a debugging mbean for a non replicated JE Environment.
      +
      +
      JEDiagnostics(Environment) - Constructor for class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      JEDiagnostics() - Constructor for class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      JEException - Exception in com.sleepycat.je.jca.ra
      +
       
      +
      JEException(String) - Constructor for exception com.sleepycat.je.jca.ra.JEException
      +
       
      +
      JEMBean - Class in com.sleepycat.je.jmx
      +
       
      +
      JEMBean(Environment) - Constructor for class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      JEMBean() - Constructor for class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      JEMBeanHelper - Class in com.sleepycat.je.jmx
      +
      +
      Deprecated. +
      As of JE 4, JEMBeanHelper is deprecated in favor of the concrete + MBeans available by default with a JE environment. These MBeans can be + registered and enabled by the environment by setting the following JVM + property: + JEMonitor: + This MBean provides general stats monitoring and access to basic + environment level operations. + + JEMBeanHelper is a utility class for the MBean implementation which wants to + add management of a JE environment to its capabilities. MBean + implementations can contain a JEMBeanHelper instance to get MBean metadata + for JE and to set attributes, get attributes, and invoke operations. +

      + com.sleepycat.je.jmx.JEMonitor and the example program + jmx.JEApplicationMBean are two MBean implementations which provide support + different application use cases. See those classes for examples of how to + use JEMBeanHelper.

      +
      +
      +
      JEMBeanHelper(File, boolean) - Constructor for class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Instantiate a helper, specifying environment home and open capabilities.
      +
      +
      JEMonitor - Class in com.sleepycat.je.jmx
      +
      +
      + JEMonitor is a JMX MBean which makes statistics and basic administrative + operations available.
      +
      +
      JEMonitor(Environment) - Constructor for class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      JEMonitor() - Constructor for class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      jeName - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      JEVersion - Class in com.sleepycat.je
      +
      +
      Berkeley DB Java Edition version information.
      +
      +
      JEVersion(String) - Constructor for class com.sleepycat.je.JEVersion
      +
       
      +
      join(StoredContainer[], Object[], JoinConfig) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns an iterator representing an equality join of the indices and + index key values specified.
      +
      +
      join(Cursor[], JoinConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Creates a specialized join cursor for use in performing equality or + natural joins on secondary indices.
      +
      +
      join(Cursor[], JoinConfig) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      This operation is not allowed on a secondary database.
      +
      +
      JoinConfig - Class in com.sleepycat.je
      +
      +
      The configuration properties of a JoinCursor.
      +
      +
      JoinConfig() - Constructor for class com.sleepycat.je.JoinConfig
      +
      +
      Creates an instance with the system's default settings.
      +
      +
      JoinCursor - Class in com.sleepycat.je
      +
      +
      A specialized join cursor for use in performing equality or natural joins on + secondary indices.
      +
      +
      JoinGroupEvent - Class in com.sleepycat.je.rep.monitor
      +
      +
      The event generated when a node joins the group.
      +
      +
      + + + +

      K

      +
      +
      KeyField - Annotation Type in com.sleepycat.persist.model
      +
      +
      Indicates the sorting position of a key field in a composite key class when + the Comparable interface is not implemented.
      +
      +
      keys() - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing all keys in this index.
      +
      +
      keys(Transaction, CursorConfig) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing all keys in this index.
      +
      +
      keys(K, boolean, K, boolean) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing keys in a key range.
      +
      +
      keys(Transaction, K, boolean, K, boolean, CursorConfig) - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Opens a cursor for traversing keys in a key range.
      +
      +
      keys() - Method in class com.sleepycat.persist.EntityJoin
      +
      +
      Opens a cursor that returns the primary keys of entities qualifying for + the join.
      +
      +
      keys(Transaction, CursorConfig) - Method in class com.sleepycat.persist.EntityJoin
      +
      +
      Opens a cursor that returns the primary keys of entities qualifying for + the join.
      +
      +
      keySet() - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns a set view of the keys contained in this map.
      +
      +
      keysIndex() - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns a read-only keys index that maps secondary key to primary key.
      +
      +
      + + + +

      L

      +
      +
      last() - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns the last (highest) element currently in this sorted set.
      +
      +
      last() - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns the last (highest) element currently in this sorted set.
      +
      +
      last() - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns the last (highest) element currently in this sorted set.
      +
      +
      last() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the last value and returns it, or returns null if + the cursor range is empty.
      +
      +
      last(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the last value and returns it, or returns null if + the cursor range is empty.
      +
      +
      lastKey() - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns the last (highest) element currently in this sorted map.
      +
      +
      LeaveGroupEvent - Class in com.sleepycat.je.rep.monitor
      +
      +
      The event generated when a node leaves the group.
      +
      +
      LeaveGroupEvent.LeaveReason - Enum in com.sleepycat.je.rep.monitor
      +
      +
      The reason for why the node leaves the group.
      +
      +
      len - Variable in class com.sleepycat.util.FastInputStream
      +
       
      +
      load() - Method in class com.sleepycat.je.util.DbLoad
      +
       
      +
      LOCK_DEADLOCK_DETECT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Whether to perform deadlock detection when a lock conflict occurs.
      +
      +
      LOCK_DEADLOCK_DETECT_DELAY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The delay after a lock conflict, before performing deadlock detection.
      +
      +
      LOCK_N_LOCK_TABLES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Number of Lock Tables.
      +
      +
      LOCK_OLD_LOCK_EXCEPTIONS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      since JE 6.5; has no effect, as if it were set to false.
      +
      +
      +
      LOCK_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the default lock timeout.
      +
      +
      LockConflictException - Exception in com.sleepycat.je
      +
      +
      The common base class for all exceptions that result from record lock + conflicts during read and write operations.
      +
      +
      LockMode - Enum in com.sleepycat.je
      +
      +
      Record lock modes for read operations.
      +
      +
      LockNotAvailableException - Exception in com.sleepycat.je
      +
      +
      Thrown when a non-blocking operation fails to get a lock.
      +
      +
      LockNotGrantedException - Exception in com.sleepycat.je
      +
      +
      Deprecated. + +
      +
      +
      LockPreemptedException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown when a lock has been "stolen", or preempted, from a transaction in a + replicated environment.
      +
      +
      LockStats - Class in com.sleepycat.je
      +
      +
      Deprecated. +
      as of 4.0.10, replaced by Environment.getStats(StatsConfig).

      +
      +
      +
      LockTimeoutException - Exception in com.sleepycat.je
      +
      +
      Thrown when multiple threads are competing for a lock and the lock timeout + interval is exceeded for the current operation.
      +
      +
      LOG_BUFFER_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum starting size of a JE log buffer.
      +
      +
      LOG_CHECKSUM_READ - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, perform a checksum check when reading entries from log.
      +
      +
      LOG_CHUNKED_NIO - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      NIO is no longer used by JE and this parameter has no + effect.
      +
      +
      +
      LOG_DETECT_FILE_DELETE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, periodically detect unexpected file deletions.
      +
      +
      LOG_DETECT_FILE_DELETE_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The interval used to check for unexpected file deletions.
      +
      +
      LOG_DIRECT_NIO - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      NIO is no longer used by JE and this parameter has no + effect.
      +
      +
      +
      LOG_FAULT_READ_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The buffer size for faulting in objects from disk, in bytes.
      +
      +
      LOG_FILE_CACHE_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The size of the file handle cache.
      +
      +
      LOG_FILE_MAX - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum size of each individual JE log file, in bytes.
      +
      +
      LOG_FLUSH_NO_SYNC_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum time interval between committing a transaction with + NO_SYNC durability, and + making the transaction durable with respect to the file system.
      +
      +
      LOG_FLUSH_SYNC_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum time interval between committing a transaction with + NO_SYNC or WRITE_NO_SYNC durability, + and making the transaction durable with respect to the storage device.
      +
      +
      LOG_FLUSH_TASK_INTERVAL - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Deprecated. +
      as of 7.2. Replaced by EnvironmentConfig.LOG_FLUSH_SYNC_INTERVAL. For compatibility with + earlier releases, if this parameter is specified its value will be used + as the flush sync interval; in this case, EnvironmentConfig.LOG_FLUSH_SYNC_INTERVAL may not also be specified.
      +
      +
      +
      LOG_FSYNC_TIME_LIMIT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If the time taken by an fsync exceeds this limit, a WARNING level + message is logged.
      +
      +
      LOG_FSYNC_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The timeout limit for group file sync, in microseconds.
      +
      +
      LOG_GROUP_COMMIT_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The time interval in nanoseconds during which transactions may be + grouped to amortize the cost of write and/or fsync when a transaction + commits with SyncPolicy#SYNC or SyncPolicy#WRITE_NO_SYNC on the local + machine.
      +
      +
      LOG_GROUP_COMMIT_THRESHOLD - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The threshold value impacts the number of transactions that may be + grouped to amortize the cost of write and/or fsync when a + transaction commits with SyncPolicy#SYNC or SyncPolicy#WRITE_NO_SYNC + on the local machine.
      +
      +
      LOG_ITERATOR_MAX_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum read buffer size for log iterators, which are used when + scanning the log during activities like log cleaning and environment + open, in bytes.
      +
      +
      LOG_ITERATOR_READ_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The read buffer size for log iterators, which are used when scanning the + log during activities like log cleaning and environment open, in bytes.
      +
      +
      LOG_MEM_ONLY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, operates in an in-memory test mode without flushing the log to + disk.
      +
      +
      LOG_N_DATA_DIRECTORIES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      as of 7.3. This feature is not known to provide benefits + beyond that of a simple RAID configuration, and will be removed in the + next release, which is slated for mid-April, 2017.
      +
      +
      +
      LOG_NUM_BUFFERS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of JE log buffers.
      +
      +
      LOG_TOTAL_BUFFER_BYTES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The total memory taken by log buffers, in bytes.
      +
      +
      LOG_USE_NIO - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      NIO is no longer used by JE and this parameter has no + effect.
      +
      +
      +
      LOG_USE_ODSYNC - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true (default is false) O_DSYNC is used to open JE log files.
      +
      +
      LOG_USE_WRITE_QUEUE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true (default is true) the Write Queue is used for file I/O + operations which are blocked by concurrent I/O operations.
      +
      +
      LOG_VERIFY_CHECKSUMS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, perform a checksum verification just before and after writing + to the log.
      +
      +
      LOG_WRITE_QUEUE_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The size of the Write Queue.
      +
      +
      LogOverwriteException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown when one or more log files are modified (overwritten) as the result + of a replication operation.
      +
      +
      LogVerificationException - Exception in com.sleepycat.je.util
      +
      +
      Thrown during log verification if a checksum cannot be verified or a log + entry is determined to be invalid by examining its contents.
      +
      +
      LogVerificationException(String) - Constructor for exception com.sleepycat.je.util.LogVerificationException
      +
       
      +
      LogVerificationException(String, Throwable) - Constructor for exception com.sleepycat.je.util.LogVerificationException
      +
       
      +
      LogVerificationInputStream - Class in com.sleepycat.je.util
      +
      +
      Verifies the checksums in an InputStream for a log file in a JE + Environment.
      +
      +
      LogVerificationInputStream(Environment, InputStream, String) - Constructor for class com.sleepycat.je.util.LogVerificationInputStream
      +
      +
      Creates a verification input stream.
      +
      +
      LogVerificationReadableByteChannel - Class in com.sleepycat.je.util
      +
      +
      Verifies the checksums in a ReadableByteChannel for a log file in a + JE Environment.
      +
      +
      LogVerificationReadableByteChannel(Environment, ReadableByteChannel, String) - Constructor for class com.sleepycat.je.util.LogVerificationReadableByteChannel
      +
      +
      Creates a verification input stream.
      +
      +
      LogWriteException - Exception in com.sleepycat.je
      +
      +
      Thrown when an IOException or other failure occurs when writing to + the JE log.
      +
      +
      LongBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a Long primitive + wrapper or a long primitive.
      +
      +
      LongBinding() - Constructor for class com.sleepycat.bind.tuple.LongBinding
      +
       
      +
      longToEntry(long, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.LongBinding
      +
      +
      Converts a simple long value into an entry buffer.
      +
      +
      longToEntry(long, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.PackedLongBinding
      +
      +
      Converts a simple Long value into an entry buffer, using + PackedLong format.
      +
      +
      longToEntry(long, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.SortedPackedLongBinding
      +
      +
      Converts a simple Long value into an entry buffer, using + SortedPackedLong format.
      +
      +
      + + + +

      M

      +
      +
      main(String[]) - Static method in class com.sleepycat.je.rep.util.DbEnableReplication
      +
      +
      Usage:
      +
      +
      main(String...) - Static method in class com.sleepycat.je.rep.util.DbGroupAdmin
      +
      +
      Usage:
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.rep.util.DbPing
      +
      +
      Usage:
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.rep.util.DbResetRepGroup
      +
      +
      Usage:
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbCacheSize
      +
      +
      Runs DbCacheSize as a command line utility.
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbDeleteReservedFiles
      +
       
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbDump
      +
      +
      The main used by the DbDump utility.
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbFilterStats
      +
      +
      The main used by the DbFilterStats utility.
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbLoad
      +
      +
      The main used by the DbLoad utility.
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbPrintLog
      +
      +
      The main used by the DbPrintLog utility.
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbSpace
      +
       
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbStat
      +
       
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbTruncateLog
      +
      +
      Usage:
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbVerify
      +
      +
      The main used by the DbVerify utility.
      +
      +
      main(String[]) - Static method in class com.sleepycat.je.util.DbVerifyLog
      +
       
      +
      main(String[]) - Static method in class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Enhances classes in the directories specified.
      +
      +
      makeSpace(int) - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Ensure that at least the given number of bytes are available in the + internal buffer.
      +
      +
      map() - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Returns a standard Java map based on this entity index.
      +
      +
      map() - Method in class com.sleepycat.persist.PrimaryIndex
      +
       
      +
      map() - Method in class com.sleepycat.persist.SecondaryIndex
      +
       
      +
      MapEntryParameter<K,V> - Class in com.sleepycat.collections
      +
      +
      A simple Map.Entry implementation that can be used as in + input parameter.
      +
      +
      MapEntryParameter(K, V) - Constructor for class com.sleepycat.collections.MapEntryParameter
      +
      +
      Creates a map entry with a given key and value.
      +
      +
      mark - Variable in class com.sleepycat.util.FastInputStream
      +
       
      +
      mark(int) - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      markSupported() - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      marshalEntry(TupleOutput) - Method in interface com.sleepycat.bind.tuple.MarshalledTupleEntry
      +
      +
      Construct the key or data tuple entry from the key or data object.
      +
      +
      MarshalledTupleEntry - Interface in com.sleepycat.bind.tuple
      +
      +
      A marshalling interface implemented by key, data or entity classes that + are represented as tuples.
      +
      +
      MarshalledTupleKeyEntity - Interface in com.sleepycat.bind.tuple
      +
      +
      A marshalling interface implemented by entity classes that represent keys as + tuples.
      +
      +
      marshalPrimaryKey(TupleOutput) - Method in interface com.sleepycat.bind.tuple.MarshalledTupleKeyEntity
      +
      +
      Extracts the entity's primary key and writes it to the key output.
      +
      +
      marshalSecondaryKey(String, TupleOutput) - Method in interface com.sleepycat.bind.tuple.MarshalledTupleKeyEntity
      +
      +
      Extracts the entity's secondary key and writes it to the key output.
      +
      +
      MasterReplicaTransitionException - Exception in com.sleepycat.je.rep
      +
      +
      Deprecated. +
      as of JE 5.0.88 because the environment no longer needs to + restart when transitioning from master to replica.
      +
      +
      +
      MasterReplicaTransitionException(EnvironmentImpl, Exception) - Constructor for exception com.sleepycat.je.rep.MasterReplicaTransitionException
      +
      +
      Deprecated.
      +
      MasterStateException - Exception in com.sleepycat.je.rep
      +
      +
      This exception indicates that the application attempted an operation that is + not permitted when it is in the ReplicatedEnvironment.State.MASTER + state.
      +
      +
      MasterTransferFailureException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown by ReplicatedEnvironment.transferMaster(java.util.Set<java.lang.String>, int, java.util.concurrent.TimeUnit) if a Master Transfer + operation cannot be completed within the allotted time.
      +
      +
      MAX_CLOCK_DELTA - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the maximum acceptable clock skew between this Replica and its + Feeder, which is the node that is the source of its replication stream.
      +
      +
      MAX_DISK - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      An upper limit on the number of bytes used for data storage.
      +
      +
      MAX_LENGTH - Static variable in class com.sleepycat.util.PackedInteger
      +
      +
      The maximum number of bytes needed to store an int value (5).
      +
      +
      MAX_LONG_LENGTH - Static variable in class com.sleepycat.util.PackedInteger
      +
      +
      The maximum number of bytes needed to store a long value (9).
      +
      +
      MAX_MEMORY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the JE main cache size in bytes.
      +
      +
      MAX_MEMORY_PERCENT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the JE main cache size as a percentage of the JVM maximum + memory.
      +
      +
      MAX_MESSAGE_SIZE - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The maximum message size which will be accepted by a node (to prevent + DOS attacks).
      +
      +
      MAX_OFF_HEAP_MEMORY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the number of bytes to be used as a secondary, off-heap cache.
      +
      +
      MemberChangeEvent - Class in com.sleepycat.je.rep.monitor
      +
      +
      MemberChangeEvent is the base class for all member status changed events.
      +
      +
      MemberNotFoundException - Exception in com.sleepycat.je.rep
      +
      +
      Thrown when an operation requires a replication group member and that member + is not present in the replication group.
      +
      +
      minAckNodes(int) - Method in enum com.sleepycat.je.Durability.ReplicaAckPolicy
      +
      +
      Returns the minimum number of ELECTABLE replicas required to + implement the ReplicaAckPolicy for a given replication group size.
      +
      +
      Monitor - Class in com.sleepycat.je.rep.monitor
      +
      +
      Provides a lightweight mechanism to track the current master node and the + members of the replication group.
      +
      +
      Monitor(ReplicationConfig) - Constructor for class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Deprecated. +
      As of JE 5, replaced by + Monitor.Monitor(MonitorConfig)
      +
      +
      +
      Monitor(MonitorConfig) - Constructor for class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Creates a monitor instance.
      +
      +
      MonitorChangeEvent - Class in com.sleepycat.je.rep.monitor
      +
      +
      MonitorChangeEvent is the base class for all Monitor events.
      +
      +
      MonitorChangeListener - Interface in com.sleepycat.je.rep.monitor
      +
      +
      Applications can register for Monitor event notification through + Monitor.startListener(com.sleepycat.je.rep.monitor.MonitorChangeListener).
      +
      +
      MonitorConfig - Class in com.sleepycat.je.rep.monitor
      +
      +
      Specifies the attributes used by a replication Monitor.
      +
      +
      MonitorConfig() - Constructor for class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      An instance created using the default constructor is initialized with + the default settings.
      +
      +
      MonitorConfigBeanInfo - Class in com.sleepycat.je.rep.monitor
      +
       
      +
      MonitorConfigBeanInfo() - Constructor for class com.sleepycat.je.rep.monitor.MonitorConfigBeanInfo
      +
       
      +
      Mutation - Class in com.sleepycat.persist.evolve
      +
      +
      The base class for all mutations.
      +
      +
      Mutations - Class in com.sleepycat.persist.evolve
      +
      +
      A collection of mutations for configuring class evolution.
      +
      +
      Mutations() - Constructor for class com.sleepycat.persist.evolve.Mutations
      +
      +
      Creates an empty set of mutations.
      +
      +
      + + + +

      N

      +
      +
      NAME - Static variable in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
      +
      The name:"CommitPointConsistencyPolicy" associated with this policy.
      +
      +
      NAME - Static variable in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
      +
      The name:"NoConsistencyRequiredPolicy" associated with this policy.
      +
      +
      NAME - Static variable in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
      +
      The name:"TimeConsistencyPolicy" associated with this policy.
      +
      +
      NetworkRestore - Class in com.sleepycat.je.rep
      +
      +
      Obtains log files for a Replica from other members of the replication + group.
      +
      +
      NetworkRestore() - Constructor for class com.sleepycat.je.rep.NetworkRestore
      +
      +
      Creates an instance of NetworkRestore suitable for restoring the logs at + this node.
      +
      +
      NetworkRestoreConfig - Class in com.sleepycat.je.rep
      +
      +
      NetworkRestoreConfig defines the configuration parameters used to configure + a NetworkRestore operation.
      +
      +
      NetworkRestoreConfig() - Constructor for class com.sleepycat.je.rep.NetworkRestoreConfig
      +
       
      +
      newMap(Database, Class<K>, Class<V>, boolean) - Method in class com.sleepycat.collections.TupleSerialFactory
      +
      +
      Creates a map from a previously opened Database object.
      +
      +
      NewMasterEvent - Class in com.sleepycat.je.rep.monitor
      +
      +
      The event generated upon detecting a new Master.
      +
      +
      newOutput() - Static method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Deprecated. + +
      +
      +
      newOutput(byte[]) - Static method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Deprecated. + +
      +
      +
      newSortedMap(Database, Class<K>, Class<V>, boolean) - Method in class com.sleepycat.collections.TupleSerialFactory
      +
      +
      Creates a sorted map from a previously opened Database object.
      +
      +
      next() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns the next element in the iteration.
      +
      +
      next() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
      +
      +
      next(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
      +
      +
      next() - Method in interface com.sleepycat.persist.ForwardCursor
      +
      +
      Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
      +
      +
      next(LockMode) - Method in interface com.sleepycat.persist.ForwardCursor
      +
      +
      Moves the cursor to the next value and returns it, or returns null + if there are no more values in the cursor range.
      +
      +
      nextDup() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the next value with the same key (duplicate) and + returns it, or returns null if no more values are present for the key at + the current position.
      +
      +
      nextDup(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the next value with the same key (duplicate) and + returns it, or returns null if no more values are present for the key at + the current position.
      +
      +
      nextIndex() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns the index of the element that would be returned by a subsequent + call to next.
      +
      +
      nextNoDup() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the next value with a different key and returns it, + or returns null if there are no more unique keys in the cursor range.
      +
      +
      nextNoDup(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the next value with a different key and returns it, + or returns null if there are no more unique keys in the cursor range.
      +
      +
      NO_CONSISTENCY - Static variable in class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
      +
      Convenience instance.
      +
      +
      NoConsistencyRequiredPolicy - Class in com.sleepycat.je.rep
      +
      +
      A consistency policy that lets a transaction on a replica using this policy + proceed regardless of the state of the Replica relative to the Master.
      +
      +
      NoConsistencyRequiredPolicy() - Constructor for class com.sleepycat.je.rep.NoConsistencyRequiredPolicy
      +
      +
      Create a NoConsistencyRequiredPolicy.
      +
      +
      NODE_DUP_TREE_MAX_ENTRIES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      this property no longer has any effect; DatabaseConfig.setNodeMaxEntries(int) should be used instead.
      +
      +
      +
      NODE_HOST_PORT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Names the hostname and port associated with this node in the + replication group, e.g.
      +
      +
      NODE_MAX_ENTRIES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum number of entries in an internal btree node.
      +
      +
      NODE_NAME - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The node name uniquely identifies this node within the replication + group.
      +
      +
      NODE_PRIORITY - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      The election priority associated with this node.
      +
      +
      NODE_TYPE - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The type of this node.
      +
      +
      NodeState - Class in com.sleepycat.je.rep
      +
      +
      The current state of a replication node and the application this node is + running in.
      +
      +
      NodeType - Enum in com.sleepycat.je.rep
      +
      +
      The different types of nodes that can be in a replication group.
      +
      +
      notify(NewMasterEvent) - Method in interface com.sleepycat.je.rep.monitor.MonitorChangeListener
      +
      +
      The method is invoked whenever there is new master associated with the + replication group.
      +
      +
      notify(GroupChangeEvent) - Method in interface com.sleepycat.je.rep.monitor.MonitorChangeListener
      +
      +
      The method is invoked whenever there is a change in the composition of + the replication group.
      +
      +
      notify(JoinGroupEvent) - Method in interface com.sleepycat.je.rep.monitor.MonitorChangeListener
      +
      +
      The method is invoked whenever a node joins the group, by successfully + opening its first + ReplicatedEnvironment handle.
      +
      +
      notify(LeaveGroupEvent) - Method in interface com.sleepycat.je.rep.monitor.MonitorChangeListener
      +
      +
      The method is invoked whenever a node leaves the group by closing its + last ReplicatedEnvironment handle.
      +
      +
      NotPersistent - Annotation Type in com.sleepycat.persist.model
      +
      +
      Overrides the default rules for field persistence and defines a field as + being non-persistent even when it is not declared with the + transient keyword.
      +
      +
      NotTransient - Annotation Type in com.sleepycat.persist.model
      +
      +
      Overrides the default rules for field persistence and defines a field as + being persistent even when it is declared with the transient + keyword.
      +
      +
      nullifyForeignKey(SecondaryDatabase, DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
       
      +
      nullifyForeignKey(D) - Method in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
      +
      Clears the index key in a data object.
      +
      +
      nullifyForeignKey(SecondaryDatabase, DatabaseEntry) - Method in class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
       
      +
      nullifyForeignKey(D) - Method in class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
      +
      Clears the index key in the deserialized data entry.
      +
      +
      nullifyForeignKey(D) - Method in class com.sleepycat.bind.serial.TupleSerialMarshalledKeyCreator
      +
       
      +
      nullifyForeignKey(String) - Method in interface com.sleepycat.bind.tuple.MarshalledTupleKeyEntity
      +
      +
      Clears the entity's secondary key fields for the given key name.
      +
      +
      nullifyForeignKey(SecondaryDatabase, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleTupleKeyCreator
      +
       
      +
      nullifyForeignKey(TupleInput, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleKeyCreator
      +
      +
      Clears the index key in the tuple data entry.
      +
      +
      nullifyForeignKey(TupleInput, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleMarshalledKeyCreator
      +
       
      +
      nullifyForeignKey(SecondaryDatabase, DatabaseEntry) - Method in interface com.sleepycat.je.ForeignKeyNullifier
      +
      +
      Sets the foreign key reference to null in the datum of the primary + database.
      +
      +
      nullifyForeignKey(SecondaryDatabase, DatabaseEntry, DatabaseEntry, DatabaseEntry) - Method in interface com.sleepycat.je.ForeignMultiKeyNullifier
      +
      +
      Sets the foreign key reference to null in the datum of the primary + database.
      +
      +
      + + + +

      O

      +
      +
      objectToData(E, DatabaseEntry) - Method in interface com.sleepycat.bind.EntityBinding
      +
      +
      Extracts the data entry from an entity Object.
      +
      +
      objectToData(E, DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialSerialBinding
      +
       
      +
      objectToData(E) - Method in class com.sleepycat.bind.serial.SerialSerialBinding
      +
      +
      Extracts a data object from an entity object.
      +
      +
      objectToData(E, DatabaseEntry) - Method in class com.sleepycat.bind.serial.TupleSerialBinding
      +
       
      +
      objectToData(E) - Method in class com.sleepycat.bind.serial.TupleSerialBinding
      +
      +
      Extracts a data object from an entity object.
      +
      +
      objectToData(E) - Method in class com.sleepycat.bind.serial.TupleSerialMarshalledBinding
      +
       
      +
      objectToData(E, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleTupleBinding
      +
       
      +
      objectToData(E, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleBinding
      +
      +
      Extracts a key tuple from an entity object.
      +
      +
      objectToData(E, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleMarshalledBinding
      +
       
      +
      objectToEntry(byte[], DatabaseEntry) - Method in class com.sleepycat.bind.ByteArrayBinding
      +
       
      +
      objectToEntry(E, DatabaseEntry) - Method in interface com.sleepycat.bind.EntryBinding
      +
      +
      Converts an Object into a entry buffer.
      +
      +
      objectToEntry(E, DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialBinding
      +
      +
      Serialize an object into an entry buffer.
      +
      +
      objectToEntry(BigDecimal, TupleOutput) - Method in class com.sleepycat.bind.tuple.BigDecimalBinding
      +
       
      +
      objectToEntry(BigInteger, TupleOutput) - Method in class com.sleepycat.bind.tuple.BigIntegerBinding
      +
       
      +
      objectToEntry(Boolean, TupleOutput) - Method in class com.sleepycat.bind.tuple.BooleanBinding
      +
       
      +
      objectToEntry(Byte, TupleOutput) - Method in class com.sleepycat.bind.tuple.ByteBinding
      +
       
      +
      objectToEntry(Character, TupleOutput) - Method in class com.sleepycat.bind.tuple.CharacterBinding
      +
       
      +
      objectToEntry(Double, TupleOutput) - Method in class com.sleepycat.bind.tuple.DoubleBinding
      +
       
      +
      objectToEntry(Float, TupleOutput) - Method in class com.sleepycat.bind.tuple.FloatBinding
      +
       
      +
      objectToEntry(Integer, TupleOutput) - Method in class com.sleepycat.bind.tuple.IntegerBinding
      +
       
      +
      objectToEntry(Long, TupleOutput) - Method in class com.sleepycat.bind.tuple.LongBinding
      +
       
      +
      objectToEntry(Integer, TupleOutput) - Method in class com.sleepycat.bind.tuple.PackedIntegerBinding
      +
       
      +
      objectToEntry(Long, TupleOutput) - Method in class com.sleepycat.bind.tuple.PackedLongBinding
      +
       
      +
      objectToEntry(Short, TupleOutput) - Method in class com.sleepycat.bind.tuple.ShortBinding
      +
       
      +
      objectToEntry(BigDecimal, TupleOutput) - Method in class com.sleepycat.bind.tuple.SortedBigDecimalBinding
      +
       
      +
      objectToEntry(Double, TupleOutput) - Method in class com.sleepycat.bind.tuple.SortedDoubleBinding
      +
       
      +
      objectToEntry(Float, TupleOutput) - Method in class com.sleepycat.bind.tuple.SortedFloatBinding
      +
       
      +
      objectToEntry(Integer, TupleOutput) - Method in class com.sleepycat.bind.tuple.SortedPackedIntegerBinding
      +
       
      +
      objectToEntry(Long, TupleOutput) - Method in class com.sleepycat.bind.tuple.SortedPackedLongBinding
      +
       
      +
      objectToEntry(String, TupleOutput) - Method in class com.sleepycat.bind.tuple.StringBinding
      +
       
      +
      objectToEntry(E, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleBinding
      +
       
      +
      objectToEntry(E, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleBinding
      +
      +
      Converts a key or data object to a tuple entry.
      +
      +
      objectToEntry(TupleInput, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleInputBinding
      +
       
      +
      objectToEntry(E, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleMarshalledBinding
      +
       
      +
      objectToKey(E, DatabaseEntry) - Method in interface com.sleepycat.bind.EntityBinding
      +
      +
      Extracts the key entry from an entity Object.
      +
      +
      objectToKey(E, DatabaseEntry) - Method in class com.sleepycat.bind.serial.SerialSerialBinding
      +
       
      +
      objectToKey(E) - Method in class com.sleepycat.bind.serial.SerialSerialBinding
      +
      +
      Extracts a key object from an entity object.
      +
      +
      objectToKey(E, DatabaseEntry) - Method in class com.sleepycat.bind.serial.TupleSerialBinding
      +
       
      +
      objectToKey(E, TupleOutput) - Method in class com.sleepycat.bind.serial.TupleSerialBinding
      +
      +
      Extracts a key tuple from an entity object.
      +
      +
      objectToKey(E, TupleOutput) - Method in class com.sleepycat.bind.serial.TupleSerialMarshalledBinding
      +
       
      +
      objectToKey(E, DatabaseEntry) - Method in class com.sleepycat.bind.tuple.TupleTupleBinding
      +
       
      +
      objectToKey(E, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleBinding
      +
      +
      Extracts a key tuple from an entity object.
      +
      +
      objectToKey(E, TupleOutput) - Method in class com.sleepycat.bind.tuple.TupleTupleMarshalledBinding
      +
       
      +
      off - Variable in class com.sleepycat.util.FastInputStream
      +
       
      +
      OFFHEAP_CHECKSUM - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Can be used to add a checksum to each off-heap block when the block is + written, and validate the checksum when the block is read, for debugging + purposes.
      +
      +
      OFFHEAP_CORE_THREADS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The minimum number of threads in the off-heap eviction thread pool.
      +
      +
      OFFHEAP_EVICT_BYTES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The off-heap evictor will attempt to keep memory usage this number of + bytes below EnvironmentConfig.MAX_OFF_HEAP_MEMORY.
      +
      +
      OFFHEAP_KEEP_ALIVE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The duration that excess threads in the off-heap eviction thread pool + will stay idle; after this period, idle threads will terminate.
      +
      +
      OFFHEAP_MAX_THREADS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum number of threads in the off-heap eviction thread pool.
      +
      +
      OFFHEAP_N_LRU_LISTS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of LRU lists in the off-heap JE cache.
      +
      +
      OP_RESET_LOGGING - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      OP_RESET_LOGGING_LEVEL - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      openCursor(Transaction, CursorConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Returns a cursor into the database.
      +
      +
      openCursor(DiskOrderedCursorConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Create a DiskOrderedCursor to iterate over the records in 'this' + Database.
      +
      +
      openCursor(Transaction, CursorConfig) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      Obtain a cursor on a database, returning a SecondaryCursor.
      +
      +
      openDatabase(Transaction, String, DatabaseConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Opens, and optionally creates, a Database.
      +
      +
      openDatabase(String, DatabaseConfig) - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      openDiskOrderedCursor(Database[], DiskOrderedCursorConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Create a DiskOrderedCursor to iterate over the records of a given set + of databases.
      +
      +
      openEnv(boolean) - Method in class com.sleepycat.je.util.DbDump
      +
       
      +
      openSecondaryCursor(Transaction, CursorConfig) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      + +
      +
      openSecondaryDatabase(Transaction, String, Database, SecondaryConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Opens and optionally creates a SecondaryDatabase.
      +
      +
      openSecondaryDatabase(String, Database, SecondaryConfig) - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      openSequence(Transaction, DatabaseEntry, SequenceConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Opens a sequence in the database.
      +
      +
      OperationFailureException - Exception in com.sleepycat.je
      +
      +
      Indicates that a failure has occurred that impacts the current operation + and/or transaction.
      +
      +
      operationList - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      OperationResult - Class in com.sleepycat.je
      +
      +
      The result of an operation that successfully reads or writes a record.
      +
      +
      OperationStatus - Enum in com.sleepycat.je
      +
      +
      Status values from database operations.
      +
      +
      outputDirectory - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      outputFile - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      outputToEntry(TupleOutput, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Utility method to set the data in a entry buffer to the data in a tuple + output object.
      +
      +
      + + + +

      P

      +
      +
      PackedInteger - Class in com.sleepycat.util
      +
      +
      Static methods for reading and writing packed integers.
      +
      +
      PackedInteger() - Constructor for class com.sleepycat.util.PackedInteger
      +
       
      +
      PackedIntegerBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for an unsorted Integer + primitive wrapper or an unsorted int primitive, that stores the + value in the smallest number of bytes possible.
      +
      +
      PackedIntegerBinding() - Constructor for class com.sleepycat.bind.tuple.PackedIntegerBinding
      +
       
      +
      PackedLongBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for an unsorted Long + primitive wrapper or an unsorted long primitive, that stores + the value in the smallest number of bytes possible.
      +
      +
      PackedLongBinding() - Constructor for class com.sleepycat.bind.tuple.PackedLongBinding
      +
       
      +
      parse(String) - Static method in class com.sleepycat.je.Durability
      +
      +
      Parses the string and returns the durability it represents.
      +
      +
      parseArgs(String[]) - Method in class com.sleepycat.je.util.DbDump
      +
       
      +
      PartialComparator - Interface in com.sleepycat.je
      +
      +
      A tag interface used to mark a B-tree or duplicate comparator class as a + partial comparator.
      +
      +
      Persistent - Annotation Type in com.sleepycat.persist.model
      +
      +
      Identifies a persistent class that is not an Entity class or a + simple type.
      +
      +
      PersistentProxy<T> - Interface in com.sleepycat.persist.model
      +
      +
      Implemented by a proxy class to represent the persistent state of a + (non-persistent) proxied class.
      +
      +
      preload(long) - Method in class com.sleepycat.je.Database
      +
      +
      Deprecated. +
      As of JE 2.0.83, replaced by Database.preload(PreloadConfig).

      +
      +
      +
      preload(long, long) - Method in class com.sleepycat.je.Database
      +
      +
      Deprecated. +
      As of JE 2.0.101, replaced by Database.preload(PreloadConfig).

      +
      +
      +
      preload(PreloadConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Preloads the cache.
      +
      +
      preload(Database[], PreloadConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Preloads the cache with multiple databases.
      +
      +
      PreloadConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of an application invoked preload operation.
      +
      +
      PreloadConfig() - Constructor for class com.sleepycat.je.PreloadConfig
      +
      +
      Default configuration used if null is passed to Database.preload.
      +
      +
      PreloadConfig.Phases - Enum in com.sleepycat.je
      +
      +
      Preload progress listeners report this phase value, along with a + count of the number if times that the preload has fetched from disk.
      +
      +
      PreloadStats - Class in com.sleepycat.je
      +
      + +
      +
      PreloadStatus - Class in com.sleepycat.je
      +
      +
      Describes the result of the Database.preload operation.
      +
      +
      PreloadStatus(String) - Constructor for class com.sleepycat.je.PreloadStatus
      +
       
      +
      premain(String, Instrumentation) - Static method in class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Enhances classes as specified by a JVM -javaagent argument.
      +
      +
      prepare(Xid) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      prev() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the previous value and returns it, or returns null + if there are no preceding values in the cursor range.
      +
      +
      prev(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the previous value and returns it, or returns null + if there are no preceding values in the cursor range.
      +
      +
      prevDup() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the previous value with the same key (duplicate) and + returns it, or returns null if no preceding values are present for the + key at the current position.
      +
      +
      prevDup(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the previous value with the same key (duplicate) and + returns it, or returns null if no preceding values are present for the + key at the current position.
      +
      +
      previous() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns the next element in the iteration.
      +
      +
      previousIndex() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Returns the index of the element that would be returned by a subsequent + call to previous.
      +
      +
      prevNoDup() - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the preceding value with a different key and returns + it, or returns null if there are no preceding unique keys in the cursor + range.
      +
      +
      prevNoDup(LockMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Moves the cursor to the preceding value with a different key and returns + it, or returns null if there are no preceding unique keys in the cursor + range.
      +
      +
      PrimaryIndex<PK,E> - Class in com.sleepycat.persist
      +
      +
      The primary index for an entity class and its primary key.
      +
      +
      PrimaryIndex(Database, Class<PK>, EntryBinding<PK>, Class<E>, EntityBinding<E>) - Constructor for class com.sleepycat.persist.PrimaryIndex
      +
      +
      Creates a primary index without using an EntityStore.
      +
      +
      PrimaryKey - Annotation Type in com.sleepycat.persist.model
      +
      +
      Indicates the primary key field of an entity class.
      +
      +
      PrimaryKeyAssigner - Interface in com.sleepycat.collections
      +
      +
      An interface implemented to assign new primary key values.
      +
      +
      primaryKeyBinding - Variable in class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
       
      +
      PrimaryKeyMetadata - Class in com.sleepycat.persist.model
      +
      +
      The metadata for a primary key field.
      +
      +
      PrimaryKeyMetadata(String, String, String, String) - Constructor for class com.sleepycat.persist.model.PrimaryKeyMetadata
      +
      +
      Used by an EntityModel to construct primary key metadata.
      +
      +
      print(PrintStream) - Method in class com.sleepycat.je.util.DbSpace
      +
      +
      Calculates utilization and prints a report to the given output stream.
      +
      +
      printHeader(PrintStream, boolean, boolean) - Method in class com.sleepycat.je.util.DbDump
      +
       
      +
      printStartupInfo(PrintStream) - Method in class com.sleepycat.je.Environment
      +
      +
      Print a detailed report about the costs of different phases of + environment startup.
      +
      +
      printStartupInfo(PrintStream) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Print a detailed report about the costs of different phases of + environment startup.
      +
      +
      printUsage(String) - Method in class com.sleepycat.je.util.DbDump
      +
       
      +
      progress(T, long, long) - Method in interface com.sleepycat.je.ProgressListener
      +
      +
      Called by BDB JE to indicate to the user that progress has been + made on a potentially long running or asynchronous operation.
      +
      +
      ProgressListener<T extends java.lang.Enum<T>> - Interface in com.sleepycat.je
      +
      +
      ProgressListener provides feedback to the application that progress is being + made on a potentially long running or asynchronous JE operation.
      +
      +
      propertiesName - Static variable in class com.sleepycat.util.ConfigBeanInfoBase
      +
       
      +
      PROTOCOL_OLD_STRING_ENCODING - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      When set to true, which is currently the default, the + replication network protocol will use the JVM platform default charset + (text encoding) for node names and host names.
      +
      +
      put(K, V) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Associates the specified value with the specified key in this map + (optional operation).
      +
      +
      put(DatabaseEntry, DatabaseEntry, Put, WriteOptions) - Method in class com.sleepycat.je.Cursor
      +
      +
      Inserts or updates a record according to the specified Put + type.
      +
      +
      put(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Cursor
      +
      +
      Stores a key/data pair into the database.
      +
      +
      put(Transaction, DatabaseEntry, DatabaseEntry, Put, WriteOptions) - Method in class com.sleepycat.je.Database
      +
      +
      Inserts or updates a record according to the specified Put + type.
      +
      +
      put(Transaction, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Stores the key/data pair into the database.
      +
      +
      Put - Enum in com.sleepycat.je
      +
      +
      The operation type passed to "put" methods on databases and cursors.
      +
      +
      put(DatabaseEntry, DatabaseEntry, Put, WriteOptions) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed on a secondary cursor.
      +
      +
      put(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed on a secondary cursor.
      +
      +
      put(Transaction, DatabaseEntry, DatabaseEntry, Put, WriteOptions) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      This operation is not allowed on a secondary database.
      +
      +
      put(Transaction, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      This operation is not allowed on a secondary database.
      +
      +
      put(E) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts an entity and returns null, or updates it if the primary key + already exists and returns the existing entity.
      +
      +
      put(Transaction, E) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts an entity and returns null, or updates it if the primary key + already exists and returns the existing entity.
      +
      +
      put(Transaction, E, Put, WriteOptions) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts or updates an entity, using Put type and WriteOptions + parameters, and returning an OperationResult.
      +
      +
      putAll(Map<? extends K, ? extends V>) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Copies all of the mappings from the specified map to this map (optional + operation).
      +
      +
      putCurrent(DatabaseEntry) - Method in class com.sleepycat.je.Cursor
      +
      +
      Replaces the data in the key/data pair at the current cursor position.
      +
      +
      putCurrent(DatabaseEntry) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed on a secondary cursor.
      +
      +
      putIfAbsent(K, V) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      If the specified key is not already associated with a value, associate + it with the given value.
      +
      +
      putNoDupData(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Cursor
      +
      +
      Stores a key/data pair into the database.
      +
      +
      putNoDupData(Transaction, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Stores the key/data pair into the database if it does not already appear + in the database.
      +
      +
      putNoDupData(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed on a secondary cursor.
      +
      +
      putNoDupData(Transaction, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      This operation is not allowed on a secondary database.
      +
      +
      putNoOverwrite(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Cursor
      +
      +
      Stores a key/data pair into the database.
      +
      +
      putNoOverwrite(Transaction, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Stores the key/data pair into the database if the key does not already + appear in the database.
      +
      +
      putNoOverwrite(DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryCursor
      +
      +
      This operation is not allowed on a secondary cursor.
      +
      +
      putNoOverwrite(Transaction, DatabaseEntry, DatabaseEntry) - Method in class com.sleepycat.je.SecondaryDatabase
      +
      +
      This operation is not allowed on a secondary database.
      +
      +
      putNoOverwrite(E) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts an entity and returns true, or returns false if the primary key + already exists.
      +
      +
      putNoOverwrite(Transaction, E) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts an entity and returns true, or returns false if the primary key + already exists.
      +
      +
      putNoReturn(E) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts an entity, or updates it if the primary key already exists (does + not return the existing entity).
      +
      +
      putNoReturn(Transaction, E) - Method in class com.sleepycat.persist.PrimaryIndex
      +
      +
      Inserts an entity, or updates it if the primary key already exists (does + not return the existing entity).
      +
      +
      + + + +

      Q

      +
      +
      QuorumPolicy - Enum in com.sleepycat.je.rep
      +
      +
      The quorum policy determine the number of nodes that must participate to + pick the winner of an election, and therefore the master of the group.
      +
      +
      quorumSize(int) - Method in enum com.sleepycat.je.rep.QuorumPolicy
      +
      +
      Returns the minimum number of nodes to needed meet the quorum policy.
      +
      +
      + + + +

      R

      +
      +
      RawField - Interface in com.sleepycat.persist.raw
      +
      +
      The definition of a field in a RawType.
      +
      +
      RawObject - Class in com.sleepycat.persist.raw
      +
      +
      A raw instance that can be used with a RawStore or Conversion.
      +
      +
      RawObject(RawType, Map<String, Object>, RawObject) - Constructor for class com.sleepycat.persist.raw.RawObject
      +
      +
      Creates a raw object with a given set of field values for a complex + type.
      +
      +
      RawObject(RawType, Object[]) - Constructor for class com.sleepycat.persist.raw.RawObject
      +
      +
      Creates a raw object with the given array elements for an array type.
      +
      +
      RawObject(RawType, String) - Constructor for class com.sleepycat.persist.raw.RawObject
      +
      +
      Creates a raw object with the given enum value for an enum type.
      +
      +
      RawStore - Class in com.sleepycat.persist.raw
      +
      +
      Provides access to the raw data in a store for use by general purpose tools.
      +
      +
      RawStore(Environment, String, StoreConfig) - Constructor for class com.sleepycat.persist.raw.RawStore
      +
      +
      Opens an entity store for raw data access.
      +
      +
      RawType - Interface in com.sleepycat.persist.raw
      +
      +
      The type definition for a simple or complex persistent type, or an array + of persistent types.
      +
      +
      read() - Method in class com.sleepycat.je.util.LogVerificationInputStream
      +
      read(byte[]) - Method in class com.sleepycat.je.util.LogVerificationInputStream
      +
      read(byte[], int, int) - Method in class com.sleepycat.je.util.LogVerificationInputStream
      +
      read(ByteBuffer) - Method in class com.sleepycat.je.util.LogVerificationReadableByteChannel
      +
      read() - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      read(byte[]) - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      read(byte[], int, int) - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      READ_COMMITTED - Static variable in class com.sleepycat.je.CursorConfig
      +
      +
      A convenience instance to configure a cursor for read committed + isolation.
      +
      +
      READ_ONLY_TXN - Static variable in class com.sleepycat.je.Durability
      +
      +
      Deprecated. + +
      +
      +
      READ_UNCOMMITTED - Static variable in class com.sleepycat.je.CursorConfig
      +
      +
      A convenience instance to configure read operations performed by the + cursor to return modified but not yet committed data.
      +
      +
      readBigDecimal() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsorted BigDecimal.
      +
      +
      readBigInteger() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a BigInteger.
      +
      +
      readBoolean() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a boolean (one byte) unsigned value from the buffer and returns + true if it is non-zero and false if it is zero.
      +
      +
      readByte() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a signed byte (one byte) value from the buffer.
      +
      +
      readBytes(int) - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads the specified number of bytes from the buffer, converting each + unsigned byte value to a character of the resulting string.
      +
      +
      readBytes(char[]) - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads the specified number of bytes from the buffer, converting each + unsigned byte value to a character of the resulting array.
      +
      +
      readChar() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a char (two byte) unsigned value from the buffer.
      +
      +
      readChars(int) - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads the specified number of characters from the buffer, converting + each two byte unsigned value to a character of the resulting string.
      +
      +
      readChars(char[]) - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads the specified number of characters from the buffer, converting + each two byte unsigned value to a character of the resulting array.
      +
      +
      readClassDescriptor() - Method in class com.sleepycat.bind.serial.SerialInput
      +
       
      +
      readDouble() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsorted double (eight byte) value from the buffer.
      +
      +
      readFast() - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Equivalent to read() but does not throw + IOException.
      +
      +
      readFast(byte[]) - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Equivalent to read(byte[]) but does not throw + IOException.
      +
      +
      readFast(byte[], int, int) - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Equivalent to read(byte[],int,int) but does not throw + IOException.
      +
      +
      readFloat() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsorted float (four byte) value from the buffer.
      +
      +
      readInt() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a signed int (four byte) value from the buffer.
      +
      +
      readInt(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Reads a packed integer at the given buffer offset and returns it.
      +
      +
      readLong() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a signed long (eight byte) value from the buffer.
      +
      +
      readLong(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Reads a packed long integer at the given buffer offset and returns it.
      +
      +
      ReadOptions - Class in com.sleepycat.je
      +
      +
      Options for calling methods that read records.
      +
      +
      ReadOptions() - Constructor for class com.sleepycat.je.ReadOptions
      +
      +
      Constructs a ReadOptions object with default values for all properties.
      +
      +
      readPackedInt() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsorted packed integer.
      +
      +
      readPackedLong() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsorted packed long integer.
      +
      +
      readShort() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a signed short (two byte) value from the buffer.
      +
      +
      readSortedBigDecimal() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a sorted BigDecimal, with support for correct default + sorting.
      +
      +
      readSortedDouble() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a sorted double (eight byte) value from the buffer.
      +
      +
      readSortedFloat() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a sorted float (four byte) value from the buffer.
      +
      +
      readSortedInt(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Reads a sorted packed integer at the given buffer offset and returns it.
      +
      +
      readSortedLong(byte[], int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Reads a sorted packed long integer at the given buffer offset and + returns it.
      +
      +
      readSortedPackedInt() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a sorted packed integer.
      +
      +
      readSortedPackedLong() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a sorted packed long integer.
      +
      +
      readString() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads a null-terminated UTF string from the data buffer and converts + the data from UTF to Unicode.
      +
      +
      readString(int) - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads the specified number of UTF characters string from the data + buffer and converts the data from UTF to Unicode.
      +
      +
      readString(char[]) - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads the specified number of UTF characters string from the data + buffer and converts the data from UTF to Unicode.
      +
      +
      readUnsignedByte() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsigned byte (one byte) value from the buffer.
      +
      +
      readUnsignedInt() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsigned int (four byte) value from the buffer.
      +
      +
      readUnsignedShort() - Method in class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Reads an unsigned short (two byte) value from the buffer.
      +
      +
      recover(int) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      RecoveryProgress - Enum in com.sleepycat.je
      +
      +
      Describes the different phases of initialization that + be executed when an Environment is instantiated.
      +
      +
      register() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Registers the monitor with the group so that it can be kept informed + of the outcome of elections and group membership changes.
      +
      +
      registerAppStateMonitor(AppStateMonitor) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Registers an AppStateMonitor to receive the application state + which this ReplicatedEnvironment is running in.
      +
      +
      registerClass(Class) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Registers a persistent class, most importantly, a PersistentProxy class or entity subclass.
      +
      +
      Relationship - Enum in com.sleepycat.persist.model
      +
      +
      Defines the relationship between instances of the entity class and the + secondary keys.
      +
      +
      remove(Object) - Method in class com.sleepycat.collections.StoredEntrySet
      +
      +
      Removes the specified element from this set if it is present (optional + operation).
      +
      +
      remove() - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Removes the last element that was returned by next or previous (optional + operation).
      +
      +
      remove(Object) - Method in class com.sleepycat.collections.StoredKeySet
      +
      +
      Removes the specified key from this set if it is present (optional + operation).
      +
      +
      remove(Object) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Removes the mapping for this key from this map if present (optional + operation).
      +
      +
      remove(Object, Object) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Remove entry for key only if currently mapped to given value.
      +
      +
      remove(Object) - Method in class com.sleepycat.collections.StoredValueSet
      +
      +
      Removes the specified value from this set if it is present (optional + operation).
      +
      +
      removeAll(Collection<?>) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Removes all this collection's elements that are also contained in the + specified collection (optional operation).
      +
      +
      removeDatabase(Transaction, String) - Method in class com.sleepycat.je.Environment
      +
      +
      Removes a database from the environment, discarding all records in the + database and removing the database name itself.
      +
      +
      removeDatabase(String) - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      removeFileProtection(String) - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      Removes protection for a file in the backup set.
      +
      +
      removeMember(String) - Method in class com.sleepycat.je.rep.util.DbGroupAdmin
      +
      +
      Remove a node from the replication group.
      +
      +
      removeMember(String) - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Removes this node from the group, so that it is no longer a member of + the group.
      +
      +
      removeSequence(Transaction, DatabaseEntry) - Method in class com.sleepycat.je.Database
      +
      +
      Removes the sequence from the database.
      +
      +
      renameDatabase(Transaction, String, String) - Method in class com.sleepycat.je.Environment
      +
      +
      Renames a database, without removing the records it contains.
      +
      +
      Renamer - Class in com.sleepycat.persist.evolve
      +
      +
      A mutation for renaming a class or field without changing the instance or + field value.
      +
      +
      Renamer(String, int, String) - Constructor for class com.sleepycat.persist.evolve.Renamer
      +
      +
      Creates a mutation for renaming the class of all instances of the given + class version.
      +
      +
      Renamer(String, int, String, String) - Constructor for class com.sleepycat.persist.evolve.Renamer
      +
      +
      Creates a mutation for renaming the given field for all instances of the + given class version.
      +
      +
      REP_STREAM_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Deprecated. +
      and no longer used as of JE 7.5. Reserved files are now + retained based on available disk space -- see + EnvironmentConfig.MAX_DISK and + EnvironmentConfig.FREE_DISK should be used instead. + However, this param is still used when some, but not all, nodes in a + group have been upgraded to 7.5 or later.
      +
      +
      +
      replace(K, V) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Replace entry for key only if currently mapped to some value.
      +
      +
      replace(K, V, V) - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Replace entry for key only if currently mapped to given value.
      +
      +
      REPLAY_COST_PERCENT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Deprecated. +
      and no longer used as of JE 7.5. Reserved files are now + retained based on available disk space -- see + EnvironmentConfig.MAX_DISK and + EnvironmentConfig.FREE_DISK should be used instead.
      +
      +
      +
      REPLAY_DB_HANDLE_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      + +
      +
      REPLAY_DB_HANDLE_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      The maximum amount of time that an inactive database handle is kept open + during a replay of the replication stream.
      +
      +
      REPLAY_FREE_DISK_PERCENT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Deprecated. +
      and no longer needed as of JE 7.5. Reserved files are now + retained based on available disk space -- see + EnvironmentConfig.MAX_DISK and + EnvironmentConfig.FREE_DISK should be used instead. + However, this param is still used when it has been specified and + is non-zero, and FREE_DISK has not been specified. In this case, + REPLAY_FREE_DISK_PERCENT overrides the FREE_DISK default value. If + both REPLAY_FREE_DISK_PERCENT and FREE_DISK are specified, an + IllegalArgumentException is thrown.
      +
      +
      +
      REPLAY_MAX_OPEN_DB_HANDLES - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      + +
      +
      REPLAY_MAX_OPEN_DB_HANDLES - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      The maximum number of most recently used database handles that + are kept open during the replay of the replication stream.
      +
      +
      REPLAY_TXN_LOCK_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The maximum amount of time for a replay transaction to wait for a lock.
      +
      +
      REPLICA_ACK_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The amount of time that the + Transaction.commit(com.sleepycat.je.Durability) + on the Master will wait for a sufficient number of acknowledgments from + electable Replicas.
      +
      +
      REPLICA_GROUP_COMMIT_INTERVAL - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The time interval during which transactions may be grouped to amortize + the cost of fsync when a transaction commits with SyncPolicy#SYNC on the + Replica.
      +
      +
      REPLICA_MAX_GROUP_COMMIT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The maximum number of transactions that can be grouped to amortize the + cost of an fsync when a transaction commits with SyncPolicy#SYNC on the + Replica.
      +
      +
      REPLICA_RECEIVE_BUFFER_SIZE - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      The size of the the TCP receive buffer associated with the socket used + by the replica to transfer the replication stream.
      +
      +
      REPLICA_TIMEOUT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      A heartbeat is exchanged between the feeder and replica to ensure they + are alive.
      +
      +
      ReplicaConsistencyException - Exception in com.sleepycat.je.rep
      +
      +
      This exception is thrown by a Replica to indicate it could not meet the + consistency requirements as defined by the + ReplicaConsistencyPolicy in effect for the transaction, within + the allowed timeout period.
      +
      +
      ReplicaConsistencyException(String, ReplicaConsistencyPolicy) - Constructor for exception com.sleepycat.je.rep.ReplicaConsistencyException
      +
       
      +
      ReplicaConsistencyPolicy - Interface in com.sleepycat.je
      +
      +
      The interface for Consistency policies used to provide consistency + guarantees at a Replica.
      +
      +
      ReplicaStateException - Exception in com.sleepycat.je.rep
      +
      +
      This exception indicates that the application attempted an operation that is + not permitted when it is in the ReplicatedEnvironment.State.REPLICA + state.
      +
      +
      ReplicatedEnvironment - Class in com.sleepycat.je.rep
      +
      +
      A replicated database environment that is a node in a replication + group.
      +
      +
      ReplicatedEnvironment(File, ReplicationConfig, EnvironmentConfig, ReplicaConsistencyPolicy, QuorumPolicy) - Constructor for class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Creates a replicated environment handle and starts participating in the + replication group as either a Master or a Replica.
      +
      +
      ReplicatedEnvironment(File, ReplicationConfig, EnvironmentConfig) - Constructor for class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      A convenience constructor that defaults the replica consistency policy + and the initial election policy to be used.
      +
      +
      ReplicatedEnvironment.State - Enum in com.sleepycat.je.rep
      +
      +
      The replication node state determines the operations that the + application can perform against its replicated environment.
      +
      +
      ReplicatedEnvironmentStats - Class in com.sleepycat.je.rep
      +
      +
      Statistics for a replicated environment.
      +
      +
      ReplicationConfig - Class in com.sleepycat.je.rep
      +
      +
      Specifies the immutable attributes of a replicated environment.
      +
      +
      ReplicationConfig() - Constructor for class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Creates a ReplicationConfig initialized with the system default + settings.
      +
      +
      ReplicationConfig(String, String, String) - Constructor for class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Creates a ReplicationConfig initialized with the system default + settings and the specified group name, node name, and hostname/port + values.
      +
      +
      ReplicationConfig(Properties) - Constructor for class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Creates a ReplicationConfig which includes the properties specified in + the properties parameter.
      +
      +
      ReplicationGroup - Class in com.sleepycat.je.rep
      +
      +
      An administrative view of the collection of nodes that form the replication + group.
      +
      +
      ReplicationGroupAdmin - Class in com.sleepycat.je.rep.util
      +
      +
      Administrative APIs for use by applications which do not have direct access + to a replicated environment.
      +
      +
      ReplicationGroupAdmin(String, Set<InetSocketAddress>) - Constructor for class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Constructs a group admin object.
      +
      +
      ReplicationMutableConfig - Class in com.sleepycat.je.rep
      +
      +
      Specifies the attributes that may be changed after a ReplicatedEnvironment has been created.
      +
      +
      ReplicationMutableConfig() - Constructor for class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Create a ReplicationMutableConfig initialized with the system + default settings.
      +
      +
      ReplicationNode - Interface in com.sleepycat.je.rep
      +
      +
      An administrative view of a node in a replication group.
      +
      +
      ReplicaWriteException - Exception in com.sleepycat.je.rep
      +
      +
      This exception indicates that an update operation or transaction commit + or abort was attempted while in the + ReplicatedEnvironment.State.REPLICA state.
      +
      +
      reset() - Method in class com.sleepycat.je.rep.util.DbResetRepGroup
      +
      +
      Replaces the existing group with the new group having a single new node + as described by the constructor arguments.
      +
      +
      reset() - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      reset() - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      resetLoggingParams - Static variable in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      resetMBeanInfo() - Method in class com.sleepycat.je.jmx.JEMBean
      +
      +
      Create the available management interface for this environment.
      +
      +
      resolveClass(String) - Method in class com.sleepycat.persist.model.EntityModel
      +
      +
      Should be called by entity model implementations instead of calling + Class.forName whenever loading an application class.
      +
      +
      resolveClass(String, ClassLoader) - Static method in class com.sleepycat.util.ClassResolver
      +
      +
      A specialized Class.forName method that supports use of a user-specified + ClassLoader.
      +
      +
      resolveClass(ObjectStreamClass) - Method in class com.sleepycat.util.ClassResolver.Stream
      +
       
      +
      RestartRequiredException - Exception in com.sleepycat.je.rep
      +
      +
      RestartRequiredException serves as the base class for all exceptions which + makes it impossible for HA to proceed without some form of corrective action + on the part of the user, followed by a restart of the application.
      +
      +
      RestartRequiredException(EnvironmentImpl, EnvironmentFailureReason) - Constructor for exception com.sleepycat.je.rep.RestartRequiredException
      +
       
      +
      RestartRequiredException(EnvironmentImpl, EnvironmentFailureReason, Exception) - Constructor for exception com.sleepycat.je.rep.RestartRequiredException
      +
       
      +
      RestartRequiredException(EnvironmentImpl, EnvironmentFailureReason, String) - Constructor for exception com.sleepycat.je.rep.RestartRequiredException
      +
       
      +
      RestartRequiredException(String, RestartRequiredException) - Constructor for exception com.sleepycat.je.rep.RestartRequiredException
      +
      +
      For internal use only.
      +
      +
      result() - Method in class com.sleepycat.persist.EntityResult
      +
      +
      Returns the OperationResult resulting from the operation.
      +
      +
      retainAll(Collection<?>) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Retains only the elements in this collection that are contained in the + specified collection (optional operation).
      +
      +
      rollback(Xid) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      RollbackException - Exception in com.sleepycat.je.rep
      +
      +
      This asynchronous exception indicates that a new master has been selected, + this Replica's log is ahead of the current Master, + and in this case, the Replica was unable to rollback without a + recovery.
      +
      +
      RollbackProhibitedException - Exception in com.sleepycat.je.rep
      +
      +
      This exception may be thrown by a Replica during the + replication stream sync-up phase of startup.
      +
      +
      run(TransactionWorker) - Method in class com.sleepycat.collections.TransactionRunner
      +
      +
      Calls the TransactionWorker.doWork() method and, for transactional + environments, may begin and end a transaction.
      +
      +
      RUN_LOG_FLUSH_TASK - Static variable in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Deprecated. +
      as of 7.2. Log flushing can be disabled by setting EnvironmentConfig.LOG_FLUSH_SYNC_INTERVAL and EnvironmentConfig.LOG_FLUSH_NO_SYNC_INTERVAL to zero. For compatibility + with earlier releases, if this parameter is specified as false, no log + flushing will be performed; in this case, EnvironmentConfig.LOG_FLUSH_SYNC_INTERVAL and EnvironmentConfig.LOG_FLUSH_NO_SYNC_INTERVAL may not also be specified.
      +
      +
      +
      RunRecoveryException - Exception in com.sleepycat.je
      +
      +
      Deprecated. + +
      +
      +
      RuntimeExceptionWrapper - Exception in com.sleepycat.util
      +
      +
      A RuntimeException that can contain nested exceptions.
      +
      +
      RuntimeExceptionWrapper(Throwable) - Constructor for exception com.sleepycat.util.RuntimeExceptionWrapper
      +
       
      +
      + + + +

      S

      +
      +
      SecondaryConfig - Class in com.sleepycat.je
      +
      +
      The configuration properties of a SecondaryDatabase extend + those of a primary Database.
      +
      +
      SecondaryConfig() - Constructor for class com.sleepycat.je.SecondaryConfig
      +
      +
      Creates an instance with the system's default settings.
      +
      +
      SecondaryConstraintException - Exception in com.sleepycat.je
      +
      +
      Base class for exceptions thrown when a write operation fails because of a + secondary constraint.
      +
      +
      SecondaryCursor - Class in com.sleepycat.je
      +
      +
      A database cursor for a secondary database.
      +
      +
      SecondaryDatabase - Class in com.sleepycat.je
      +
      +
      A secondary database handle.
      +
      +
      SecondaryIndex<SK,PK,E> - Class in com.sleepycat.persist
      +
      +
      The secondary index for an entity class and a secondary key.
      +
      +
      SecondaryIndex(SecondaryDatabase, Database, PrimaryIndex<PK, E>, Class<SK>, EntryBinding<SK>) - Constructor for class com.sleepycat.persist.SecondaryIndex
      +
      +
      Creates a secondary index without using an EntityStore.
      +
      +
      SecondaryIntegrityException - Exception in com.sleepycat.je
      +
      +
      Thrown when an integrity problem is detected while accessing a secondary + database, including access to secondaries while writing to a primary + database.
      +
      +
      SecondaryKey - Annotation Type in com.sleepycat.persist.model
      +
      +
      Indicates a secondary key field of an entity class.
      +
      +
      SecondaryKeyCreator - Interface in com.sleepycat.je
      +
      +
      The interface implemented for extracting single-valued secondary keys from + primary records.
      +
      +
      SecondaryKeyMetadata - Class in com.sleepycat.persist.model
      +
      +
      The metadata for a secondary key field.
      +
      +
      SecondaryKeyMetadata(String, String, String, String, String, Relationship, String, DeleteAction) - Constructor for class com.sleepycat.persist.model.SecondaryKeyMetadata
      +
      +
      Used by an EntityModel to construct secondary key metadata.
      +
      +
      SecondaryMultiKeyCreator - Interface in com.sleepycat.je
      +
      +
      The interface implemented for extracting multi-valued secondary keys from + primary records.
      +
      +
      SecondaryReferenceException - Exception in com.sleepycat.je
      +
      +
      Base class for exceptions thrown when a read or write operation fails + because of a secondary constraint or integrity problem.
      +
      +
      Sequence - Class in com.sleepycat.je
      +
      +
      A Sequence handle is used to manipulate a sequence record in a + database.
      +
      +
      SequenceConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a sequence.
      +
      +
      SequenceConfig() - Constructor for class com.sleepycat.je.SequenceConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      SequenceExistsException - Exception in com.sleepycat.je
      +
      +
      Thrown by Database.openSequence if the + sequence record already exists and the SequenceConfig + ExclusiveCreate parameter is true.
      +
      +
      SequenceIntegrityException - Exception in com.sleepycat.je
      +
      +
      Thrown by Sequence.get if the sequence record has been + deleted.
      +
      +
      SequenceNotFoundException - Exception in com.sleepycat.je
      +
      +
      Thrown by Database.openSequence if the + sequence record does not exist and the SequenceConfig AllowCreate + parameter is false.
      +
      +
      SequenceOverflowException - Exception in com.sleepycat.je
      +
      +
      Thrown by Sequence.get if the end of the sequence is + reached and wrapping is not configured.
      +
      +
      SequenceStats - Class in com.sleepycat.je
      +
      +
      A SequenceStats object is used to return sequence statistics.
      +
      +
      SerialBase - Class in com.sleepycat.bind.serial
      +
      +
      A base class for serial bindings creators that provides control over the + allocation of the output buffer.
      +
      +
      SerialBase() - Constructor for class com.sleepycat.bind.serial.SerialBase
      +
      +
      Initializes the initial output buffer size to zero.
      +
      +
      SerialBinding<E> - Class in com.sleepycat.bind.serial
      +
      +
      A concrete EntryBinding that treats a key or data entry as + a serialized object.
      +
      +
      SerialBinding(ClassCatalog, Class<E>) - Constructor for class com.sleepycat.bind.serial.SerialBinding
      +
      +
      Creates a serial binding.
      +
      +
      SerialInput - Class in com.sleepycat.bind.serial
      +
      +
      A specialized ObjectInputStream that gets class description + information from a ClassCatalog.
      +
      +
      SerialInput(InputStream, ClassCatalog) - Constructor for class com.sleepycat.bind.serial.SerialInput
      +
      +
      Creates a serial input stream.
      +
      +
      SerialInput(InputStream, ClassCatalog, ClassLoader) - Constructor for class com.sleepycat.bind.serial.SerialInput
      +
      +
      Creates a serial input stream.
      +
      +
      SerialOutput - Class in com.sleepycat.bind.serial
      +
      +
      A specialized ObjectOutputStream that stores class description + information in a ClassCatalog.
      +
      +
      SerialOutput(OutputStream, ClassCatalog) - Constructor for class com.sleepycat.bind.serial.SerialOutput
      +
      +
      Creates a serial output stream.
      +
      +
      SerialSerialBinding<K,D,E> - Class in com.sleepycat.bind.serial
      +
      +
      An abstract EntityBinding that treats an entity's key entry and + data entry as serialized objects.
      +
      +
      SerialSerialBinding(ClassCatalog, Class<K>, Class<D>) - Constructor for class com.sleepycat.bind.serial.SerialSerialBinding
      +
      +
      Creates a serial-serial entity binding.
      +
      +
      SerialSerialBinding(SerialBinding<K>, SerialBinding<D>) - Constructor for class com.sleepycat.bind.serial.SerialSerialBinding
      +
      +
      Creates a serial-serial entity binding.
      +
      +
      SerialSerialKeyCreator<PK,D,SK> - Class in com.sleepycat.bind.serial
      +
      +
      A abstract key creator that uses a serial key and a serial data entry.
      +
      +
      SerialSerialKeyCreator(ClassCatalog, Class<PK>, Class<D>, Class<SK>) - Constructor for class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
      +
      Creates a serial-serial key creator.
      +
      +
      SerialSerialKeyCreator(SerialBinding<PK>, SerialBinding<D>, SerialBinding<SK>) - Constructor for class com.sleepycat.bind.serial.SerialSerialKeyCreator
      +
      +
      Creates a serial-serial entity binding.
      +
      +
      server - Variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      set(E) - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Replaces the last element returned by next or previous with the + specified element (optional operation).
      +
      +
      set(long) - Method in class com.sleepycat.je.rep.util.AtomicLongMax
      +
      +
      Set the value to newValue and returns the old value.
      +
      +
      setAggressive(boolean) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures Environment.verify and Database.verify to perform fine granularity consistency checking that + includes verifying in memory constructs.
      +
      +
      setAllowCreate(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configures the Environment.openDatabase method to create the database if it does not + already exist.
      +
      +
      setAllowCreate(boolean) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, creates the database environment if it doesn't already exist.
      +
      +
      setAllowCreate(boolean) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Configures the Database.openSequence method to create the sequence if it does not + already exist.
      +
      +
      setAllowCreate(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Specifies whether creation of a new store is allowed.
      +
      +
      setAllowNestedTransactions(boolean) - Method in class com.sleepycat.collections.TransactionRunner
      +
      +
      Changes whether nested transactions will be created if + run() is called when a transaction is already active for + the current thread.
      +
      +
      setAllowPopulate(boolean) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies whether automatic population of the secondary is allowed.
      +
      +
      setArbiterHome(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Sets the Arbiter Home directory
      +
      +
      setArbiterMutableConfig(ArbiterMutableConfig) - Method in class com.sleepycat.je.rep.arbiter.Arbiter
      +
      +
      Sets the Arbiter mutable attributes.
      +
      +
      setAttribute(Attribute) - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      setAttribute(Environment, Attribute) - Method in class com.sleepycat.je.jmx.JEMBeanHelper
      +
      +
      Deprecated.
      +
      Set an attribute value for the given environment.
      +
      +
      setAttribute(Attribute) - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      setAttributes(AttributeList) - Method in class com.sleepycat.je.jmx.JEDiagnostics
      +
       
      +
      setAttributes(AttributeList) - Method in class com.sleepycat.je.jmx.JEMonitor
      +
       
      +
      setAutoCommitNoSync(boolean) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Configures auto-commit operations on the sequence to not flush the + transaction log.
      +
      +
      setBatchDelay(long, TimeUnit) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures the delay between batches.
      +
      +
      setBatchSize(int) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures the number of records verified per batch.
      +
      +
      setBINsOnly(boolean) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Specify whether the DiskOrderedCursor should scan the BINs only.
      +
      +
      setBtreeComparator(Comparator<byte[]>) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      By default, a byte by byte lexicographic comparison is used for btree + keys.
      +
      +
      setBtreeComparator(Class<? extends Comparator<byte[]>>) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      By default, a byte by byte lexicographic comparison is used for btree + keys.
      +
      +
      setCacheMode(CacheMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Sets the CacheMode default used for subsequent operations + performed using this cursor.
      +
      +
      setCacheMode(CacheMode) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Sets the default CacheMode used for operations performed on this + database.
      +
      +
      setCacheMode(CacheMode) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Sets the default CacheMode used for operations performed in this + environment.
      +
      +
      setCacheMode(CacheMode) - Method in class com.sleepycat.je.ReadOptions
      +
      +
      Sets the CacheMode to be used for the operation.
      +
      +
      setCacheMode(CacheMode) - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Sets the CacheMode to be used for the operation.
      +
      +
      setCacheMode(CacheMode) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Changes the CacheMode default used for subsequent operations + performed using this cursor.
      +
      +
      setCachePercent(int) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for setting EnvironmentConfig.MAX_MEMORY_PERCENT.
      +
      +
      setCacheSize(long) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for setting EnvironmentConfig.MAX_MEMORY.
      +
      +
      setCacheSize(int) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Set the Configure the number of elements cached by a sequence handle.
      +
      +
      setClassLoader(ClassLoader) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configure the environment to use a specified ClassLoader for loading + user-supplied classes by name.
      +
      +
      setClear(boolean) - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Configures the statistics operation to reset statistics after they are + returned.
      +
      +
      setConfigParam(String, String) - Method in class com.sleepycat.je.EnvironmentConfig
      +
       
      +
      setConfigParam(String, String) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Set this configuration parameter.
      +
      +
      setConfigParam(String, String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Documentation inherited from ArbiterMutableConfig.setConfigParam.
      +
      +
      setConfigParam(String, String) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
       
      +
      setConfigParam(String, String) - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Set this configuration parameter with this value.
      +
      +
      setConsistencyPolicy(ReplicaConsistencyPolicy) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the consistency policy to be associated with the configuration.
      +
      +
      setConsistencyPolicy(ReplicaConsistencyPolicy) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Associates a consistency policy with this configuration.
      +
      +
      setConsoleLoggingLevel(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Trace messages equal and above this level will be logged to the + console.
      +
      +
      setCustomStats(CustomStats) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Sets the custom statistics object.
      +
      +
      setData(byte[]) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Sets the byte array.
      +
      +
      setData(byte[], int, int) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Sets the byte array, offset and size.
      +
      +
      setDbName(String) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Sets the database name to load.
      +
      +
      setDecrement(boolean) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Specifies that the sequence should be decremented.
      +
      +
      setDeferredWrite(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Sets the deferred-write option.
      +
      +
      setDeferredWrite(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Sets the deferred-write configuration property.
      +
      +
      setDesignatedPrimary(boolean) - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      If isPrimary is true, designate this node as a Primary.
      +
      +
      setDumpCorruptedBounds(boolean) - Method in class com.sleepycat.je.util.DbScavenger
      +
      +
      Set to true if corrupted boundaries should be dumped out.
      +
      +
      setDuplicateComparator(Comparator<byte[]>) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      By default, a byte by byte lexicographic comparison is used for + duplicate data items in a duplicate set.
      +
      +
      setDuplicateComparator(Class<? extends Comparator<byte[]>>) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      By default, a byte by byte lexicographic comparison is used for + duplicate data items in a duplicate set.
      +
      +
      setDurability(Durability) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Convenience method for setting EnvironmentConfig.TXN_DURABILITY.
      +
      +
      setDurability(Durability) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures the durability associated with a transaction when it commits.
      +
      +
      setElectableGroupSizeOverride(int) - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Sets the size used to determine the number of electable nodes.
      +
      +
      setEndFile(long) - Method in class com.sleepycat.je.util.DbSpace
      +
      +
      Sets the ending file number, which is an upper bound on the range of + files for which utilization is reported and (optionally) recalculated.
      +
      +
      setEnv(Environment) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Sets the Environment to load from.
      +
      +
      setEvolveListener(EvolveListener) - Method in class com.sleepycat.persist.evolve.EvolveConfig
      +
      +
      Sets a progress listener that is notified each time an entity is read.
      +
      +
      setExceptionListener(ExceptionListener) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Sets the exception listener for an Environment.
      +
      +
      setExclusiveCreate(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configure the Environment.openDatabase method to fail if the database already exists.
      +
      +
      setExclusiveCreate(boolean) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Configures the Database.openSequence method to fail if the database already exists.
      +
      +
      setExclusiveCreate(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Specifies whether opening an existing store is prohibited.
      +
      +
      setExpirationTime(long, TimeUnit) - Method in class com.sleepycat.je.WriteOptions
      +
      +
      A convenience method to set the TTL based on a given expiration time + and the current system time.
      +
      +
      setFast(boolean) - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Configures the statistics operation to return only the values which do + not incur some performance penalty.
      +
      +
      setFileLoggingLevel(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Trace messages equal and above this level will be logged to the je.info + file, which is in the Arbiter home directory.
      +
      +
      setForce(boolean) - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Configures the checkpoint force option.
      +
      +
      setForeignKeyDatabase(Database) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Defines a foreign key integrity constraint for a given foreign key + database.
      +
      +
      setForeignKeyDeleteAction(ForeignKeyDeleteAction) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies the action taken when a referenced record in the foreign key + database is deleted.
      +
      +
      setForeignKeyNullifier(ForeignKeyNullifier) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies the user-supplied object used for setting single-valued + foreign keys to null.
      +
      +
      setForeignMultiKeyNullifier(ForeignMultiKeyNullifier) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies the user-supplied object used for setting multi-valued foreign + keys to null.
      +
      +
      setGroupName(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Sets the name for the replication group.
      +
      +
      setGroupName(String) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Sets the name for the replication group.
      +
      +
      setGroupName(String) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the name for the replication group.
      +
      +
      setHeartbeatInterval(int) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Sets the heartbeat interval.
      +
      +
      setHelperHosts(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Identify one or more helpers nodes by their host and port pairs in this + format:
      +
      +
      setHelperHosts(String) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Identify one or more helpers nodes by their host and port pairs in this + format:
      +
      +
      setHelperHosts(String) - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Identify one or more helpers nodes by their host and port pairs in this + format:
      +
      +
      setHelperSockets(Set<InetSocketAddress>) - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Sets the helper sockets being used to contact a replication group + member, in order to query for the information.
      +
      +
      setIgnoreUnknownConfig(boolean) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Sets whether to ignore unknown parameters in the config file.
      +
      +
      setImmutableSecondaryKey(boolean) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies whether the secondary key is immutable.
      +
      +
      setInitialValue(long) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Sets the initial value for a sequence.
      +
      +
      setInputReader(BufferedReader) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Sets the BufferedReader to load from.
      +
      +
      setInternalMemoryLimit(long) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Set the maximum amount of JE Cache Memory that the DiskOrderedScan + can use at one time.
      +
      +
      setInternalMemoryLimit(long) - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Set the maximum amount of non JE Cache Memory that preload can use at + one time.
      +
      +
      setIteratorBlockSize(int) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Changes the number of records read at one time by iterators returned by + the StoredCollection.iterator() method.
      +
      +
      setKBytes(int) - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Configures the checkpoint log data threshold, in kilobytes.
      +
      +
      setKeyCreator(SecondaryKeyCreator) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies the user-supplied object used for creating single-valued + secondary keys.
      +
      +
      setKeyPrefixing(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configure the database to support key prefixing.
      +
      +
      setKeysOnly(boolean) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Specify whether the DiskOrderedCursor should return only the key or key + + data.
      +
      +
      setLoadLNs(boolean) - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Configure the preload load LNs option.
      +
      +
      setLocalWrite(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures this transaction to allow writing to non-replicated + Databases in a + ReplicatedEnvironment.
      +
      +
      setLocking(boolean) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Convenience method for setting + EnvironmentConfig.ENV_IS_LOCKING.
      +
      +
      setLockMode(LockMode) - Method in class com.sleepycat.je.ReadOptions
      +
      +
      Sets the LockMode to be used for the operation.
      +
      +
      setLockTimeout(long, TimeUnit) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Convenience method for setting EnvironmentConfig.LOCK_TIMEOUT.
      +
      +
      setLockTimeout(long) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. + +
      +
      +
      setLockTimeout(long, TimeUnit) - Method in class com.sleepycat.je.Transaction
      +
      +
      Configures the lock request timeout value for the transaction.
      +
      +
      setLockTimeout(long) - Method in class com.sleepycat.je.Transaction
      +
      +
      Deprecated. + +
      +
      +
      setLoggingHandler(Handler) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Set a java.util.logging.Handler which will be used by all + java.util.logging.Loggers instantiated by this Environment.
      +
      +
      setLoggingHandler(Handler) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
       
      +
      setLogProviders(List<ReplicationNode>) - Method in class com.sleepycat.je.rep.NetworkRestoreConfig
      +
      +
      Sets the prioritized list of data nodes, either ELECTABLE or SECONDARY + members, used to select a node from which to obtain log files for the + NetworkRestore operation.
      +
      +
      setLSNBatchSize(long) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Set the maximum number of LSNs to gather and sort at any one time.
      +
      +
      setLSNBatchSize(long) - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Set the maximum number of LSNs to gather and sort at any one time.
      +
      +
      setManagedConnection(JEManagedConnection, JELocalTransaction) - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      setMaxBytes(long) - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Configure the maximum number of bytes to preload.
      +
      +
      setMaxClockDelta(long, TimeUnit) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the maximum acceptable clock skew between this Replica and its + Feeder, which is the node that is the source of its replication + stream.
      +
      +
      setMaxDisk(long) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for setting EnvironmentConfig.MAX_DISK.
      +
      +
      setMaxMillisecs(long) - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Configure the maximum number of milliseconds to execute preload.
      +
      +
      setMaxRetries(int) - Method in class com.sleepycat.collections.TransactionRunner
      +
      +
      Changes the maximum number of retries that will be performed when + deadlocks are detected.
      +
      +
      setMaxSeedMillisecs(long) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Deprecated. +
      this method has no effect and will be removed in a future + release.
      +
      +
      +
      setMaxSeedNodes(long) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Deprecated. +
      this method has no effect and will be removed in a future + release.
      +
      +
      +
      setMinimizeRecoveryTime(boolean) - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Configures the minimize recovery time option.
      +
      +
      setMinutes(int) - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Configures the checkpoint time threshold, in minutes.
      +
      +
      setModel(EntityModel) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Sets the entity model that defines entity classes and index keys.
      +
      +
      setMultiKeyCreator(SecondaryMultiKeyCreator) - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Specifies the user-supplied object used for creating multi-valued + secondary keys.
      +
      +
      setMutableConfig(EnvironmentMutableConfig) - Method in class com.sleepycat.je.Environment
      +
      +
      Sets database environment attributes.
      +
      +
      setMutations(Mutations) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Configures mutations for performing lazy evolution of stored instances.
      +
      +
      setName(String) - Method in class com.sleepycat.je.Transaction
      +
      +
      Set the user visible name for the transaction.
      +
      +
      setNodeHostPort(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Sets the hostname and port associated with this arbiter.
      +
      +
      setNodeHostPort(String) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Sets the hostname and port associated with this monitor.
      +
      +
      setNodeHostPort(String) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the hostname and port associated with this node.
      +
      +
      setNodeMaxDupTreeEntries(int) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Deprecated. +
      this property no longer has any effect; DatabaseConfig.setNodeMaxEntries(int) should be used instead.
      +
      +
      +
      setNodeMaxEntries(int) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configures the Environment.openDatabase method to have a B+Tree fanout of + nodeMaxEntries.
      +
      +
      setNodeName(String) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Sets the user defined nodeName for the Environment.
      +
      +
      setNodeName(String) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Sets the name to be associated with this Arbiter.
      +
      +
      setNodeName(String) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Sets the name to be associated with this monitor.
      +
      +
      setNodeName(String) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the name to be associated with this node.
      +
      +
      setNodePriority(int) - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      Sets the election priority for the node.
      +
      +
      setNodeType(NodeType) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Sets the type of this node.
      +
      +
      setNonSticky(boolean) - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Configures the behavior of the cursor when a cursor movement operation + returns OperationStatus.NOTFOUND.
      +
      +
      setNoOverwrite(boolean) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Sets whether the load should overwrite existing data or not.
      +
      +
      setNoSort(boolean) - Method in class com.sleepycat.je.JoinConfig
      +
      +
      Specifies whether automatic sorting of the input cursors is disabled.
      +
      +
      setNoSync(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      + +
      +
      setNoWait(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures the transaction to not wait if a lock request cannot be + immediately granted.
      +
      +
      setNumRetries(int) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Sets the number of times a ping thread attempts to contact a node + before deeming it unreachable.
      +
      +
      setOffHeapCacheSize(long) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      A convenience method for setting + EnvironmentConfig.MAX_OFF_HEAP_MEMORY.
      +
      +
      setOffset(int) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Sets the byte offset into the data array.
      +
      +
      setOverrideBtreeComparator(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Sets to true if the database exists and the btree comparator specified + in this configuration object should override the current comparator.
      +
      +
      setOverrideDuplicateComparator(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Sets to true if the database exists and the duplicate comparator + specified in this configuration object should override the current + comparator.
      +
      +
      setPartial(int, int, boolean) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Configures this DatabaseEntry to read or write partial records.
      +
      +
      setPartial(boolean) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Configures this DatabaseEntry to read or write partial records.
      +
      +
      setPartialLength(int) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Sets the byte length of the partial record being read or written by the + application, in bytes.
      +
      +
      setPartialOffset(int) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Sets the offset of the partial record being read or written by the + application, in bytes.
      +
      +
      setPrimaryConfig(Class, DatabaseConfig) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Configures the primary database for an entity class using the Berkeley + DB engine API.
      +
      +
      setPrintInfo(boolean) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures Environment.verify and Database.verify to print basic verification information.
      +
      +
      setProgressInterval(long) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      If progressInterval is set, progress status messages are generated to + stdout at set percentages of the load.
      +
      +
      setProgressListener(ProgressListener<PreloadConfig.Phases>) - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Configure the preload operation to make periodic calls to a ProgressListener to provide feedback on preload progress.
      +
      +
      setPropagateExceptions(boolean) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures Environment.verify and Database.verify to propagate exceptions found during verification.
      +
      +
      setQueueSize(int) - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Set the queue size for entries being passed between the + DiskOrderedCursor producer thread and the application's consumer + thread.
      +
      +
      setRange(long, long) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Configures a sequence range.
      +
      +
      setReadCommitted(boolean) - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Configures read operations performed by the cursor to obey read + committed isolation.
      +
      +
      setReadCommitted(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures the transaction for read committed isolation.
      +
      +
      setReadDelay(long, TimeUnit) - Method in class com.sleepycat.je.util.DbVerifyLog
      +
      +
      Configures the delay between file reads during verification.
      +
      +
      setReadModifyWrite(boolean) - Method in class com.sleepycat.collections.StoredIterator
      +
      +
      Changes whether write-locks will be obtained when reading with this + cursor.
      +
      +
      setReadOnly(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configures the database in read-only mode.
      +
      +
      setReadOnly(boolean) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Convenience method for setting EnvironmentConfig.ENV_READ_ONLY.
      +
      +
      setReadOnly(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures this transaction to disallow write operations, regardless of + whether writes are allowed for the Environment or the + Databases that are accessed.
      +
      +
      setReadOnly(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Sets the read-only configuration property.
      +
      +
      setReadUncommitted(boolean) - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Configures read operations performed by the cursor to return modified + but not yet committed data.
      +
      +
      setReadUncommitted(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures read operations performed by the transaction to return + modified but not yet committed data.
      +
      +
      setRecalculate(boolean) - Method in class com.sleepycat.je.util.DbSpace
      +
      +
      Sets the recalculation property, which if true causes a more expensive + recalculation of utilization to be performed for debugging purposes.
      +
      +
      setReceiveBufferSize(int) - Method in class com.sleepycat.je.rep.NetworkRestoreConfig
      +
      +
      Sets the size of the receive buffer associated with the socket used to + transfer files during the NetworkRestore operation.
      +
      +
      setRecoveryProgressListener(ProgressListener<RecoveryProgress>) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configure the environment to make periodic calls to a ProgressListener to + provide feedback on environment startup (recovery).
      +
      +
      setReplicaAckTimeout(long, TimeUnit) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Set the replica commit timeout.
      +
      +
      setReplicated(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configures a database to be replicated or non-replicated, in a + replicated Environment.
      +
      +
      setReplicated(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Configures a store to be replicated or non-replicated, in a replicated + Environment.
      +
      +
      setRepMutableConfig(ReplicationMutableConfig) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
       
      +
      setRetainLogFiles(boolean) - Method in class com.sleepycat.je.rep.NetworkRestoreConfig
      +
      +
      If true retains obsolete log files, by renaming them instead of deleting + them.
      +
      +
      setRetryInterval(long) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Sets the number of milliseconds between ping thread retries.
      +
      +
      setSecondaryBulkLoad(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Sets the bulk-load-secondaries configuration property.
      +
      +
      setSecondaryConfig(Class, String, SecondaryConfig) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Configures a secondary database for an entity class and key name using + the Berkeley DB engine API.
      +
      +
      setSequenceConfig(String, SequenceConfig) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Configures a named key sequence using the Berkeley DB engine API.
      +
      +
      setSerialBufferSize(int) - Method in class com.sleepycat.bind.serial.SerialBase
      +
      +
      Sets the initial byte size of the output buffer that is allocated by the + default implementation of SerialBase.getSerialOutput(java.lang.Object).
      +
      +
      setSerializableIsolation(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures this transaction to have serializable (degree 3) isolation.
      +
      +
      setSharedCache(boolean) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A convenience method for setting the + EnvironmentConfig.SHARED_CACHE parameter.
      +
      +
      setShowProgressInterval(int) - Method in class com.sleepycat.je.StatsConfig
      +
      +
      When the statistics operation is configured to display progress the + showProgressInterval is the number of LNs between each progress report.
      +
      +
      setShowProgressInterval(int) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      When the verify operation is configured to display progress the + showProgressInterval is the number of LNs between each progress report.
      +
      +
      setShowProgressStream(PrintStream) - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Configures the statistics operation to display progress to the + PrintStream argument.
      +
      +
      setShowProgressStream(PrintStream) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures the verify operation to display progress to the PrintStream + argument.
      +
      +
      setSize(int) - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Sets the byte size of the data array.
      +
      +
      setSocketConnectTimeout(int) - Method in class com.sleepycat.je.rep.monitor.MonitorConfig
      +
      +
      Sets the socketConnection timeout, in milliseconds, used + when the ping thread attempts to establish a connection with a + replication node.
      +
      +
      setSortedDuplicates(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Configures the database to support records with duplicate keys.
      +
      +
      setStartFile(long) - Method in class com.sleepycat.je.util.DbSpace
      +
      +
      Sets the start file number, which is a lower bound on the range of + files for which utilization is reported and (optionally) recalculated.
      +
      +
      setStateChangeListener(StateChangeListener) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Sets the listener used to receive asynchronous replication node state + change events.
      +
      +
      setSync(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Configures the transaction to write and synchronously flush the log it + when commits.
      +
      +
      setSyncupProgressListener(ProgressListener<SyncupProgress>) - Method in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      Configure the environment to make periodic calls to a ProgressListener to provide feedback on replication stream sync-up.
      +
      +
      setTemporary(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Sets the temporary database option.
      +
      +
      setTemporary(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Sets the temporary configuration property.
      +
      +
      setTextFileMode(boolean) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Sets whether the load data is in text file format.
      +
      +
      setThreadTransaction(Transaction) - Method in class com.sleepycat.je.Environment
      +
      +
      Sets the transaction associated with this thread if implied transactions + are being used.
      +
      +
      setTime(long) - Method in class com.sleepycat.je.util.DbSpace
      +
      +
      Sets the time for calculating expired data.
      +
      +
      setTotalLoadBytes(long) - Method in class com.sleepycat.je.util.DbLoad
      +
      +
      Used for progress status messages.
      +
      +
      setTransactional(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Encloses the database open within a transaction.
      +
      +
      setTransactional(boolean) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Convenience method for setting + EnvironmentConfig.ENV_IS_TRANSACTIONAL.
      +
      +
      setTransactional(boolean) - Method in class com.sleepycat.persist.StoreConfig
      +
      +
      Sets the transactional configuration property.
      +
      +
      setTransactionConfig(TransactionConfig) - Method in class com.sleepycat.collections.TransactionRunner
      +
      + +
      +
      setTransactionTimeout(int) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      setTTL(int) - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Sets the Time-To-Live property for a 'put' operation, using + TimeUnit.Days as the TTL unit.
      +
      +
      setTTL(int, TimeUnit) - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Sets the Time-To-Live property for a 'put' operation, using the given + TimeUnit.
      +
      +
      setTupleBufferSize(int) - Method in class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Sets the initial byte size of the output buffer that is allocated by the + default implementation of TupleBase.getTupleOutput(E).
      +
      +
      setTxnNoSync(boolean) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      + +
      +
      setTxnSerializableIsolation(boolean) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A convenience method for setting + EnvironmentConfig.TXN_SERIALIZABLE_ISOLATION.
      +
      +
      setTxnTimeout(long, TimeUnit) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A convenience method for setting EnvironmentConfig.TXN_TIMEOUT.
      +
      +
      setTxnTimeout(long) - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. + +
      +
      +
      setTxnTimeout(long, TimeUnit) - Method in class com.sleepycat.je.Transaction
      +
      +
      Configures the timeout value for the transaction lifetime.
      +
      +
      setTxnTimeout(long) - Method in class com.sleepycat.je.Transaction
      +
      +
      Deprecated. + +
      +
      +
      setTxnWriteNoSync(boolean) - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      + +
      +
      setUnknownStateTimeout(long, TimeUnit) - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Time to wait for the discovery of the Master during the instantiation + of the Arbiter.
      +
      +
      setUpdateTTL(boolean) - Method in class com.sleepycat.je.WriteOptions
      +
      +
      Sets the update-TTL property for a 'put' operation.
      +
      +
      setUseExistingConfig(boolean) - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Setting useExistingConfig to true allows a program to open a database + without knowing a prior what its configuration is.
      +
      +
      setValue(V) - Method in class com.sleepycat.collections.MapEntryParameter
      +
      +
      Always throws UnsupportedOperationException since this + object is not attached to a map.
      +
      +
      setVerbose(boolean) - Method in class com.sleepycat.persist.model.ClassEnhancer
      +
      +
      Sets verbose mode.
      +
      +
      setVerbose(boolean) - Method in class com.sleepycat.persist.model.ClassEnhancerTask
      +
       
      +
      setVerifyDataRecords(boolean) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures verification to read and verify the leaf node (LN) of a + primary data record.
      +
      +
      setVerifySecondaries(boolean) - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Configures verification to verify secondary database integrity.
      +
      +
      setWrap(boolean) - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Specifies that the sequence should wrap around when it is incremented + (decremented) past the specified maximum (minimum) value.
      +
      +
      setWriteNoSync(boolean) - Method in class com.sleepycat.je.TransactionConfig
      +
      + +
      +
      SHARED_CACHE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true, the shared cache is used by this environment.
      +
      +
      ShortBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a Short primitive + wrapper or a short primitive.
      +
      +
      ShortBinding() - Constructor for class com.sleepycat.bind.tuple.ShortBinding
      +
       
      +
      shortToEntry(short, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.ShortBinding
      +
      +
      Converts a simple short value into an entry buffer.
      +
      +
      shutdown() - Method in class com.sleepycat.je.rep.arbiter.Arbiter
      +
      +
      Shutdown the Arbiter.
      +
      +
      shutdown() - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Release monitor resources and shut down the monitor.
      +
      +
      shutdownGroup(long, TimeUnit) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Closes this handle and shuts down the Replication Group by forcing all + active Replicas to exit.
      +
      +
      size() - Method in class com.sleepycat.collections.StoredCollection
      +
       
      +
      size() - Method in class com.sleepycat.collections.StoredContainer
      +
      +
      Returns a non-transactional count of the records in the collection or + map.
      +
      +
      size() - Method in class com.sleepycat.collections.StoredMap
      +
       
      +
      size() - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      skip(long) - Method in class com.sleepycat.je.util.LogVerificationInputStream
      +
      skip(long) - Method in class com.sleepycat.util.FastInputStream
      +
       
      +
      skipFast(int) - Method in class com.sleepycat.util.FastInputStream
      +
      +
      Equivalent to skip() but takes an int parameter instead of a + long, and does not check whether the count given is larger than the + number of remaining bytes.
      +
      +
      skipNext(long, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Skips forward a given number of key/data pairs and returns the number by + which the cursor is moved.
      +
      +
      skipPrev(long, DatabaseEntry, DatabaseEntry, LockMode) - Method in class com.sleepycat.je.Cursor
      +
      +
      Skips backward a given number of key/data pairs and returns the number + by which the cursor is moved.
      +
      +
      SortedBigDecimalBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a sorted BigDecimal + value.
      +
      +
      SortedBigDecimalBinding() - Constructor for class com.sleepycat.bind.tuple.SortedBigDecimalBinding
      +
       
      +
      SortedDoubleBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a sorted Double + primitive wrapper or a sorted double primitive.
      +
      +
      SortedDoubleBinding() - Constructor for class com.sleepycat.bind.tuple.SortedDoubleBinding
      +
       
      +
      SortedFloatBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a sorted Float + primitive wrapper or sorted a float primitive.
      +
      +
      SortedFloatBinding() - Constructor for class com.sleepycat.bind.tuple.SortedFloatBinding
      +
       
      +
      sortedMap() - Method in interface com.sleepycat.persist.EntityIndex
      +
      +
      Returns a standard Java sorted map based on this entity index.
      +
      +
      sortedMap() - Method in class com.sleepycat.persist.PrimaryIndex
      +
       
      +
      sortedMap() - Method in class com.sleepycat.persist.SecondaryIndex
      +
       
      +
      SortedPackedIntegerBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a sorted Integer + primitive wrapper or a sorted int primitive, that stores the + value in the smallest number of bytes possible.
      +
      +
      SortedPackedIntegerBinding() - Constructor for class com.sleepycat.bind.tuple.SortedPackedIntegerBinding
      +
       
      +
      SortedPackedLongBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a sorted Long + primitive wrapper or a sorted long primitive, that stores the + value in the smallest number of bytes possible.
      +
      +
      SortedPackedLongBinding() - Constructor for class com.sleepycat.bind.tuple.SortedPackedLongBinding
      +
       
      +
      Splitter - Class in com.sleepycat.je.util
      +
      +
      Splitter is used to split a string based on a delimiter.
      +
      +
      Splitter(char) - Constructor for class com.sleepycat.je.util.Splitter
      +
       
      +
      start(Xid, int) - Method in class com.sleepycat.je.XAEnvironment
      +
       
      +
      startBackup() - Method in class com.sleepycat.je.util.DbBackup
      +
      +
      Start backup mode in order to determine the definitive backup set needed + at this point in time.
      +
      +
      startListener(MonitorChangeListener) - Method in class com.sleepycat.je.rep.monitor.Monitor
      +
      +
      Starts the listener so it's actively listening for election results and + broadcasts of replication group changes.
      +
      +
      STARTUP_DUMP_THRESHOLD - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If environment startup exceeds this duration, startup statistics are + logged and can be found in the je.info file.
      +
      +
      stateChange(StateChangeEvent) - Method in interface com.sleepycat.je.rep.StateChangeListener
      +
      +
      The notification method.
      +
      +
      StateChangeEvent - Class in com.sleepycat.je.rep
      +
      +
      Communicates the state change at a node + to the StateChangeListener.
      +
      +
      StateChangeException - Exception in com.sleepycat.je.rep
      +
      +
      Provides a synchronous mechanism for informing an application about a change + in the state of the replication node.
      +
      +
      StateChangeException(String, Exception) - Constructor for exception com.sleepycat.je.rep.StateChangeException
      +
      +
      Used when no state change event is available
      +
      +
      StateChangeListener - Interface in com.sleepycat.je.rep
      +
      +
      An asynchronous mechanism for tracking the State of the replicated environment and + choosing how to route database operations.
      +
      +
      statParams - Static variable in class com.sleepycat.je.jmx.JEMBean
      +
       
      +
      stats(PrintStream) - Method in class com.sleepycat.je.util.DbStat
      +
       
      +
      STATS_COLLECT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If true collect and log statistics.
      +
      +
      STATS_COLLECT_INTERVAL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The duration of the statistics capture interval.
      +
      +
      STATS_FILE_DIRECTORY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The directory to save the statistics log file.
      +
      +
      STATS_FILE_ROW_COUNT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Log file maximum row count for Stat collection.
      +
      +
      STATS_MAX_FILES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Maximum number of statistics log files to retain.
      +
      +
      StatsConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a statistics retrieval operation.
      +
      +
      StatsConfig() - Constructor for class com.sleepycat.je.StatsConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      STIFLE_DEFAULT_ERROR_MANAGER - Static variable in class com.sleepycat.je.util.FileHandler
      +
       
      +
      StoreConfig - Class in com.sleepycat.persist
      +
      +
      Configuration properties used with an EntityStore or RawStore.
      +
      +
      StoreConfig() - Constructor for class com.sleepycat.persist.StoreConfig
      +
      +
      Creates an entity store configuration object with default properties.
      +
      +
      StoreConfigBeanInfo - Class in com.sleepycat.persist
      +
       
      +
      StoreConfigBeanInfo() - Constructor for class com.sleepycat.persist.StoreConfigBeanInfo
      +
       
      +
      StoredClassCatalog - Class in com.sleepycat.bind.serial
      +
      +
      A ClassCatalog that is stored in a Database.
      +
      +
      StoredClassCatalog(Database) - Constructor for class com.sleepycat.bind.serial.StoredClassCatalog
      +
      +
      Creates a catalog based on a given database.
      +
      +
      StoredCollection<E> - Class in com.sleepycat.collections
      +
      +
      A abstract base class for all stored collections.
      +
      +
      StoredCollections - Class in com.sleepycat.collections
      +
      +
      Static methods operating on collections and maps.
      +
      +
      StoredContainer - Class in com.sleepycat.collections
      +
      +
      A abstract base class for all stored collections and maps.
      +
      +
      StoredEntrySet<K,V> - Class in com.sleepycat.collections
      +
      +
      The Set returned by Map.entrySet().
      +
      +
      storedIterator() - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns an iterator over the elements in this collection.
      +
      +
      storedIterator(boolean) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns a read or read-write iterator over the elements in this + collection.
      +
      +
      StoredIterator<E> - Class in com.sleepycat.collections
      +
      +
      The Iterator returned by all stored collections.
      +
      +
      StoredKeySet<K> - Class in com.sleepycat.collections
      +
      +
      The Set returned by Map.keySet() and which can also be constructed directly + if a Map is not needed.
      +
      +
      StoredKeySet(Database, EntryBinding<K>, boolean) - Constructor for class com.sleepycat.collections.StoredKeySet
      +
      +
      Creates a key set view of a Database.
      +
      +
      StoredMap<K,V> - Class in com.sleepycat.collections
      +
      +
      A Map view of a Database.
      +
      +
      StoredMap(Database, EntryBinding<K>, EntryBinding<V>, boolean) - Constructor for class com.sleepycat.collections.StoredMap
      +
      +
      Creates a map view of a Database.
      +
      +
      StoredMap(Database, EntryBinding<K>, EntryBinding<V>, PrimaryKeyAssigner) - Constructor for class com.sleepycat.collections.StoredMap
      +
      +
      Creates a map view of a Database with a PrimaryKeyAssigner.
      +
      +
      StoredMap(Database, EntryBinding<K>, EntityBinding<V>, boolean) - Constructor for class com.sleepycat.collections.StoredMap
      +
      +
      Creates a map entity view of a Database.
      +
      +
      StoredMap(Database, EntryBinding<K>, EntityBinding<V>, PrimaryKeyAssigner) - Constructor for class com.sleepycat.collections.StoredMap
      +
      +
      Creates a map entity view of a Database with a PrimaryKeyAssigner.
      +
      +
      StoredSortedEntrySet<K,V> - Class in com.sleepycat.collections
      +
      +
      The SortedSet returned by Map.entrySet().
      +
      +
      StoredSortedKeySet<K> - Class in com.sleepycat.collections
      +
      +
      The SortedSet returned by Map.keySet() and which can also be constructed + directly if a Map is not needed.
      +
      +
      StoredSortedKeySet(Database, EntryBinding<K>, boolean) - Constructor for class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Creates a sorted key set view of a Database.
      +
      +
      StoredSortedMap<K,V> - Class in com.sleepycat.collections
      +
      +
      A SortedMap view of a Database.
      +
      +
      StoredSortedMap(Database, EntryBinding<K>, EntryBinding<V>, boolean) - Constructor for class com.sleepycat.collections.StoredSortedMap
      +
      +
      Creates a sorted map view of a Database.
      +
      +
      StoredSortedMap(Database, EntryBinding<K>, EntryBinding<V>, PrimaryKeyAssigner) - Constructor for class com.sleepycat.collections.StoredSortedMap
      +
      +
      Creates a sorted map view of a Database with a PrimaryKeyAssigner.
      +
      +
      StoredSortedMap(Database, EntryBinding<K>, EntityBinding<V>, boolean) - Constructor for class com.sleepycat.collections.StoredSortedMap
      +
      +
      Creates a sorted map entity view of a Database.
      +
      +
      StoredSortedMap(Database, EntryBinding<K>, EntityBinding<V>, PrimaryKeyAssigner) - Constructor for class com.sleepycat.collections.StoredSortedMap
      +
      +
      Creates a sorted map entity view of a Database with a PrimaryKeyAssigner.
      +
      +
      StoredSortedValueSet<E> - Class in com.sleepycat.collections
      +
      +
      The SortedSet returned by Map.values() and which can also be constructed + directly if a Map is not needed.
      +
      +
      StoredSortedValueSet(Database, EntityBinding<E>, boolean) - Constructor for class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Creates a sorted value set entity view of a Database.
      +
      +
      StoredValueSet<E> - Class in com.sleepycat.collections
      +
      +
      The Set returned by Map.values() and Map.duplicates(), and which can also be + constructed directly if a Map is not needed.
      +
      +
      StoredValueSet(Database, EntryBinding<E>, boolean) - Constructor for class com.sleepycat.collections.StoredValueSet
      +
      +
      Creates a value set view of a Database.
      +
      +
      StoredValueSet(Database, EntityBinding<E>, boolean) - Constructor for class com.sleepycat.collections.StoredValueSet
      +
      +
      Creates a value set entity view of a Database.
      +
      +
      StoreExistsException - Exception in com.sleepycat.persist
      +
      +
      Thrown by the EntityStore constructor when the ExclusiveCreate configuration parameter is + true and the store's internal catalog database already exists.
      +
      +
      StoreNotFoundException - Exception in com.sleepycat.persist
      +
      +
      Thrown by the EntityStore constructor when the AllowCreate configuration parameter is false and + the store's internal catalog database does not exist.
      +
      +
      Stream(InputStream, ClassLoader) - Constructor for class com.sleepycat.util.ClassResolver.Stream
      +
       
      +
      StringBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding for a simple String value.
      +
      +
      StringBinding() - Constructor for class com.sleepycat.bind.tuple.StringBinding
      +
       
      +
      stringToBytes(String) - Static method in class com.sleepycat.util.UtfOps
      +
      +
      Converts strings to byte arrays.
      +
      +
      stringToEntry(String, DatabaseEntry) - Static method in class com.sleepycat.bind.tuple.StringBinding
      +
      +
      Converts a simple String value into an entry buffer.
      +
      +
      subIndex(SK) - Method in class com.sleepycat.persist.SecondaryIndex
      +
      +
      Returns an index that maps primary key to entity for the subset of + entities having a given secondary key (duplicates).
      +
      +
      subMap(K, K) - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns a view of the portion of this sorted map whose elements range + from fromKey, inclusive, to toKey, exclusive.
      +
      +
      subMap(K, boolean, K, boolean) - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns a view of the portion of this sorted map whose elements are + strictly greater than fromKey and strictly less than toKey, + optionally including fromKey and toKey.
      +
      +
      subSet(Map.Entry<K, V>, Map.Entry<K, V>) - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns a view of the portion of this sorted set whose elements range + from fromMapEntry, inclusive, to toMapEntry, exclusive.
      +
      +
      subSet(Map.Entry<K, V>, boolean, Map.Entry<K, V>, boolean) - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly greater than fromMapEntry and strictly less than toMapEntry, + optionally including fromMapEntry and toMapEntry.
      +
      +
      subSet(K, K) - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns a view of the portion of this sorted set whose elements range + from fromKey, inclusive, to toKey, exclusive.
      +
      +
      subSet(K, boolean, K, boolean) - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly greater than fromKey and strictly less than toKey, + optionally including fromKey and toKey.
      +
      +
      subSet(E, E) - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns a view of the portion of this sorted set whose elements range + from fromValue, inclusive, to toValue, exclusive.
      +
      +
      subSet(E, boolean, E, boolean) - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly greater than fromValue and strictly less than toValue, + optionally including fromValue and toValue.
      +
      +
      SUCCESS - Static variable in class com.sleepycat.je.PreloadStatus
      +
      +
      Database.preload + was successful.
      +
      +
      sync() - Method in class com.sleepycat.je.Database
      +
      +
      Flushes any cached information for this database to disk; only + applicable for deferred-write databases.
      +
      +
      sync() - Method in class com.sleepycat.je.Environment
      +
      +
      Synchronously flushes database environment databases to stable storage.
      +
      +
      sync() - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Flushes each modified index to disk that was opened in deferred-write + mode.
      +
      +
      SyncupProgress - Enum in com.sleepycat.je.rep
      +
      +
      Describes the different phases of replication stream syncup that are + executed when a replica starts working with a new replication group master.
      +
      +
      + + + +

      T

      +
      +
      tailMap(K) - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns a view of the portion of this sorted map whose elements are + greater than or equal to fromKey.
      +
      +
      tailMap(K, boolean) - Method in class com.sleepycat.collections.StoredSortedMap
      +
      +
      Returns a view of the portion of this sorted map whose elements are + strictly greater than fromKey, optionally including fromKey.
      +
      +
      tailSet(Map.Entry<K, V>) - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromMapEntry.
      +
      +
      tailSet(Map.Entry<K, V>, boolean) - Method in class com.sleepycat.collections.StoredSortedEntrySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly greater than fromMapEntry, optionally including fromMapEntry.
      +
      +
      tailSet(K) - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromKey.
      +
      +
      tailSet(K, boolean) - Method in class com.sleepycat.collections.StoredSortedKeySet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly greater than fromKey, optionally including fromKey.
      +
      +
      tailSet(E) - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + greater than or equal to fromValue.
      +
      +
      tailSet(E, boolean) - Method in class com.sleepycat.collections.StoredSortedValueSet
      +
      +
      Returns a view of the portion of this sorted set whose elements are + strictly greater than fromValue, optionally including fromValue.
      +
      +
      ThreadInterruptedException - Exception in com.sleepycat.je
      +
      +
      Thrown when java.lang.InterruptedException (a thread interrupt) or + java.nio.channels.ClosedChannelException (which also results from a + thread interrupt) occurs in any JE method.
      +
      +
      TimeConsistencyPolicy - Class in com.sleepycat.je.rep
      +
      +
      A consistency policy which describes the amount of time the Replica is + allowed to lag the Master.
      +
      +
      TimeConsistencyPolicy(long, TimeUnit, long, TimeUnit) - Constructor for class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
      +
      Specifies the amount of time by which the Replica is allowed to lag the + master when initiating a transaction.
      +
      +
      toArray() - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns an array of all the elements in this collection.
      +
      +
      toArray(T[]) - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns an array of all the elements in this collection whose runtime + type is that of the specified array.
      +
      +
      toByteArray() - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      tokenize(String) - Method in class com.sleepycat.je.util.Splitter
      +
       
      +
      toList() - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Returns a copy of this collection as an ArrayList.
      +
      +
      toReadOptions() - Method in enum com.sleepycat.je.LockMode
      +
      +
      Returns a ReadOptions with this LockMode property, and default values + for all other properties.
      +
      +
      toString() - Method in class com.sleepycat.collections.MapEntryParameter
      +
      +
      Converts the entry to a string representation for debugging.
      +
      +
      toString() - Method in class com.sleepycat.collections.StoredCollection
      +
      +
      Converts the collection to a string representation for debugging.
      +
      +
      toString() - Method in class com.sleepycat.collections.StoredEntrySet
      +
       
      +
      toString() - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Converts the map to a string representation for debugging.
      +
      +
      toString() - Method in class com.sleepycat.je.BtreeStats
      +
      +
      For convenience, the BtreeStats class has a toString method that lists + all the data fields.
      +
      +
      toString() - Method in class com.sleepycat.je.CheckpointConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.CommitToken
      +
       
      +
      toString() - Method in class com.sleepycat.je.CursorConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.DatabaseConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.DatabaseEntry
      +
      +
      Returns all the attributes of the database entry in text form, including + the underlying data.
      +
      +
      toString() - Method in class com.sleepycat.je.DiskOrderedCursorConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.Durability
      +
      +
      Returns the string representation of durability in the format defined + by string form of the Durability constructor.
      +
      +
      toString() - Method in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Display configuration values.
      +
      +
      toString() - Method in class com.sleepycat.je.EnvironmentMutableConfig
      +
      +
      Display configuration values.
      +
      +
      toString() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Returns a String representation of the stats in the form of + <stat>=<value>
      +
      +
      toString() - Method in class com.sleepycat.je.ExceptionEvent
      +
       
      +
      toString() - Method in enum com.sleepycat.je.ForeignKeyDeleteAction
      +
       
      +
      toString() - Method in class com.sleepycat.je.JEVersion
      +
       
      +
      toString() - Method in class com.sleepycat.je.JoinConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in enum com.sleepycat.je.LockMode
      +
       
      +
      toString() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      For convenience, LockTable.toString will display all stats in + an easily readable format.
      +
      +
      toString() - Method in enum com.sleepycat.je.OperationStatus
      +
      toString() - Method in class com.sleepycat.je.PreloadConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.PreloadStats
      +
      +
      Returns a String representation of the stats in the form of + <stat>=<value>
      +
      +
      toString() - Method in class com.sleepycat.je.PreloadStatus
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.arbiter.ArbiterConfig
      +
      +
      Display configuration values.
      +
      +
      toString() - Method in class com.sleepycat.je.rep.arbiter.ArbiterMutableConfig
      +
      +
      Display configuration values.
      +
      +
      toString() - Method in class com.sleepycat.je.rep.CommitPointConsistencyPolicy
      +
       
      +
      toString() - Method in exception com.sleepycat.je.rep.InsufficientLogException
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.monitor.GroupChangeEvent
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.monitor.JoinGroupEvent
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.monitor.LeaveGroupEvent
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.monitor.NewMasterEvent
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.NodeState
      +
       
      +
      toString() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
      +
      Returns a string representation of the statistics.
      +
      +
      toString() - Method in class com.sleepycat.je.rep.ReplicationGroup
      +
      +
      Returns a formatted version of the information held in a + ReplicationGroup.
      +
      +
      toString() - Method in class com.sleepycat.je.rep.ReplicationMutableConfig
      +
      +
      List the configuration parameters and values that have been set + in this configuration object.
      +
      +
      toString() - Method in class com.sleepycat.je.rep.TimeConsistencyPolicy
      +
       
      +
      toString() - Method in class com.sleepycat.je.SecondaryConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.SequenceConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.SequenceStats
      +
       
      +
      toString() - Method in class com.sleepycat.je.StatsConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.Transaction
      +
       
      +
      toString() - Method in class com.sleepycat.je.TransactionConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.je.TransactionStats.Active
      +
       
      +
      toString() - Method in class com.sleepycat.je.TransactionStats
      +
      toString() - Method in class com.sleepycat.je.VerifyConfig
      +
      +
      Returns the values for each configuration attribute.
      +
      +
      toString() - Method in class com.sleepycat.persist.evolve.Converter
      +
       
      +
      toString() - Method in class com.sleepycat.persist.evolve.Deleter
      +
       
      +
      toString() - Method in class com.sleepycat.persist.evolve.EntityConverter
      +
       
      +
      toString() - Method in class com.sleepycat.persist.evolve.Mutation
      +
       
      +
      toString() - Method in class com.sleepycat.persist.evolve.Mutations
      +
       
      +
      toString() - Method in class com.sleepycat.persist.evolve.Renamer
      +
       
      +
      toString() - Method in class com.sleepycat.persist.model.FieldMetadata
      +
       
      +
      toString() - Method in class com.sleepycat.persist.raw.RawObject
      +
      +
      Returns an XML representation of the raw object.
      +
      +
      toString() - Method in interface com.sleepycat.persist.raw.RawType
      +
      +
      Returns an XML representation of the raw type.
      +
      +
      toString() - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      toString(String) - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      toStringVerbose() - Method in class com.sleepycat.je.BtreeStats
      +
       
      +
      toStringVerbose() - Method in class com.sleepycat.je.EnvironmentStats
      +
      +
      Returns a String representation of the stats which includes stats + descriptions in addition to <stat>=<value>
      +
      +
      toStringVerbose() - Method in class com.sleepycat.je.LockStats
      +
      +
      Deprecated.
      +
      Like #toString, display all stats.
      +
      +
      toStringVerbose() - Method in class com.sleepycat.je.rep.ReplicatedEnvironmentStats
      +
       
      +
      toStringVerbose() - Method in class com.sleepycat.je.SequenceStats
      +
       
      +
      toStringVerbose() - Method in class com.sleepycat.je.TransactionStats
      +
       
      +
      TRACE_CONSOLE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      in favor of CONSOLE_LOGGING_LEVEL As of JE + 4.0, use the standard java.util.logging configuration + methodologies. To enable console output, set + com.sleepycat.je.util.ConsoleHandler.level = <LEVEL> through + the java.util.logging configuration file, or through the + java.util.logging.LogManager. To set the handler level programmatically, + set "com.sleepycat.je.util.ConsoleHandler.level" in the + EnvironmentConfig object.
      +
      +
      +
      TRACE_DB - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, event tracing to the .jdb files has been + separated from the java.util.logging mechanism. This parameter has + no effect.
      +
      +
      +
      TRACE_FILE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      in favor of FILE_LOGGING_LEVEL As of JE 4.0, + use the standard java.util.logging configuration methodologies. To + enable logging output to the je.info files, set + com.sleepycat.je.util.FileHandler.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager. To set the handler level programmatically, + set "com.sleepycat.je.util.FileHandler.level" in the EnvironmentConfig + object.
      +
      +
      +
      TRACE_FILE_COUNT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. To set the FileHandler output file count, + set com.sleepycat.je.util.FileHandler.count = <NUMBER> + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      TRACE_FILE_LIMIT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. To set the FileHandler output file size, + set com.sleepycat.je.util.FileHandler.limit = <NUMBER> + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      TRACE_LEVEL - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. Set logging levels using class names + through the java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      TRACE_LEVEL_CLEANER - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see cleaner logging, set + com.sleepycat.je.cleaner.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      TRACE_LEVEL_EVICTOR - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see evictor logging, set + com.sleepycat.je.evictor.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      TRACE_LEVEL_LOCK_MANAGER - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see locking logging, set + com.sleepycat.je.txn.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      TRACE_LEVEL_RECOVERY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      As of JE 4.0, use the standard java.util.logging + configuration methodologies. To see recovery logging, set + com.sleepycat.je.recovery.level = <LEVEL> through the + java.util.logging configuration file, or through the + java.util.logging.LogManager.
      +
      +
      +
      Transaction - Class in com.sleepycat.je
      +
      +
      The Transaction object is the handle for a transaction.
      +
      +
      Transaction.State - Enum in com.sleepycat.je
      +
      +
      The current state of the transaction.
      +
      +
      TransactionConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a database environment transaction.
      +
      +
      TransactionConfig() - Constructor for class com.sleepycat.je.TransactionConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      TransactionRunner - Class in com.sleepycat.collections
      +
      +
      Starts a transaction, calls TransactionWorker.doWork(), and handles + transaction retry and exceptions.
      +
      +
      TransactionRunner(Environment) - Constructor for class com.sleepycat.collections.TransactionRunner
      +
      +
      Creates a transaction runner for a given Berkeley DB environment.
      +
      +
      TransactionRunner(Environment, int, TransactionConfig) - Constructor for class com.sleepycat.collections.TransactionRunner
      +
      +
      Creates a transaction runner for a given Berkeley DB environment and + with a given number of maximum retries.
      +
      +
      TransactionStats - Class in com.sleepycat.je
      +
      +
      Transaction statistics for a database environment.
      +
      +
      TransactionStats.Active - Class in com.sleepycat.je
      +
      +
      The Active class represents an active transaction.
      +
      +
      TransactionTimeoutException - Exception in com.sleepycat.je
      +
      +
      Thrown when the transaction timeout interval is exceeded.
      +
      +
      TransactionWorker - Interface in com.sleepycat.collections
      +
      +
      The interface implemented to perform the work within a transaction.
      +
      +
      transferMaster(Set<String>, int, TimeUnit) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Transfers the current master state from this node to one of the + electable replicas supplied in the argument list.
      +
      +
      transferMaster(Set<String>, int, TimeUnit, boolean) - Method in class com.sleepycat.je.rep.ReplicatedEnvironment
      +
      +
      Transfers the current master state from this node to one of the replicas + supplied in the argument list.
      +
      +
      transferMaster(String, String) - Method in class com.sleepycat.je.rep.util.DbGroupAdmin
      +
      +
      Transfers the master role from the current master to one of the + electable replicas specified in the argument list.
      +
      +
      transferMaster(Set<String>, int, TimeUnit, boolean) - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Transfers the master state from the current master to one of the + electable replicas supplied in the argument list.
      +
      +
      transform(ClassLoader, String, Class<?>, ProtectionDomain, byte[]) - Method in class com.sleepycat.persist.model.ClassEnhancer
      +
       
      +
      TREE_BIN_DELTA - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      If more than this percentage of entries are changed on a BIN, log a a + full version instead of a delta.
      +
      +
      TREE_COMPACT_MAX_KEY_LENGTH - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Specifies the maximum unprefixed key length for use in the compact + in-memory key representation.
      +
      +
      TREE_MAX_DELTA - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Deprecated. +
      as of JE 6.0. The EnvironmentConfig.TREE_BIN_DELTA param alone now + determines whether a delta is logged.
      +
      +
      +
      TREE_MAX_EMBEDDED_LN - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The maximum size (in bytes) of a record's data portion that will cause + the record to be embedded in its parent LN.
      +
      +
      TREE_MIN_MEMORY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The minimum bytes allocated out of the memory cache to hold Btree data + including internal nodes and record keys and data.
      +
      +
      truncateClass(Class) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Deletes all instances of this entity class and its (non-entity) + subclasses.
      +
      +
      truncateClass(Transaction, Class) - Method in class com.sleepycat.persist.EntityStore
      +
      +
      Deletes all instances of this entity class and its (non-entity) + subclasses.
      +
      +
      truncateDatabase(Transaction, String, boolean) - Method in class com.sleepycat.je.Environment
      +
      +
      Empties the database, discarding all the records it contains, without + removing the database name.
      +
      +
      truncateDatabase(String, boolean) - Method in class com.sleepycat.je.jca.ra.JEConnection
      +
       
      +
      TupleBase<E> - Class in com.sleepycat.bind.tuple
      +
      +
      A base class for tuple bindings and tuple key creators that provides control + over the allocation of the output buffer.
      +
      +
      TupleBase() - Constructor for class com.sleepycat.bind.tuple.TupleBase
      +
      +
      Initializes the initial output buffer size to zero.
      +
      +
      TupleBinding<E> - Class in com.sleepycat.bind.tuple
      +
      +
      An abstract EntryBinding that treats a key or data entry as a + tuple; it includes predefined bindings for Java primitive types.
      +
      +
      TupleBinding() - Constructor for class com.sleepycat.bind.tuple.TupleBinding
      +
      +
      Creates a tuple binding.
      +
      +
      TupleInput - Class in com.sleepycat.bind.tuple
      +
      +
      An InputStream with DataInput-like methods for + reading tuple fields.
      +
      +
      TupleInput(byte[]) - Constructor for class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Creates a tuple input object for reading a byte array of tuple data.
      +
      +
      TupleInput(byte[], int, int) - Constructor for class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Creates a tuple input object for reading a byte array of tuple data at + a given offset for a given length.
      +
      +
      TupleInput(TupleOutput) - Constructor for class com.sleepycat.bind.tuple.TupleInput
      +
      +
      Creates a tuple input object from the data contained in a tuple output + object.
      +
      +
      TupleInputBinding - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete EntryBinding that uses the TupleInput + object as the key or data object.
      +
      +
      TupleInputBinding() - Constructor for class com.sleepycat.bind.tuple.TupleInputBinding
      +
      +
      Creates a tuple input binding.
      +
      +
      TupleMarshalledBinding<E extends MarshalledTupleEntry> - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleBinding that delegates to the + MarshalledTupleEntry interface of the data or key object.
      +
      +
      TupleMarshalledBinding(Class<E>) - Constructor for class com.sleepycat.bind.tuple.TupleMarshalledBinding
      +
      +
      Creates a tuple marshalled binding object.
      +
      +
      TupleOutput - Class in com.sleepycat.bind.tuple
      +
      +
      An OutputStream with DataOutput-like methods for + writing tuple fields.
      +
      +
      TupleOutput() - Constructor for class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Creates a tuple output object for writing a byte array of tuple data.
      +
      +
      TupleOutput(byte[]) - Constructor for class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Creates a tuple output object for writing a byte array of tuple data, + using a given buffer.
      +
      +
      TupleSerialBinding<D,E> - Class in com.sleepycat.bind.serial
      +
      +
      An abstract EntityBinding that treats an entity's key entry as + a tuple and its data entry as a serialized object.
      +
      +
      TupleSerialBinding(ClassCatalog, Class<D>) - Constructor for class com.sleepycat.bind.serial.TupleSerialBinding
      +
      +
      Creates a tuple-serial entity binding.
      +
      +
      TupleSerialBinding(SerialBinding<D>) - Constructor for class com.sleepycat.bind.serial.TupleSerialBinding
      +
      +
      Creates a tuple-serial entity binding.
      +
      +
      TupleSerialFactory - Class in com.sleepycat.collections
      +
      +
      Creates stored collections having tuple keys and serialized entity values.
      +
      +
      TupleSerialFactory(ClassCatalog) - Constructor for class com.sleepycat.collections.TupleSerialFactory
      +
      +
      Creates a tuple-serial factory for given environment and class catalog.
      +
      +
      TupleSerialKeyCreator<D> - Class in com.sleepycat.bind.serial
      +
      +
      A abstract key creator that uses a tuple key and a serial data entry.
      +
      +
      TupleSerialKeyCreator(ClassCatalog, Class<D>) - Constructor for class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
      +
      Creates a tuple-serial key creator.
      +
      +
      TupleSerialKeyCreator(SerialBinding<D>) - Constructor for class com.sleepycat.bind.serial.TupleSerialKeyCreator
      +
      +
      Creates a tuple-serial key creator.
      +
      +
      TupleSerialMarshalledBinding<E extends MarshalledTupleKeyEntity> - Class in com.sleepycat.bind.serial
      +
      +
      A concrete TupleSerialBinding that delegates to the + MarshalledTupleKeyEntity interface of the entity class.
      +
      +
      TupleSerialMarshalledBinding(ClassCatalog, Class<E>) - Constructor for class com.sleepycat.bind.serial.TupleSerialMarshalledBinding
      +
      +
      Creates a tuple-serial marshalled binding object.
      +
      +
      TupleSerialMarshalledBinding(SerialBinding<E>) - Constructor for class com.sleepycat.bind.serial.TupleSerialMarshalledBinding
      +
      +
      Creates a tuple-serial marshalled binding object.
      +
      +
      TupleSerialMarshalledKeyCreator<D extends MarshalledTupleKeyEntity> - Class in com.sleepycat.bind.serial
      +
      +
      A concrete key creator that works in conjunction with a TupleSerialMarshalledBinding.
      +
      +
      TupleSerialMarshalledKeyCreator(TupleSerialMarshalledBinding<D>, String) - Constructor for class com.sleepycat.bind.serial.TupleSerialMarshalledKeyCreator
      +
      +
      Creates a tuple-serial marshalled key creator.
      +
      +
      TupleTupleBinding<E> - Class in com.sleepycat.bind.tuple
      +
      +
      An abstract EntityBinding that treats an entity's key entry and + data entry as tuples.
      +
      +
      TupleTupleBinding() - Constructor for class com.sleepycat.bind.tuple.TupleTupleBinding
      +
      +
      Creates a tuple-tuple entity binding.
      +
      +
      TupleTupleKeyCreator<E> - Class in com.sleepycat.bind.tuple
      +
      +
      An abstract key creator that uses a tuple key and a tuple data entry.
      +
      +
      TupleTupleKeyCreator() - Constructor for class com.sleepycat.bind.tuple.TupleTupleKeyCreator
      +
      +
      Creates a tuple-tuple key creator.
      +
      +
      TupleTupleMarshalledBinding<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity> - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete TupleTupleBinding that delegates to the + MarshalledTupleEntry and + MarshalledTupleKeyEntity interfaces of the entity class.
      +
      +
      TupleTupleMarshalledBinding(Class<E>) - Constructor for class com.sleepycat.bind.tuple.TupleTupleMarshalledBinding
      +
      +
      Creates a tuple-tuple marshalled binding object.
      +
      +
      TupleTupleMarshalledKeyCreator<E extends MarshalledTupleEntry & MarshalledTupleKeyEntity> - Class in com.sleepycat.bind.tuple
      +
      +
      A concrete key creator that works in conjunction with a TupleTupleMarshalledBinding.
      +
      +
      TupleTupleMarshalledKeyCreator(TupleTupleMarshalledBinding<E>, String) - Constructor for class com.sleepycat.bind.tuple.TupleTupleMarshalledKeyCreator
      +
      +
      Creates a tuple-tuple marshalled key creator.
      +
      +
      TXN_DEADLOCK_STACK_TRACE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Set this parameter to true to add stacktrace information to deadlock + (lock timeout) exception messages.
      +
      +
      TXN_DUMP_LOCKS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Dump the lock table when a lock timeout is encountered, for debugging + assistance.
      +
      +
      TXN_DURABILITY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the default durability associated with transactions.
      +
      +
      TXN_ROLLBACK_DISABLED - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      In rare cases, a node may need to rollback committed transactions in + order to rejoin a replication group.
      +
      +
      TXN_ROLLBACK_LIMIT - Static variable in class com.sleepycat.je.rep.ReplicationConfig
      +
      +
      In rare cases, a node may need to rollback committed transactions in + order to rejoin a replication group.
      +
      +
      TXN_SERIALIZABLE_ISOLATION - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures all transactions for this environment to have Serializable + (Degree 3) isolation.
      +
      +
      TXN_TIMEOUT - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Configures the transaction timeout.
      +
      +
      + + + +

      U

      +
      +
      UniqueConstraintException - Exception in com.sleepycat.je
      +
      +
      Thrown when an attempt to write a primary database record would insert a + secondary record with a duplicate key, for secondaries that represent + one-to-one and one-to-many relationships.
      +
      +
      UnknownMasterException - Exception in com.sleepycat.je.rep
      +
      +
      Indicates that the underlying operation requires communication with a + Master, but that a Master was not available.
      +
      +
      UnknownMasterException(Locker, StateChangeEvent) - Constructor for exception com.sleepycat.je.rep.UnknownMasterException
      +
       
      +
      UnknownMasterException(String) - Constructor for exception com.sleepycat.je.rep.UnknownMasterException
      +
      +
      Used when the inability to determine a master is not related to a + state change.
      +
      +
      UnknownMasterException(String, Exception) - Constructor for exception com.sleepycat.je.rep.UnknownMasterException
      +
      +
      Used when the inability to determine a master is not related to a + state change but some inability to communicate with a node identified + as a master.
      +
      +
      unmarshalEntry(TupleInput) - Method in interface com.sleepycat.bind.tuple.MarshalledTupleEntry
      +
      +
      Construct the key or data object from the key or data tuple entry.
      +
      +
      unmarshalPrimaryKey(TupleInput) - Method in interface com.sleepycat.bind.tuple.MarshalledTupleKeyEntity
      +
      +
      Completes construction of the entity by setting its primary key from the + stored primary key.
      +
      +
      unwrap(Exception) - Static method in class com.sleepycat.util.ExceptionUnwrapper
      +
      +
      Unwraps an Exception and returns the underlying Exception, or throws an + Error if the underlying Throwable is an Error.
      +
      +
      unwrapAny(Throwable) - Static method in class com.sleepycat.util.ExceptionUnwrapper
      +
      +
      Unwraps an Exception and returns the underlying Throwable.
      +
      +
      update(V) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Replaces the entity at the cursor position with the given entity.
      +
      +
      update(V, WriteOptions) - Method in interface com.sleepycat.persist.EntityCursor
      +
      +
      Replaces the entity at the cursor position with the given entity, + using a WriteOptions parameter and returning an OperationResult.
      +
      +
      updateAddress(String, String, int) - Method in class com.sleepycat.je.rep.util.DbGroupAdmin
      +
      +
      Update the network address for a specified node.
      +
      +
      updateAddress(String, String, int) - Method in class com.sleepycat.je.rep.util.ReplicationGroupAdmin
      +
      +
      Update the network address for a specified member of the replication + group.
      +
      +
      updateMax(long) - Method in class com.sleepycat.je.rep.util.AtomicLongMax
      +
      +
      Updates the max value if the argument is greater than the current max.
      +
      +
      USER_HALT_REQUEST - Static variable in class com.sleepycat.je.PreloadStatus
      +
      +
      The user requested that preload stop during a call to + ProgressListener.progress().
      +
      +
      UtfOps - Class in com.sleepycat.util
      +
      +
      UTF operations with more flexibility than is provided by DataInput and + DataOutput.
      +
      +
      UtfOps() - Constructor for class com.sleepycat.util.UtfOps
      +
       
      +
      + + + +

      V

      +
      +
      value() - Method in class com.sleepycat.persist.EntityResult
      +
      +
      Returns the entity value resulting from the operation.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.CacheMode
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.Durability.ReplicaAckPolicy
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.Durability.SyncPolicy
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.ForeignKeyDeleteAction
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.Get
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.LockMode
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.OperationStatus
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.PreloadConfig.Phases
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.Put
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.RecoveryProgress
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.rep.monitor.GroupChangeEvent.GroupChangeType
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.rep.monitor.LeaveGroupEvent.LeaveReason
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.rep.QuorumPolicy
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.rep.SyncupProgress
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.je.Transaction.State
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.persist.model.DeleteAction
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      valueOf(String) - Static method in enum com.sleepycat.persist.model.Relationship
      +
      +
      Returns the enum constant of this type with the specified name.
      +
      +
      values() - Method in class com.sleepycat.collections.StoredMap
      +
      +
      Returns a collection view of the values contained in this map.
      +
      +
      values() - Static method in enum com.sleepycat.je.CacheMode
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.Durability.ReplicaAckPolicy
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.Durability.SyncPolicy
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.ForeignKeyDeleteAction
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.Get
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.LockMode
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.OperationStatus
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.PreloadConfig.Phases
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.Put
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.RecoveryProgress
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.rep.monitor.GroupChangeEvent.GroupChangeType
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.rep.monitor.LeaveGroupEvent.LeaveReason
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.rep.NodeType
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.rep.QuorumPolicy
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.rep.ReplicatedEnvironment.State
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.rep.SyncupProgress
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.je.Transaction.State
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.persist.model.DeleteAction
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      values() - Static method in enum com.sleepycat.persist.model.Relationship
      +
      +
      Returns an array containing the constants of this enum type, in +the order they are declared.
      +
      +
      verbose - Variable in class com.sleepycat.je.util.DbDump
      +
       
      +
      verify(VerifyConfig) - Method in class com.sleepycat.je.Database
      +
      +
      Verifies the integrity of the database.
      +
      +
      verify(VerifyConfig, PrintStream) - Method in class com.sleepycat.je.Environment
      +
      +
      Returns if the database environment is consistent and correct.
      +
      +
      verify(PrintStream) - Method in class com.sleepycat.je.util.DbVerify
      +
      +
      Deprecated. + +
      +
      +
      verify(long, long) - Method in class com.sleepycat.je.util.DbVerifyLog
      +
      +
      Verifies the given range of log files in the environment.
      +
      +
      VERIFY_BTREE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Whether the background verifier should perform Btree verification, + as if the DbVerify utility were run.
      +
      +
      VERIFY_BTREE_BATCH_DELAY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The delay between batches during Btree + verification.
      +
      +
      VERIFY_BTREE_BATCH_SIZE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The number of records verified per batch during Btree verification.
      +
      +
      VERIFY_DATA_RECORDS - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Whether to verify data records (leaf nodes, or LNs) during Btree + verification.
      +
      +
      VERIFY_LOG - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Whether the background verifier should verify checksums in the log, + as if the DbVerifyLog utility were run.
      +
      +
      VERIFY_LOG_READ_DELAY - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      The delay between reads during log verification.
      +
      +
      VERIFY_SCHEDULE - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      A crontab-format string indicating when to start the background + verifier.
      +
      +
      VERIFY_SECONDARIES - Static variable in class com.sleepycat.je.EnvironmentConfig
      +
      +
      Whether to verify secondary index references during Btree verification.
      +
      +
      verifyAll() - Method in class com.sleepycat.je.util.DbVerifyLog
      +
      +
      Verifies all log files in the environment.
      +
      +
      VerifyConfig - Class in com.sleepycat.je
      +
      +
      Specifies the attributes of a verification operation.
      +
      +
      VerifyConfig() - Constructor for class com.sleepycat.je.VerifyConfig
      +
      +
      An instance created using the default constructor is initialized with + the system's default settings.
      +
      +
      VersionMismatchException - Exception in com.sleepycat.je
      +
      +
      Thrown by the Environment constructor when an environment cannot be + opened because the version of the existing log is not compatible with the + version of JE that is running.
      +
      +
      + + + +

      W

      +
      +
      wrapIfNeeded(Throwable) - Static method in exception com.sleepycat.util.RuntimeExceptionWrapper
      +
      +
      Wraps the given exception if it is not a RuntimeException.
      +
      +
      write(int) - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      write(byte[]) - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      write(byte[], int, int) - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      writeBigDecimal(BigDecimal) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsorted BigDecimal.
      +
      +
      writeBigInteger(BigInteger) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a BigInteger.
      +
      +
      writeBoolean(boolean) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a boolean (one byte) unsigned value to the buffer, writing one + if the value is true and zero if it is false.
      +
      +
      writeByte(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an signed byte (one byte) value to the buffer.
      +
      +
      writeBytes(String) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes the specified bytes to the buffer, converting each character to + an unsigned byte value.
      +
      +
      writeBytes(char[]) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes the specified bytes to the buffer, converting each character to + an unsigned byte value.
      +
      +
      writeChar(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a char (two byte) unsigned value to the buffer.
      +
      +
      writeChars(String) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes the specified characters to the buffer, converting each character + to a two byte unsigned value.
      +
      +
      writeChars(char[]) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes the specified characters to the buffer, converting each character + to a two byte unsigned value.
      +
      +
      writeClassDescriptor(ObjectStreamClass) - Method in class com.sleepycat.bind.serial.SerialOutput
      +
       
      +
      writeDouble(double) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsorted double (eight byte) value to the buffer.
      +
      +
      writeFast(int) - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Equivalent to write(int) but does not throw + IOException.
      +
      +
      writeFast(byte[]) - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Equivalent to write(byte[]) but does not throw + IOException.
      +
      +
      writeFast(byte[], int, int) - Method in class com.sleepycat.util.FastOutputStream
      +
      +
      Equivalent to write(byte[],int,int) but does not throw + IOException.
      +
      +
      writeFloat(float) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsorted float (four byte) value to the buffer.
      +
      +
      writeInt(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an signed int (four byte) value to the buffer.
      +
      +
      writeInt(byte[], int, int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Writes a packed integer starting at the given buffer offset and returns + the next offset to be written.
      +
      +
      writeLong(long) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an signed long (eight byte) value to the buffer.
      +
      +
      writeLong(byte[], int, long) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Writes a packed long integer starting at the given buffer offset and + returns the next offset to be written.
      +
      +
      WriteOptions - Class in com.sleepycat.je
      +
      +
      Options for calling methods that write (insert, update or delete) records.
      +
      +
      WriteOptions() - Constructor for class com.sleepycat.je.WriteOptions
      +
      +
      Constructs a WriteOptions object with default values for all properties.
      +
      +
      writePackedInt(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsorted packed integer.
      +
      +
      writePackedLong(long) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsorted packed long integer.
      +
      +
      writeShort(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an signed short (two byte) value to the buffer.
      +
      +
      writeSortedBigDecimal(BigDecimal) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a sorted BigDecimal.
      +
      +
      writeSortedDouble(double) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a sorted double (eight byte) value to the buffer.
      +
      +
      writeSortedFloat(float) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a sorted float (four byte) value to the buffer.
      +
      +
      writeSortedInt(byte[], int, int) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Writes a packed sorted integer starting at the given buffer offset and + returns the next offset to be written.
      +
      +
      writeSortedLong(byte[], int, long) - Static method in class com.sleepycat.util.PackedInteger
      +
      +
      Writes a packed sorted long integer starting at the given buffer offset + and returns the next offset to be written.
      +
      +
      writeSortedPackedInt(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a sorted packed integer.
      +
      +
      writeSortedPackedLong(long) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes a sorted packed long integer.
      +
      +
      writeString(String) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes the specified characters to the buffer, converting each character + to UTF format, and adding a null terminator byte.
      +
      +
      writeString(char[]) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes the specified characters to the buffer, converting each character + to UTF format.
      +
      +
      writeTo(OutputStream) - Method in class com.sleepycat.util.FastOutputStream
      +
       
      +
      writeUnsignedByte(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsigned byte (one byte) value to the buffer.
      +
      +
      writeUnsignedInt(long) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsigned int (four byte) value to the buffer.
      +
      +
      writeUnsignedShort(int) - Method in class com.sleepycat.bind.tuple.TupleOutput
      +
      +
      Writes an unsigned short (two byte) value to the buffer.
      +
      +
      + + + +

      X

      +
      +
      XAEnvironment - Class in com.sleepycat.je
      +
      +
      An Environment that implements XAResource.
      +
      +
      XAEnvironment(File, EnvironmentConfig) - Constructor for class com.sleepycat.je.XAEnvironment
      +
      +
      Create a database environment handle.
      +
      +
      XAFailureException - Exception in com.sleepycat.je
      +
      +
      Thrown if an attempt is made to use a Transaction after it has been + invalidated as the result of an XA failure.
      +
      +
      +A B C D E F G H I J K L M N O P Q R S T U V W X 
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/index.html b/docs/java/index.html new file mode 100644 index 0000000..34a2012 --- /dev/null +++ b/docs/java/index.html @@ -0,0 +1,75 @@ + + + + + +Oracle - Berkeley DB Java Edition API + + + + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> + + + diff --git a/docs/java/overview-frame.html b/docs/java/overview-frame.html new file mode 100644 index 0000000..11bb2ec --- /dev/null +++ b/docs/java/overview-frame.html @@ -0,0 +1,39 @@ + + + + + +Overview List (Oracle - Berkeley DB Java Edition API) + + + + + +

      Berkeley DB Java Edition
      version 7.5.11 +

      + + +

       

      + + diff --git a/docs/java/overview-summary.html b/docs/java/overview-summary.html new file mode 100644 index 0000000..c974ad6 --- /dev/null +++ b/docs/java/overview-summary.html @@ -0,0 +1,270 @@ + + + + + +Overview (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Berkeley DB Java Edition Packages 
      PackageDescription
      com.sleepycat.je +
      Foundation for creating environments, databases and transactions; provides +cursor based data access.
      +
      com.sleepycat.je.jca.ra +
      Support for the Java Connector Architecture, which provides a standard +for connecting the J2EE platform to legacy enterprise information +systems (EIS), such as ERP systems, database systems, and legacy +applications not written in Java.
      +
      com.sleepycat.je.jmx +
      Implementations of JMX MBeans for JE.
      +
      com.sleepycat.je.rep +
      +Berkeley DB Java Edition High Availability (JE HA) enables replication of JE +environments.
      +
      com.sleepycat.je.rep.arbiter +
      Provides a mechanism to allow write availability for the Replication +group even when the number of replication nodes is less than majority.
      +
      com.sleepycat.je.rep.monitor +
      BDB JE HA support for applications that need to track the composition of a +replication group, in order to do tasks such as load balancing and +request routing.
      +
      com.sleepycat.je.rep.util +
      BDB JE High Availability command line utilities and helper classes.
      +
      com.sleepycat.je.util +
      Supporting utilities.
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      Berkeley DB Direct Persistence Layer (DPL) Packages 
      PackageDescription
      com.sleepycat.persist +
      The Direct Persistence Layer (DPL) adds a persistent object model to the +Berkeley DB transactional engine.
      +
      com.sleepycat.persist.evolve +
      Utilities for managing class evolution of persistent objects.
      +
      com.sleepycat.persist.model +
      Annotations for defining a persistent object model.
      +
      com.sleepycat.persist.raw +
      Raw data access for general purpose tools and manual conversions.
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Berkeley DB Bind and Collections Packages 
      PackageDescription
      com.sleepycat.bind +
      Bindings between database entries and Java objects.
      +
      com.sleepycat.bind.serial +
      Bindings that use Java serialization.
      +
      com.sleepycat.bind.tuple +
      Bindings that use sequences of primitive fields, or tuples.
      +
      com.sleepycat.collections +
      Data access based on the standard Java collections API.
      +
      com.sleepycat.util +
      General utilities used throughout Berkeley DB.
      +
      +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/overview-tree.html b/docs/java/overview-tree.html new file mode 100644 index 0000000..c02ce5f --- /dev/null +++ b/docs/java/overview-tree.html @@ -0,0 +1,720 @@ + + + + + +Class Hierarchy (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + + +
      +

      Class Hierarchy

      + +

      Interface Hierarchy

      + +

      Annotation Type Hierarchy

      +
        +
      • com.sleepycat.persist.model.NotTransient (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.Entity (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.KeyField (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.PrimaryKey (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.SecondaryKey (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.Persistent (implements java.lang.annotation.Annotation)
      • +
      • com.sleepycat.persist.model.NotPersistent (implements java.lang.annotation.Annotation)
      • +
      +

      Enum Hierarchy

      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/package-list b/docs/java/package-list new file mode 100644 index 0000000..4f7bbd7 --- /dev/null +++ b/docs/java/package-list @@ -0,0 +1,17 @@ +com.sleepycat.bind +com.sleepycat.bind.serial +com.sleepycat.bind.tuple +com.sleepycat.collections +com.sleepycat.je +com.sleepycat.je.jca.ra +com.sleepycat.je.jmx +com.sleepycat.je.rep +com.sleepycat.je.rep.arbiter +com.sleepycat.je.rep.monitor +com.sleepycat.je.rep.util +com.sleepycat.je.util +com.sleepycat.persist +com.sleepycat.persist.evolve +com.sleepycat.persist.model +com.sleepycat.persist.raw +com.sleepycat.util diff --git a/docs/java/script.js b/docs/java/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/docs/java/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/docs/java/serialized-form.html b/docs/java/serialized-form.html new file mode 100644 index 0000000..1e58755 --- /dev/null +++ b/docs/java/serialized-form.html @@ -0,0 +1,1820 @@ + + + + + +Serialized Form (Oracle - Berkeley DB Java Edition API) + + + + + + + + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +
      +

      Serialized Form

      +
      +
      + +
      + +
      + + + + + + + +
      Berkeley DB Java Edition
      version 7.5.11 +
      +
      + + +

      Copyright (c) 2002, 2017 Oracle and/or its affiliates. All rights reserved.

      + + diff --git a/docs/java/standard-stylesheet.css b/docs/java/standard-stylesheet.css new file mode 100644 index 0000000..98055b2 --- /dev/null +++ b/docs/java/standard-stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/docs/java/style.css b/docs/java/style.css new file mode 100644 index 0000000..9dc28c5 --- /dev/null +++ b/docs/java/style.css @@ -0,0 +1,15 @@ +/* Javadoc style sheet for Java 7 and later versions */ + +/* Import standard style sheet for defaults */ +@import url('standard-stylesheet.css'); + +/* + * Modify the style for code samples to use a pale blue background with + * a thin, medium blue border that matches the style of various + * headings. + */ +pre.code { + border: 1px solid #9eadc0; /* Medium blue */ + padding: 2px; + background-color: #dee3e9; /* Pale blue */ +} diff --git a/docs/jconsole/Choose-MBean.JPG b/docs/jconsole/Choose-MBean.JPG new file mode 100644 index 0000000000000000000000000000000000000000..1540394ef4c9a4d62b77d10605a73930616e13cd GIT binary patch literal 82411 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 literal 0 HcmV?d00001 diff --git a/docs/jconsole/Choose-group.JPG b/docs/jconsole/Choose-group.JPG new file mode 100644 index 0000000000000000000000000000000000000000..cfd100e6aef488c8ce34d4cbcdad04d2d9c808f5 GIT binary patch literal 56467 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�U!PC^gzft4H%-(i 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“ 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 XJLKqw<;hj4NcXujt%ytHe;)W3{4NQO literal 0 HcmV?d00001 diff --git a/docs/jconsole/JConsole-plugin.html b/docs/jconsole/JConsole-plugin.html new file mode 100644 index 0000000..cb0b009 --- /dev/null +++ b/docs/jconsole/JConsole-plugin.html @@ -0,0 +1,407 @@ + + + + + Berkeley DB Java Edition MBeans and JConsole Plugin + + + +

      diff --git a/docs/jconsole/JEDiagnostics-attributes.JPG b/docs/jconsole/JEDiagnostics-attributes.JPG new file mode 100644 index 0000000000000000000000000000000000000000..bf24e391b1383ef4c74d1c43c680e09734f18c47 GIT binary patch literal 54025 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 literal 0 HcmV?d00001 diff --git a/docs/jconsole/JEDiagnostics-operations.JPG b/docs/jconsole/JEDiagnostics-operations.JPG new file mode 100644 index 0000000000000000000000000000000000000000..17b0a7aae65a6701a268fa09017452c42590ecbd GIT binary patch literal 48473 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 A4FCWD literal 0 HcmV?d00001 diff --git a/docs/jconsole/JEMonitor-attributes.JPG b/docs/jconsole/JEMonitor-attributes.JPG new file mode 100644 index 0000000000000000000000000000000000000000..5edde41fe3f2fb4bd9556ddf5032faedf9ba895a GIT binary patch literal 63660 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%0Ap}PYi-Q7lJeC7o5`2YT$}1$A`UzjL|AFc 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

      pDViKQ2vi-I&Zq#jEu`)kOTxMa902Pgy8p@g$S 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�=pd8aZ6C1r%~=aoaqZySsGtJYjcKa&XU(!L-x4HKljR+4rAx}@G(Dg zP)W06iFc*_2gBG$6Oxv%!gprMM=1y?)%8N0?hSnbdA(0|?E%*SBxFE9iGQ-+F-6qe zhGe&d;zdC$bA&=TnY79N25-CqhE2RwK$iozHrTm3 zToqpUT+&Grf?bckfG*bfPe1X`y)gU&I=njq#Crl9YV+yIiN}0c1s4qy(xtBTLqHhl zDsissj1h3#^>k!@I>HmtH9N@qLV50l>__FQJIBpm`D)yy0gQPJIL!IaXRZ#APk{yyod6}8cx4Vg^SLxk z4&HQTFgWokPPF(#jjr|61N;EM3ecg|08{uq%9IO2#IdWnt+Yx0Idh}L17N2C1e}bn zfrLM{UDNDG32v!Bc6D$vI>Di6ioY-GQ#}HIi~@D$onA9%xcXsb3rqw=F#7{T>=Qzy zx|WlZ$_YiuX;F%rSd|&8flGzG7~T`hke5+CFQP^k2!aiaZWl7VBJpMogz!M~f`U3t zPxcAdW-quHr9Q%vGe6aMsd;$_OjoUg>$QY!*IWv#IV2i00SDp8<0Jy*QPt&g=z$mCrD>J@U_8*8KTj%J+Ju zd_6nbM}F}QV6109w&}T-3-l)e_~;ZFfN5h0p??A8S-2!lHvofs1I%r~PhX4tJY00y zD}PV0(#hxZCMiHPh(Fi$XN5Px$AromlYi*opNrVw7xjw$LrX&F|FS4jF0kOnt~UAd zo&wur1DMqnU{1hLfSPZT{mXjM{vf&FKgjsH;>+AW74rXP(cike`LA^M3n=p68QvdO z(4Wr;u;~9}wf%Y7U(Me2s-XP>>X6v^x(ky1qQkXOPhByu*TuK0F1~NI-}cOJg=O1z zgEzsn-{uccD5)nu%pRbK5~63mEoBVN(Nd{DEc=?9o%Saaa_he!+<()4k+2*cGSP3F3vP>Hs8Ne^zYLw|EP$LU7e7#8Z7yfETqo~n?kt?%oSa~jQuayaTcHe literal 0 HcmV?d00001 diff --git a/docs/jconsole/JEStats-plugin.JPG b/docs/jconsole/JEStats-plugin.JPG new file mode 100644 index 0000000000000000000000000000000000000000..200ef07a5ac04d65de574ce0fc202b5d034d3078 GIT binary patch literal 78574 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≻>_!su?(yc@PZ0dV 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 literal 0 HcmV?d00001 diff --git a/docs/jconsole/MBean-operations.JPG b/docs/jconsole/MBean-operations.JPG new file mode 100644 index 0000000000000000000000000000000000000000..2c5be7e81b4e20c18136cbc9a8f9ca9162d48551 GIT binary patch literal 60617 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%0D96~_pR%z+(ZbZ6UT3R|pn&Ca@6Fm3c=e@t* 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 literal 0 HcmV?d00001 diff --git a/docs/jconsole/Mutable-configs.JPG b/docs/jconsole/Mutable-configs.JPG new file mode 100644 index 0000000000000000000000000000000000000000..49fb0162a9446845cf1122ae3e09cfbdd0a05c7e GIT binary patch literal 56813 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 literal 0 HcmV?d00001 diff --git a/docs/jconsole/Non-zero.JPG b/docs/jconsole/Non-zero.JPG new file mode 100644 index 0000000000000000000000000000000000000000..bb87b4407d402d7eabdc30a6969b4d01de51250a GIT binary patch literal 77433 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“ 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�BoaPK{FhVbzqiQLsutHZ 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 literal 0 HcmV?d00001 diff --git a/docs/jconsole/RepJEMonitor-operations.JPG b/docs/jconsole/RepJEMonitor-operations.JPG new file mode 100644 index 0000000000000000000000000000000000000000..ebc67fc5b5d9884b17d5d1743468c241a3734984 GIT binary patch literal 67624 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

      + +
      +

      Monitoring and Debugging Berkeley DB Java Edition with JMX

      +
      + +
      Monitoring and Diagnostic MBeans
      +Displaying Statistics Graphically With the JE + JConsole Plugin
      + + +
      +

      Monitoring and Diagnostic MBeans

      + +

      Overview

      +

      +Berkeley DB Java Edition provides monitoring and debugging support +through four JMX Dynamic MBeans. JEMonitor and RepJEMonitor make JE +statistics and basic administrative operations available, and are +mainly used for monitoring a JE application. JEDiagnostics and +RepJEDiagnostics makes JE logging output configurable dynamically, and +are mainly used for debugging. +

      +

      +A non-replicated (non-HA) JE Environment can only be accessed via +JEMonitor and JEDiagnostics, while a replicated JE Environment can +only be accessed via RepJEMonitor and RepJEDiagnostics. +

      +

      +The functionality provided by the JE MBeans can be accessed through +the standard MBean attribute/operation interface available through +JConsole or another management console. In addition, environment +statistics can be viewed and exported through the +JE JConsole Plugin + + +

      Enabling MBeans in your JE Application

      +

      To register and enable the MBeans for a JE application, set the +JEMonitor system property to true. For example:

      + + +java -DJEMonitor=true -cp <je.jar> <JE application> + + +

      +Setting -DJEMonitor=true will register both the monitoring +and diagnostic MBeans for the application. For example, a non-HA +environment will register both JEMonitor and JEDiagnostics, while a +a replicated environment will register both RepJEMonitor and RepJEDiagnostics. +

      +

      Attributes and Operations available through JEMonitor and RepJEMonitor

      +

      +JEMonitor monitors a non-replicated JE application. RepJEMonitor +monitors a replicated JE application and provides all the attributes +and operations of JEMonitor, along with additional operations only +applicable for replicated environments. +

      +

      Monitoring Attributes

      +

      +JEMonitor and RepJEMonitor have the following attributes list: +
      +
      + + + + +
      Monitor attributes
      +
      +
      +

      +Attributes names and values are listed in the area outlined in +red. Most of the attributes are +immutable and cannot be changed through JEMonitor, with the exception +of cachePercent and cacheSize. Detailed +information about the attributes can be obtained by clicking on the +attribute name in the list outlined in +blue. +

      +

      Monitoring Operations

      +

      +JEMonitor provides the following operations, which can be invoked on +the monitored, running JE application: +
      +
      + + + + +
      Monitor operations
      +
      +
      +

      +These operations mimic functionality available through the +com.sleepycat.je.Environment class. getEnvConfig +and getEnvironmentStats are of particular value for +obtaining information about the environment configuration, and current +statistics. More information about each operation is available through +a tool tip that displays when the mouse hovers over the operation button. +

      +As stated above, RepJEMonitor provides two additional operations to monitor a +replicated JE application: +
      +
      + + + + +
      Monitor operations
      +
      +
      +

      +The additional operations are outlined +in red. +getReplicationStats displays replication specific +statistics, while dumpReplicationState displays +information about the replication group composition, current node +state, etc. + +

      JEDiagnostics and RepJEDiagnostics

      +

      +JEDiagnostics and RepJEDiagnostics, currently have the same attributes +and operations list. +

      + +

      Diagnostic Attributes

      +

      +JEDiagnostics and RepJEDiagnostics attribute are: +
      +
      + + + + +
      Diagnostic attributes
      +
      +
      +

      +Attributes names and values are listed in the area outlined in +red. These attributes manage the +output levels for ConsoleHandler, FileHandler and MemoryHandler and +let you change logging output for a running JE application. This is +useful when doing detailed debugging, as described +in Chapter 12 of +the Getting Started Guide. Detailed information for each +attribute is listed in the +blue area and can be displayed by +clicking on the attribute. +

      +

      Diagnostic Operations

      +

      +JEDiagnostics and RepJEDiagnostics currently support the same operations: +
      +
      + + + + +
      Diagnostic operations
      +
      +
      +

      +

      +resetLoggerLevel allows you reset the level for a JE +logger, while +pushMemoryHandler lets you flush any logging output which +has been buffered in memory. Both are used only in debugging situations. +

      +
      +
      + + + +
      +

      Berkeley DB Java Edition JConsole Plugin

      + + +

      Overview

      +

      +The BDB JE JConsole plugins let you monitor and graphically display +information from running JE applications using +the jconsole utility which is distributed with the +JDK. Two plugins jars are provided: one for monitoring non-HA JE +applications (JE_HOME/lib/JEJConsole.jar), and another +for monitoring JE HA applications +(JE_HOME/lib/RepJEJConsole.jar). The former +lets jconsole monitor and display +EnvironmentStats while the latter shows both +EnvironmentStats +and ReplicatedEnvironmentStats. +

      +

      +The plugins can: +

        +
      • Display stats from a running JE application, +
      • Optionally log those stats into a log file in csv format, +
      • Graph those stats so that you can directly see the changes, +
      +

      +

      +The plugins are based on the JE MBeans described above and use the +MBean operations to periodically obtain statistics which are displayed +in a table or graph. +JEJConsole invokes +JEMonitor.getEnvironmentStats +while RepJEJConsole invokes +both RepJEMonitor.getEnvironmentStats and +RepJEMonitor.getReplicationStats. +Note that JEJConsole can be used to monitor both JE +non-replicated and replicated applications, but in the latter case +will not display the "JE Replicated Statistics" tab shown in the +second screen shot below. +

      +

      +See the javadoc +for EnvironmentStats +and ReplicatedEnvironmentStats +for more information about the meaning of the statistics. +

      +

      +
      +A screenshot of the JEJConsole plugin: +
      +
      + + + + +
      JEStats
      +
      +
      +The RepJEJConsole plugin: +
      + + + + +
      RepJEStats
      +

      +

      Using The Plugins

      +

      +jconsole can only monitor applications that have +registered a DynamicMBean. +Both JE and JE HA will automatically register an appropriate +DynamicMBean when an Environment or +ReplicatedEnvironment is created, if the JEMonitor +system property is set to true (e.g. using -DJEMonitor=true +on the command line). +

      +To use the JE and JE Replication plugins, invoke jconsole +with the -pluginpath option to specify one of the libraries. +For example: +

      +    jconsole -pluginpath JE_HOME/lib/JEJConsole.jar

      +or +

      +    jconsole -pluginpath JE_HOME/lib/RepJEJConsole.jar

      +

      +

      +When the plugin starts up, a menu will appear which lets you choose +the process to monitor. Your JE application should appear if you have +set -DJEMonitor=true. +

      +Note: There is a known problem with discovering Java +processes on Windows platforms when the temporary directory is on a +FAT type file system. In that case, a Java application may need to +set -XX:+PerfBypassFileSystemCheck on the Java command line in order +for the process to appear on the connection menu. +

      After connecting to the process, a "JE Statistics" tab will +be shown in jconsole. The tab will be named "JE +Replicated Statistics" when using the +RepJEJConsole.jar plugin. The tab provides various +options: +

      +
        +
      • +Choose JE MBean +

        +A JE application may have more than one Environment, and +therefore multiple DynamicMBeans. The plugin lets you +select which Environment you want to look at with +the "Choose JE MBean" box: +

        +

        Choose MBean
        +

        +
      • +
      • +Set Collection Interval +

        +The default interval for collecting environment stats is 10 seconds. +You can change this by entering a new value in the +"Collection interval (secs):" field and then pressing the +Enter key: +

        +

        Graph
        +

        +
      • +
      • +Display cumulative stats +

        +By default, statistics are reset after each collection period, and the +value displayed pertains only to the collection interval. For example, +if the collection interval is 10 seconds, the plugin will display +values for the first 10 seconds, the second 10 seconds, etc. You may +choose instead to display statistics in a cumulative way, so that the +displayed values accumulate as the application runs, instead of +resetting in each interval. To do so, click the +"Display cumulative stats" checkbox: +

        +

        Clear stats
        +

        +
      • +
      • +Limit the Display to Non-Zero values +

        +JE provides numerous stats. Depending on your application, some of +them may be 0 and therefore irrelevant for analyzing performance. You +can hide these stats by clicking the "Hide zero values" checkbox: +

        +

        Non-zero
        +

        +
      • +
      • +Choose a File for Logging Stats +

        +You may specify the file to write selected stats to with +the "Record Statistics To..." button. Currently, only +CSV format is supported: +

        +

        save log
        +

        +
      • +
      • +Start Recording +

        +You can begin recording stats to the selected file by pressing +the "Start Recording" button. While recording is enabled, +you can not change the recording interval, log file, or the specific +stats being logged:

        +

        start recording
        +

        +
      • +
      • +Stop Recording +

        +You can stop recording stats by pressing the "Stop +Recording" button. You can only change the recording interval, +log file, or the specific stats being logged when recording is +stopped: +

        +

        stop recording
        +

        +
      • +
      • +Choose Stats Group to Display +

        +JE Environment stats are divided into several groups. You can specify +which groups to display by checking the appropriate groups: +

        +

        choose group
        +

        +
      • +
      • +Stop Logging a Stat +

        +All stats are logged by default. If you don't want to log a particular +stat, you can right click on that stat, and uncheck "Log This +Stat": +

        +

        unlog
        +

        +
      • +
      • +Graph a Stat +

        +You may graph a particular stat by right clicking on the stat and +selecting "Graph This Stat". For example if you right-click +on nMarkLNsProcessed and select Graph This Stat... +

        +

        graph


        +... then a new window with the dynamic graph will be displayed: +

        +
        show graph
        +

        +
      • +
      • +Show tips +

        +Each stat has a mouse-over which describes its meaning. For example: +

        +

        show tips
        +

        +
      • +
      +

      +Please report bugs to the Berkeley DB Java Edition OTN forum. +

      +