Library Version 11.2.5.0, Release 5.0.34
The change is forward compatible in that JE files created with release 4.1 and earlier can be read when opened with JE 5.0.34. The change is not backward compatible in that files created with JE 5.0 cannot be read by earlier releases. Note that if an existing environment is opened read/write, a new log file is written by JE 5.0 and the environment can no longer be read by earlier releases.
There are two important notes about the file format change.
A DiskOrderedCursor can be obtained via
Database.openCursor(DiskOrderedCursorConfig)
. Note that
creating an instance of the DiskOrderedCursor disables the file
deletion done by log cleaning until the close()
method
has been called. See the javadoc for DiskOrderedCursor for more
detailed information. [#15260]
Environment.preload(Databases[], PreloadConfig)
method has been added which permits preloading multiple databases
via a single method call rather than multiple calls
to Database.preload()
.
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. Using the multi-database Environment.preload()
lets the preload operation batch
the records for all of the target Databases so that
multiple scans over the log are not necessary.
A progress mechanism has also been added which lets a caller of
the preload()
method receive feedback on whether progress
is being made. See
com.sleepycat.je.ProgressListener
and
com.sleepycat.je.PreloadConfig.setProgressListener()
.
Two new configurations are available to bound the amount of memory
used by preload processing, at the expense of preload
performance. com.sleepycat.je.PreloadConfig.setLSNBatchSize()
can be used to direct preload to partition its work into batches., In
addition, com.sleepycat.je.PreloadConfig.setInternalMemoryLimit()
can be used to limit the amount of memory outside of the JE cache used
by preload.
[#15260] [#18153] [#19306]
Environment subdirectories are enabled through
the je.log.nDataDirectories
environment parameter. If 0
(the default), 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's 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.
DbBackup.getLogFilesInBackupSet()
now returns the subdirectory
name and file separator prepended to the file name if
je.log.nDataDirectories > 0. [#19125]
Cursor.skipNext
and Cursor.skipPrev
. [#19165]
EnvironmentConfig.setClassLoader
. Related changes are:
com.sleepycat.util.ClassResolver
class defines
and implements the class loading policy.com.sleepycat.je.DatabaseComparator
interface.com.sleepycat.bind.serial.Catalog
interface has a
new method, getClassLoader
, that is used to supply the
ClassLoader to the SerialBinding
. This method is
implemented by the StoredClassCatalog
class, and returns
the environment's ClassLoader property. As a result,
SerialBinding.getClassLoader
now returns the environment's
ClassLoader property.
com.sleepycat.persist.model.EntityModel.classForName
static method has been deprecated in favor of the new
EntityModel.resolveClass
method, which honors the
environment's ClassLoader property.java.io.Closeable
interface is now implemented by all JE
classes and interfaces with a public void close()
method. This
allows using these objects with the Java 1.7 try-with-resources statement, for
applications compiled and run with Java 1.7 or later. See
AutoCloseable,
which is a superinterface of java.io.Closeable
in Java 1.7.
The following JE classes and interfaces now implement Closeable
,
and on Java 1.7 AutoCloseable
.
com.sleepycat.bind.serial.ClassCatalog com.sleepycat.bind.serial.StoredClassCatalog com.sleepycat.collections.StoredIterator com.sleepycat.persist.EntityCursor com.sleepycat.persist.EntityJoin com.sleepycat.persist.EntityStore com.sleepycat.persist.ForwardCursor com.sleepycat.persist.raw.RawStore com.sleepycat.je.jca.ra.JEConnection com.sleepycat.je.Cursor com.sleepycat.je.Database com.sleepycat.je.DiskOrderedCursor com.sleepycat.je.Environment com.sleepycat.je.ForwardCursor com.sleepycat.je.JoinCursor com.sleepycat.je.SecondaryDatabase com.sleepycat.je.Sequence com.sleepycat.je.trigger.Trigger[#20559]
Environment.flushLog
method has been added. It can be 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. To flush buffered data for durability reasons, with the
addition of this method it is no longer necessary to perform a checkpoint, call
Environment.sync
, or commit a transaction (with sync or
write-no-sync durability). [#19111]
je.env.fairLatches
environment parameter has been deprecated
and no longer has any effect.
EnvironmentConfig.CHECKPOINTER_BYTES_INTERVAL
has changed.
Previously, this interval defined the byte distance between the end of one
checkpoint and the start of the next. Now it defines the byte distance between
the start of one checkpoint and start of the next. In other words, now the
interval includes the checkpoint itself, which in some cases can be large.
This now more accurately reflects the intention of the parameter, which is to
bound the recovery interval, which is proportional to the time to recover (open
the Environment
) after a crash. It does mean, however, that
checkpoints may occur more often for the same configured interval, and some
applications may wish to adjust their configured setting accordingly. [#19704]
Cursor.getSearchBothRange
for a non-duplicates database has been
corrected to behave exactly as Cursor.getSearchBoth
. Previously
getSearchBothRange
returned a data item that was greater or equal
to the data search parameter, which was incorrect. Now it only returns a data
item that is equal to the data search parameter. [#19165]
EnvironmentConfig.CLEANER_LAZY_MIGRATION
has
been changed from true to false. Over several releases the benefits of setting
this to true have decreased and are now less than the benefits of setting it to
false. See the javadoc for this parameter for details. [#20588]
As a result of this change, the log cleaner must now sometimes estimate the
size of records that are made obsolete by updates and deletions, and must
sometimes "probe" a log file to determine record sizes. Several statistics
have been added to show this activity in the
com.sleepycat.je.EnvironmentStats
class:
getCorrectedAvgLNSize
getEstimatedAvgLNSize
getNCleanerProbeRuns
DbSpace
utility now also prints the first two of these new
statistics.
[#18633]
Internal Format Change
This information is included for users who understand Btree internals and wish to know what changed internally.
Performance Improvements
Other Behavioral Changes
DatabaseConfig.setKeyPrefixing(true)
. If
DatabaseConfig.setKeyPrefixing(false)
is called for a database
with duplicates configured, an IllegalStateException
is
thrown.
Cursor.count
) is more costly than it was previously.
Previously, the count was stored and could be returned by reading a single
record for the key. Now, to determine the count precisely JE must traverse
internal Btree nodes to count the duplicates for the key. If you are using
Cursor.count
, consider using the new method
Cursor.countEstimate
instead.
Cursor.countEstimate
returns a rough estimate of the count
using a fixed cost algorithm. Since Cursor.count
is primarily
intended for use in query optimizations, the
Cursor.countEstimate
method may be a good substitute. For
example, JoinCursor
now uses Cursor.countEstimate
rather than Cursor.count
to determine the index processing
order. Likewise, EntityCursor.countEstimate
is a potential
substitute for EntityCursor.count
. DatabaseConfig.setBtreeComparator
for
information on partial comparators. Previously, Btree partial comparators
could be use only with non-duplicate databases.
DatabaseConfig.setNodeMaxDupTreeEntries
DatabaseConfig.getNodeMaxDupTreeEntries
BtreeStats.getDuplicateBottomInternalNodeCount
BtreeStats.getDupCountLeafNodeCount
BtreeStats.getDuplicateInternalNodeCount
BtreeStats.getDuplicateTreeMaxDepth
BtreeStats.getDINsByLevel
BtreeStats.getDBINsByLevel
PreloadStats.getNDINsLoaded
PreloadStats.getNDBINsLoaded
PreloadStats.getNDupCountLNsLoaded
Upgrade Procedure
Because of this format change, an environment with databases configured for
duplicates must convert their environment with a utility program prior to
opening the environment with this release. 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
) .
One of two utility programs must be used, which are only available in the release package for JE 4.1.10, or a later release of JE 4.1. If you are currently running a release earlier than JE 4.1.10, then you must download the latest JE 4.1 release package in order to run these utilities.
The steps for upgrading are as follows.
Environment
:
java -jar je-4.1.10.jar DbPreUpgrade_4_1 -h <dir>If you are using a JE
ReplicatedEnvironment
:
java -jar je-4.1.10.jar DbRepPreUpgrade_4_1 -h <dir> -groupName <group name> -nodeName <node name> -nodeHostPort <host:port>
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 -- all databases with duplicates will automatically be
converted before the Environment
or
ReplicatedEnvironment
constructor returns. The 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 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. [#19165]
Previously, delta log entries for bottom internal nodes, called BINDeltas, were
written by checkpoints rather than writing full BINs, and full BINs were
written less frequently (see EnvironmentConfig.TREE_MAX_DELTA
and
TREE_BIN_DELTA
). This is still the case. However, the approach
taken previously required that the same delta information be repeatedly written
at each checkpoint, even it had not changed since the last checkpoint. Now,
delta information is only written when it changes.
By significantly reducing writing, the new approach provides overall performance improvements. However, there is also an additional cost to the new approach: When a BIN is not in cache, fetching the BIN now often requires two random reads instead of just one; one read to fetch the BINDelta and another to fetch the last full BIN. For applications where all active BINs fit in cache, this adds to the I/O cost of initially populating the cache. For applications where active BINs do not fit in cache, this adds to the per-operation cost of fetching a record (an LN) when its parent BIN is not in cache. In our tests, the lower write rate more than compensates for the additional I/O of fetching the BINDelta, but the benefit is greatest when all BINs fit in cache.
[#19671]
CheckpointConfig.setMinimizeRecoveryTime(true)
is used
along with an explicit checkpoint performed by calling the
Environment.checkpoint
method.Environment.sync
is called.Environment.close
is called, since it performs a final
checkpoint.Environment.checkpoint
) would
cause long recovery times under certain circumstances.
As a part of this work, the actions invoked by ReplicatedEnvironment.shutdownGroup() were streamlined to use the setMinimizeRecoveryTime() option and to reduce spurious timeouts during the shutdown processing. [#19559]
DatabaseConfig.setNodeMaxEntries
s) are now
mutable and persistent database attributes. They were previously permitted to
mutate, but the changed attribute value wasn't saved persistently, so the new
value might sometimes revert to the previously existing setting. This has been
fixed. In addition, the javadoc for DatabaseConfig has been expanded to
clarify what attributes are mutable vs. fixed, persistent vs temporary.
[#18262]
Implementation-Title
, Implementation-Version
,
Implementation-Vendor
, Implementation-URL
entries to
the je.jar MANIFEST.MF
file. [#19320]
"Cleaner-5" daemon prio=10 tid=0x00002aaae8008800 nid=0xaeb runnable [0x0000000042ac9000] java.lang.Thread.State: RUNNABLE at com.sleepycat.je.cleaner.OffsetList.contains(OffsetList.java:132) at com.sleepycat.je.cleaner.TrackedFileSummary.containsObsoleteOffset(TrackedFileSummary.java:169) at com.sleepycat.je.cleaner.FileProcessor.processFile(FileProcessor.java:495) at com.sleepycat.je.cleaner.FileProcessor.doClean(FileProcessor.java:243) locked <0x00002aaab0652408> (a com.sleepycat.je.cleaner.FileProcessor) at com.sleepycat.je.cleaner.FileProcessor.onWakeup(FileProcessor.java:140) at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:162) at java.lang.Thread.run(Thread.java:662)[#19626]
EnvironmentConfig.TREE_COMPACT_MAX_KEY_LENGTH
for user
configuration of the in-memory compaction of keys in the Btree. Previously,
in-memory keys were compacted but the key size threshold was fixed at 16 bytes.
Now the key size threshold is configurable and has a 16 byte default value.
For more information, see the
EnvironmentConfig.TREE_COMPACT_MAX_KEY_LENGTH
javadoc. [#20120]
Database
handle kept a reference to the
environment after it was closed. Added the following warning to the
close()
method javadoc for all JE 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.[#20302]
The fix changes the final step above so that an election is held before the rollback is allowed to proceed. The election results in C being elected the new master. Node A encounters a MasterReplicaTransitionException which it must handle by closing and re-opening its environment handle so it can resume operations as a replica. [#20258] [#20572]
FileProcessor.processFoundLN
. This only occurs when temporary
databases are used and Environment.CLEANER_LAZY_MIGRATION
is set
to false, which is now the default in JE 5. [#20670]
(JE 5.0.30) node2(2):/tmp/scaleDir2/env Couldn't find bucket for GTE VLSN 299,617,391 in database. EndBucket =[#20726]tracker = first=298,966,283 last=299,617,477 sync=299,617,458 txnEnd=299,617,458 firstTracked=-1 lastOnDiskVLSN=299,617,477 UNEXPECTED_STATE_FATAL: Unexpected internal state, unable to continue. Environment is invalid and must be closed. at com.sleepycat.je.EnvironmentFailureException.unexpectedState(EnvironmentFailureException.java:391) at com.sleepycat.je.rep.vlsn.VLSNIndex.getGTEBucketFromDatabase(VLSNIndex.java:911) at com.sleepycat.je.rep.vlsn.VLSNIndex.getGTEBucket(VLSNIndex.java:780) at com.sleepycat.je.rep.vlsn.VLSNIndex.access$000(VLSNIndex.java:308) at com.sleepycat.je.rep.vlsn.VLSNIndex$ForwardVLSNScanner.getLsn(VLSNIndex.java:2119) at com.sleepycat.je.rep.vlsn.VLSNIndex$ForwardVLSNScanner.getApproximateLsn(VLSNIndex.java:2081) at com.sleepycat.je.rep.stream.FeederReader.scanForwards(FeederReader.java:224) at com.sleepycat.je.rep.stream.MasterFeederSource.getWireRecord(MasterFeederSource.java:62) at com.sleepycat.je.rep.impl.node.Feeder$OutputThread.run(Feeder.java:762)
java.lang.IndexOutOfBoundsException: Index: 110, Size: 110 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at com.sleepycat.je.rep.vlsn.VLSNBucket.findPopulatedIndex(VLSNBucket.java:441) at com.sleepycat.je.rep.vlsn.VLSNBucket.removeFromTail(VLSNBucket.java:730) at com.sleepycat.je.rep.vlsn.VLSNIndex.pruneDatabaseTail(VLSNIndex.java:1087) at com.sleepycat.je.rep.vlsn.VLSNIndex.merge(VLSNIndex.java:1274) at com.sleepycat.je.rep.vlsn.VLSNIndex.init(VLSNIndex.java:1161) at com.sleepycat.je.rep.vlsn.VLSNIndex.There was no corruption to the persistent data, but without this fix, the environment would repeatedly fail to open. [#20796](VLSNIndex.java:382) at com.sleepycat.je.rep.impl.RepImpl.preRecoveryCheckpointInit(RepImpl.java:374) at com.sleepycat.je.recovery.RecoveryManager.recover(RecoveryManager.java:238) at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:549) at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:237) at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:229) at com.sleepycat.je.Environment. (Environment.java:211) at com.sleepycat.je.Environment. (Environment.java:176) at com.sleepycat.je.rep.ReplicatedEnvironment. (ReplicatedEnvironment.java:443) at com.sleepycat.je.rep.ReplicatedEnvironment. (ReplicatedEnvironment.java:318) at com.sleepycat.je.rep.ReplicatedEnvironment. (ReplicatedEnvironment.java:379)
DatabaseConfig.setKeyPrefixing
) was
not effective when keys are inserted in sequential order, for example, during a
bulk load in key order. Without any updates, deletions or non-sequential
insertions, the prefix information was not persistent and therefore not used
after closing and re-opening the Environment. In addition, during sequential
insertion more cache space than necessary was used under certain circumstances.
These problems did not occur with non-sequential insertion. [#20799]
DbCacheSize
utility to take into account memory
management enhancements and improve accuracy. Added support for key prefixing
(-keyprefix
), databases configured for sorted duplicates
(-duplicates
), and replicated environments
(-replicated
). Environment config params and replication config
params may also be specified, since they impact memory usage as well.
The old -density
argument has been replaced by
-orderedinsertion
. The old -overhead
argument has
been removed, and the utility prints the minimum environment memory overhead.
See the DbCacheSize
javadoc for more information. It now includes
a discussion of how cache memory is used and how it can be reduced using
environment and database configuration options. [#20145]
SecondaryCursor
method that moves the cursor to an existing
record. This occurs when both of the following conditions are true:
com.sleepycat.bind.tuple.SortedPackedIntegerBinding
-- new classcom.sleepycat.bind.tuple.SortedPackedLongBinding
-- new classcom.sleepycat.bind.tuple.TupleInput
-- new methods: readSortedPackedInt, getSortedPackedIntByteLength, readSortedPackedLong, getSortedPackedLongByteLength
.com.sleepycat.bind.tuple.TupleOutput
-- new methods: writeSortedPackedInt, writeSortedPackedLong
.com.sleepycat.util.PackedInteger
-- new methods: readSortedInt, readSortedLong, getReadSortedIntLength, getReadSortedLongLength, writeSortedInt, writeSortedLong, getWriteSortedIntLength, getWriteSortedLongLength
.See the com.sleepycat.bind.tuple
package description for an
overview of the new bindings and a comparative description of all tuple
bindings. [#18379]
java.math.BigDecimal
data type are now
available.
BigDecimal
values in record
keys, and provides natural sort order without a custom comparator. The API
additions are:com.sleepycat.bind.tuple.SortedBigDecimalBinding
-- new classcom.sleepycat.bind.tuple.TupleInput
-- new methods: readSortedBigDecimal, getSortedBigDecimalByteLength
.com.sleepycat.bind.tuple.TupleOutput
-- new methods: writeSortedBigDecimal, getSortedBigDecimalMaxByteLength
.BigDecimal
format does not provide natural
sort order and is not intended for use in record keys, but has two
advantages over the sorted format: trailing zeros after the decimal place
are preserved, and a more compact, faster serialization format is used.
The API additions are:com.sleepycat.bind.tuple.BigDecimalBinding
-- new classcom.sleepycat.bind.tuple.TupleInput
-- new methods: readBigDecimal, getBigDecimalByteLength
.com.sleepycat.bind.tuple.TupleOutput
-- new methods: writeBigDecimal, getBigDecimalMaxByteLength
.See the com.sleepycat.bind.tuple
package description for an
overview of the new bindings and a comparative description of all tuple
bindings. [#18379]
java.math.BigDecimal
is now defined as a built-in DPL simple data
type. This means that BigDecimal
values may be stored in DPL
persistent objects, and fields of type BigDecimal
may be defined
as primary or secondary keys. The sorted BigDecimal
format is
always used in the DPL, and this provides natural sort order without a custom
comparator. However, trailing zeros after the decimal place are stripped,
meaning that precision is not preserved.
If the application has previously defined a PersistentProxy
for
BigDecimal
, special considerations are necessary when upgrading
to this release:
EntityModel.registerClass
for the
BigDecimal
proxy class must be removed. If it is not removed,
an IllegalArgumentException
will be thrown by the
EntityStore
constructor. In general, proxies for built-in
simple types are not allowed.
BigDecimal
proxy class is not registered, the
proxy class must be available for reading BigDecimal
values
that were written via the proxy, prior to this release.
Rewriting (updating) an entity will convert the proxied
BigDecimal
value to the new built-in BigDecimal
format. To convert all entities explicitly and efficiently, the
EntityStore.evolve
method may be used.
After converting all entities using the proxied values, if you additionally
wish to remove the proxy class itself then you must supply a
Deleter
mutation for the proxy class.
BigDecimal
proxy class, as a secondary key, the application
must first explicitly evolve the index using
EntityStore.evolve
, or update all values. Then the
@SecondaryKey
annotation may be added to create a new
secondary index.
[#18379]
java.util.LinkedHashMap
. LinkedHashMap
may now be
used as the type of any persistent field. [#20055]
MANY_TO_ONE
and MANY_TO_MANY
secondary index ordering when a Comparable
key class is used for
the primary key.
In general, for MANY_TO_ONE
and MANY_TO_MANY
secondary indexes, more than one entity may have the same secondary key. When
iterating over entities in secondary key order, the ordering of entities is by
primary key within secondary key. For example, if Employee entities with an
integer ID primary key are iterated using a String department secondary key,
the iteration order is by integer ID within (grouped by) department.
In prior releases, when a Comparable
key class is used for the
primary key, the Comparable
defines the order of entities in the
primary index. However, the Comparable.compareTo
method is not
used to determine primary key ordering within secondary key. Instead, the
natural order of the primary keys is used. In our example, if the primary key
class implements Comparable
to order entities in decreasing
integer order, the iteration order is incorrectly in natural integer order
(increasing) within department. This has been fixed and the order for newly
created secondary indexes now uses the Comparable
, and in our
example the iteration order is now decreasing integer order within
department.
However, because the ordering of an existing index cannot be changed, the
old ordering will apply for secondary indexes created prior to this release.
To cause the correct ordering to be used for an existing index, you must
delete the database for the secondary index. The next time the index is
opened (via EntityStore.getSecondaryIndex
) the index will be
regenerated in the correct order. To delete the index database, first
determine the database name; see the Database Names section of the
EntityStore
javadoc. Then, before opening the
EntityStore
, delete the index database using
Environment.removeDatabase
. [#17252]
com.sleepycat.util.RuntimeExceptionWrapper: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at com.sleepycat.bind.serial.SerialBinding.entryToObject(SerialBinding.java:141) at com.sleepycat.collections.DataView.makeValue(DataView.java:597) at com.sleepycat.collections.DataCursor.getCurrentValue(DataCursor.java:350) at com.sleepycat.collections.StoredContainer.getValue(StoredContainer.java:304) at com.sleepycat.collections.StoredMap.get(StoredMap.java:240)Now null values can be stored and read, as long as the value binding supports null values. Note that null values are not supported when entity bindings are used, such as when using the DPL. Thanks to 'annie' on OTN for reporting the problem. [#18633]
com.sleepycat.je.EnvironmentFailureException: java.lang.InstantiationException UNEXPECTED_EXCEPTION: Unexpected internal Exception, may have side effects. at com.sleepycat.je.EnvironmentFailureException.unexpectedException(EnvironmentFailureException.java:286) at com.sleepycat.compat.DbCompat.unexpectedException(DbCompat.java:494) at com.sleepycat.persist.impl.ReflectionAccessor.newInstance(ReflectionAccessor.java:157) at com.sleepycat.persist.impl.ComplexFormat.checkNewSecKeyInitializer(ComplexFormat.java:475) at com.sleepycat.persist.impl.ComplexFormat.initialize(ComplexFormat.java:451) at com.sleepycat.persist.impl.Format.initializeIfNeeded(Format.java:542) at com.sleepycat.persist.impl.PersistCatalog.init(PersistCatalog.java:454) at com.sleepycat.persist.impl.PersistCatalog.Now adding new secondary keys into abstract entity classes is allowed in the DPL. Thanks to user 786189 on OTN for reporting the problem. [#19358](PersistCatalog.java:221) at com.sleepycat.persist.impl.Store. (Store.java:186) at com.sleepycat.persist.EntityStore. (EntityStore.java:185)
IllegalStateException
is now thrown when calling
EntityStore.setSequenceConfig
and the sequence has already been
opened via a call to EntityStore.getPrimaryIndex
. This is the
behavior previously specified in the javadoc for
setSequenceConfig
. Thanks to patriciaG on OTN for
reporting
the problem. [#19356]
java.lang.IllegalArgumentException: Class could not be loaded or is not persistent.Now storing an enum class with constant-specific methods is allowed in the DPL. Thanks to Mikhail Barg on OTN for reporting the problem. [#18357]
Allows to register enum or array types by EntityModel.registerClass. This new feature will be useful when enum or array classes are unknown for DPL but will be used in converter mutation.
Also collects the related formats for the Map or Collection types in the FieldInfo.collectRelatedFormats, e.g., creates an EnumFormat for MyEnum class when meeting Map<String, MyEnum>.
Thanks to James on OTN for reporting the problem. [#19377]In our benchmark, there are 500,000 records containing only String fields, and the size of each record is 180 bytes. With such changes, the reading performance gains 14% improvement, and the writing performance gains 10% improvement. [#19247]
In our benchmark, there are 500,000 records. The primary key in each record is a composite key containing an integer field and a String field, and the size of each record is 180 bytes. With such change, the performance of PrimaryIndex.get operation (reads 500,000 records, uses pre-load mode to avoid I/O process) gains nearly 10% improvement.
The improvement will be more significant if there is a large and complex primary key and small data. [#19248]EnvironmentFailureException
is now thrown by
Environment.close() if the last open Environment
handle
is closed between calls to DbBackup.startBackup()
and DbBackup.endBackup()
. [19207]
EnvironmentConfig.setCacheSize
.