Date: Thu, 28 Mar 2024 10:20:22 +0000 (UTC)
Message-ID: <673808577.24487.1711621222536@ae5f4610bf64>
Subject: Exported From Confluence
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_Part_24486_1687791589.1711621222536"
------=_Part_24486_1687791589.1711621222536
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Location: file:///C:/exported.html
On this page:
Freeze Connections
In order to create a Freeze map object, you first need to obtain a Freez=
e Connection
object by connecting to a database environment.=
p>
As illustrated in the following figure, a Freeze map is associated with =
a single connection and a single database file. Connection and map objects =
are not thread-safe: if you want to use a connection or any of its associat=
ed maps from multiple threads, you must serialize access to them. If your a=
pplication requires concurrent access to the same database file (persistent=
map), you must create several connections and associated maps.
=
Freeze connections and maps.
Freeze connections provide operations that allow you to begin a transact=
ion, access the current transaction, get the communicator associated with a=
connection, close a connection, and remove a map index. See the Slice API reference for more information on these operations.<=
/p>
Using Transact=
ions with Freeze Maps
You may optionally use transactions with Freeze maps. Freeze transaction=
s provide the usual ACID (atomicity, concurrency, isolation, durability) pr=
operties. For example, a transaction allows you to group several database u=
pdates in one atomic unit: either all or none of the updates within the tra=
nsaction occur.
You start a transaction by calling beginTransaction
on the =
Connection
object. Once a connection has an associated transac=
tion, all operations on the map objects associated with this connection use=
this transaction. Eventually, you end the transaction by calling com=
mit
or rollback
: commit
saves all your upd=
ates while rollback
undoes them. The currentTransaction<=
/code> operation returns the transaction associated with a connection, if a=
ny; otherwise, it returns nil.
module Freeze {
local interface Transaction {
void commit();
void rollback();
};
local interface Connection {
Transaction beginTransaction();
idempotent Transaction currentTransaction=
();
// ...
};
};
If you do not use transactions, every non-iterator update is enclosed in=
its own internal transaction, and every read-write iterator has an associa=
ted internal transaction that is committed when the iterator is closed.
Using Transactions wi=
th C++
You must ensure that you either commit or roll back each transaction tha=
t you begin (otherwise, locks will be held by the database until they time =
out):
ConnectionPtr connection =3D ...;
TransactionPtr tx =3D connection->beginTransaction();
try {
// DB updates that might t=
hrow here...
tx->commit();
// More code that might th=
row here...
} catch (...) {
try {
tx->rollback();
} catch (...) {
}
throw;
}
The outer try-catch blocks are necessary because, if the code encounters=
an exception, we must roll back any updates that were made. In turn, the a=
ttempt to roll back might throw itself, namely, if the code following the c=
ommit throws an exception (in which case the transaction cannot be rolled b=
ack because it is already committed).
Code such as this is difficult to maintain: for example, an early return=
statement can cause the transaction to be neither committed nor rolled bac=
k. The TransactionHolder
class ensures that such errors cannot=
happen:
namespace Freeze {
class TransactionHolder {
public:
TransactionHolder(const&nbs=
p;ConnectionPtr&);
~TransactionHolder();
void commit();
void rollback();
private:
// Copy and =
assignment are forbidden.
TransactionHolder(const&nbs=
p;TransactionHolder&);
TransactionHolder& =
;operator=3D(const TransactionHolder&);
};
}
The constructor calls beginTransaction
if the connection do=
es not already have a transaction in progress, so instantiating the holder =
also starts a transaction. When the holder instance goes out of scope, its =
destructor calls rollback
on the transaction and suppresses an=
y exceptions that the rollback attempt might throw. This ensures that the t=
ransaction is rolled back if it was not previously committed or rolled back=
and ensures that an early return or an exception cannot cause the transact=
ion to remain open:
ConnectionPtr connection =3D ...;
{ // Open scope
TransactionHolder tx(connection); // =
;Begins transaction
// DB updates that might t=
hrow here...
tx.commit();
// More code that might th=
row here...
} // Transaction rolled back here if not=
previously
// committed or rolled back.
If you instantiate a TransactionHolder
when a transaction i=
s already in progress, it does nothing: the constructor notices that it cou=
ld not begin a new transaction and turns commit
, rollbac=
k
, and the destructor into no-ops. For example, the nested Tra=
nsactionHolder
instance in the following code is benign and does not=
hing:
ConnectionPtr connection =3D ...;
{ // Open scope
TransactionHolder tx(connection); // =
;Begins transaction
// DB updates that might t=
hrow here...
{ // Open nested scope
TransactionHolder tx2(=
connection); // Does nothing
// DB updates&nbs=
p;that might throw here...
tx2.commit(); // =
Does nothing
// More code =
;that might throw here...
} // Destructor of tx2 doe=
s nothing
tx.commit();
// More code that might th=
row here...
} // Transaction rolled back here if not=
previously
// committed or rolled back.
Using Transactions w=
ith Java
You must ensure that you either commit or roll back each transaction tha=
t you begin (otherwise, locks will be held by the database until they time =
out):
Connection connection =3D ...;
Transaction tx =3D connection.beginTransaction();
try {
// DB updates that might t=
hrow here...
tx.commit();
// More code that might th=
row here...
} catch (java.lang.RuntimeException ex) {
try {
tx.rollback();
} catch (DatabaseException e) {
}
throw ex;
}
The catch handler ensures that the transaction is rolled back before re-=
throwing the exception. Note that the nested try-catch blocks are necessary=
: if the transaction committed successfully but the code following the comm=
it throws an exception, the rollback attempt will fail therefore we need to=
suppress the corresponding DatabaseException
that is raised i=
n that case.
Also use caution with early return
statements:
Connection connection =3D ...;
Transaction tx =3D connection.beginTransaction();
try {
// DB updates that might t=
hrow here...
if (error) {
// ...
return; // Oops,&=
nbsp;bad news!
}
// ...
tx.commit();
// More code that might th=
row here...
} catch (java.lang.RuntimeException ex) {
try {
tx.rollback();
} catch (DatabaseException e) {
}
throw ex;
}
The early return
statement in the preceding code causes the=
transaction to be neither committed nor rolled back. To deal with this sit=
uation, avoid early return statements or ensure that you either commit or r=
oll back the transaction before returning. Alternatively, you can use a finally block to ensure that the transaction is rolled back:
Connection connection =3D ...;
try {
Transaction tx =3D connection.beginT=
ransaction();
// DB updates that might t=
hrow here...
if (error) {
// ...
return; // No&nbs=
p;problem, see finally block.
}
// ...
tx.commit();
// More code that might th=
row here...
} finally {
if (connection.currentTransaction() !=3D&=
nbsp;null)
connection.currentTransacti=
on().rollback();
}
Iterating a Freeze Map
Iterators allow you to traverse the contents of a Freeze map. Iterators =
are implemented using Berkeley DB cursors and acquire locks on the underlyi=
ng database page files. In C++, both read-only (const_iterator
=
) and read-write iterators (iterator
) are available. In Java, =
an iterator is read-write if it is obtained in the context of a transaction=
and read-only if it is obtained outside a transaction.
Locks held by an iterator are released when the iterator is closed (if y=
ou do not use transactions) or when the enclosing transaction ends. Releasi=
ng locks held by iterators is very important to let other threads access th=
e database file through other connection and map objects. Occasionally, it =
is even necessary to release locks to avoid self-deadlock (waiting forever =
for a lock held by an iterator created by the same thread).
To improve ease of use and make self-deadlocks less likely, Freeze often=
closes iterators automatically. If you close a map or connection, associat=
ed iterators are closed. Similarly, when you start or end a transaction, Fr=
eeze closes all the iterators associated with the corresponding maps. If yo=
u do not use transactions, any write operation on a map (such as inserting =
a new element) automatically closes all iterators opened on the same map ob=
ject, except for the current iterator when the write operation is performed=
through that iterator. In Java, Freeze also closes a read-only iterator wh=
en no more elements are available.
There is, however, one situation in C++ where an explicit iterator close=
is needed to avoid self-deadlock:
- you do not use transactions, and
- you have an open iterator that was used to update a map (it holds a wri=
te lock), and
- in the same thread, you read that map.
Read operations in C++ never close iterators automatically: you need to =
either use transactions or explicitly close the iterator that holds the wri=
te lock. This is not an issue in Java because you cannot use an iterator to=
update a map outside of a transaction.
Recovering fr=
om Freeze Map Deadlocks
If you use multiple threads to access a database file, Berkeley DB may a=
cquire locks in conflicting orders (on behalf of different transactions or =
iterators). For example, an iterator could have a read-lock on page P1=
and attempt to acquire a write-lock on page P2, while another iterato=
r (on a different map object associated with the same database file) could =
have a read-lock on P2 and attempt to acquire a write-lock on P1.=
When this occurs, Berkeley DB detects a deadlock and resolves it by retu=
rning a "deadlock" error to one or more threads. For all non-iterator opera=
tions performed outside any transaction, such as an insertion into a map, F=
reeze catches such errors and automatically retries the operation until it =
succeeds. (In that case, the most-recently acquired lock is released before=
retrying.) For other operations, Freeze reports this deadlock by raising <=
code>Freeze::DeadlockException. In that case, the associated transac=
tion or iterator is also automatically rolled back or closed. A properly wr=
itten application must expect to catch deadlock exceptions and retry the tr=
ansaction or iteration.
Key Sorting for Freeze=
Maps
Keys in Freeze maps and indexes are always sorted. By default, Freeze so=
rts keys according to their Ice-encoded binary representation; this is very=
efficient but the resulting order is rarely meaningful for the application=
. Starting with Ice 3.0, Freeze offers the ability to specify your own=
comparator objects so that you can customize the traversal order of your m=
aps. Note however that the comparator of a Freeze map should remain the sam=
e throughout the life of the map. Berkeley DB stores records according to t=
he key order provided by this comparator; switching to another comparator w=
ill cause undefined behavior.
Key Sorting for F=
reeze Maps in C++
In C++, you specify the name of your comparator objects during code gene=
ration. The generated map provides the standard features of std::map<=
/code>, so that iterators return entries according to the order you have de=
fined for the main key with your comparator object. The lower_bound=
code>, upper_bound
, and equal_range
functions pro=
vide range-searches (see the definition of these functions on std::ma=
p
).
Apart from these standard features, the generated =
map provides additional functions and methods to perform range searches=
using secondary keys. The additional functions are lowerBoundForMember
, upperBoundFor
Member=
, and equalRangeFor
Member
, w=
here Member
is the name of the secondary-key member. =
These functions return regular iterators on the Freeze map.
Key Sorting for =
Freeze Maps in Java
In Java, you supply comparator objects (instances of the standard Java i=
nterface java.util.Comparator
) at run time when instantiating =
the generated map class. The map constructor a=
ccepts a comparator for the main key and optionally a collection of compara=
tors for secondary keys. The map also provides a number of methods for perf=
orming range searches on the main key and on secondary keys.
Indexing a Freeze Map
Freeze maps support efficient reverse lookups: if you define an index wh=
en you generate your map (with slice2freeze
or slice2fre=
ezej
), the generated code provides additional methods for performing=
reverse lookups. If your value type is a structure or a class, you can als=
o index on a member of the value, and several such indexes can be associate=
d with the same Freeze map.
Indexed searches are easy to use and very efficient. However, be aware t=
hat an index adds significant write overhead: with Berkeley DB, every updat=
e triggers a read from the database to get the old index entry and, if nece=
ssary, replace it.
If you later add an index to an existing map, Freeze automatically popul=
ates the index the next time you open the map. Freeze populates the index b=
y instantiating each map entry, so it is important that you register the ob=
ject factories for any class types in your map before you open the map.
Note that the index key comparator of a Freeze map index should remain t=
he same throughout the life of the index. Berkeley DB stores records accord=
ing to the key order provided by this comparator; switching to another comp=
arator will cause undefined behavior.
See Also
------=_Part_24486_1687791589.1711621222536
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: file:///C:/868ad18823e1a25f0c31a0906a1cc907
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
------=_Part_24486_1687791589.1711621222536
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: file:///C:/b592e76314bdc434350f128bed186a92
R0lGODlhHgKZAHAAACwAAAAAHgKZAIckJCQ8PDxAQEBERERISEhMTExQUFBVVVVZWVldXV1hYWFl
ZWVpaWlxcXF1dXV9fX2BgYGFhYWJiYmNjY2VlZWZmZmdnZ2hoaGlpaWqqqqysrK2tra+vr7CwsLG
xsbKysrOzs7W1tba2tri4uLm5ubu7u7y8vL6+vr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI/wAXCBhI
sKDBgwgTKlzIsKHDhxAjSpxIsaLFhQtQaNzIsaPHjyBDihxJsqTJkyhTqlzJsqXLly8FwJxJs6bN
mzhztpSps6fPn0CDCh1qkifRo0iTKr1pdKnTp1CjSh3ZdKrVq1hrVs3KtavXryG3gh1L1qrYsmjT
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
7BUh3vsJPEQjPFsbOdTOable7IZLFwEBADs=
------=_Part_24486_1687791589.1711621222536
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: file:///C:/ba1e324cffbe8af222c8735a06137193
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
AAAASUVORK5CYII=
------=_Part_24486_1687791589.1711621222536--