You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2012/08/07 13:01:53 UTC
svn commit: r1370170 -
/jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
Author: andy
Date: Tue Aug 7 11:01:53 2012
New Revision: 1370170
URL: http://svn.apache.org/viewvc?rev=1370170&view=rev
Log:
JENA-290
Cache read datasetgraphs for read transactions.
Modified:
jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
Modified: jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java?rev=1370170&r1=1370169&r2=1370170&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java (original)
+++ jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java Tue Aug 7 11:01:53 2012
@@ -86,6 +86,7 @@ public class TransactionManager
static AtomicLong transactionId = new AtomicLong(1) ;
+ // Accessed by SysTxnState
AtomicLong activeReaders = new AtomicLong(0) ;
AtomicLong activeWriters = new AtomicLong(0) ; // 0 or 1
@@ -360,17 +361,6 @@ public class TransactionManager
log("begin$", txn) ;
- // Code for reusing the lastreader
-// if ( mode == ReadWrite.READ )
-// {
-// DatasetGraphTxn dsgTxn = lastreader.get() ;
-// if ( dsgTxn != null )
-// {
-// // Use cached
-// // Sort out components.
-// }
-// }
-
DatasetGraphTxn dsgTxn = createDSGTxn(dsg,txn, mode) ;
txn.setActiveDataset(dsgTxn) ;
@@ -379,8 +369,9 @@ public class TransactionManager
if ( mode == ReadWrite.READ )
{
+ // Consistency check.
if ( components.size() != 0 )
- log.warn("read transaction, non-empty componets list") ;
+ log.warn("read transaction, non-empty lifecycleComponents list") ;
}
for ( TransactionLifecycle component : components )
@@ -399,11 +390,26 @@ public class TransactionManager
private DatasetGraphTxn createDSGTxn(DatasetGraphTDB dsg, Transaction txn, ReadWrite mode)
{
- // [TxTDB:TODO]
- // a read transaction (no lifecycle components) can be shared over all
+ // A read transaction (if it has no lifecycle components) can be shared over all
// read transactions at the same commit level.
// lastreader
- return (DatasetGraphTxn)new DatasetBuilderTxn(this).build(txn, mode, dsg) ;
+
+ DatasetGraphTxn dsgTxn ;
+
+ if ( mode == ReadWrite.READ )
+ {
+ // If a READ transaction, and a previously built one is cached, use it.
+ dsgTxn = lastreader.get();
+ if ( dsgTxn != null )
+ return dsgTxn ;
+ }
+
+ dsgTxn = (DatasetGraphTxn)new DatasetBuilderTxn(this).build(txn, mode, dsg) ;
+ if ( mode == ReadWrite.READ )
+ // If a READ transaction, cached it.
+ // This is cleared when a WRITE commits
+ lastreader.set(dsgTxn);
+ return dsgTxn ;
}
/* Signal a transaction has commited. The journal has a commit record
@@ -423,7 +429,9 @@ public class TransactionManager
switch ( transaction.getMode() )
{
case READ: break ;
- case WRITE: writersWaiting.release() ;
+ case WRITE:
+ lastreader.set(null) ; // Clear the READ transaction cache.
+ writersWaiting.release() ; // Single writer: let another (waiting?) writer have a turn.
}
}