r108 - in trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage: database database/lucene engine
Author: glandais Date: 2008-01-10 15:59:16 +0000 (Thu, 10 Jan 2008) New Revision: 108 Modified: trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/Database.java trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java Log: Stateless database Modified: trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/Database.java =================================================================== --- trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/Database.java 2008-01-10 15:58:24 UTC (rev 107) +++ trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/Database.java 2008-01-10 15:59:16 UTC (rev 108) @@ -53,6 +53,7 @@ /** * Insert an element into database + * Delete existing element with same id/version if exists * * @param element * Element to insert Modified: trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java =================================================================== --- trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java 2008-01-10 15:58:24 UTC (rev 107) +++ trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java 2008-01-10 15:59:16 UTC (rev 108) @@ -70,24 +70,34 @@ /** * Location of index */ - private Directory directory; + private static Directory directory; /** * Index writer */ - private IndexWriter writer = null; + private static IndexWriter writer = null; /** * Pool of searcher */ - private SearcherPool searcherPool = new SearcherPool(); + private static SearcherPool searcherPool = null; /** * Searcher that should be used for new queries */ - private Searcher cachedSearcher = null; + private static Searcher cachedSearcher = null; /** * Date of latest optimization */ - private Date lastOptimize = new Date(); + private static Date lastOptimize = new Date(); + private static Object searcherSynchronizer = new Object(); + private static Object writerSynchronizer = new Object(); + + private SearcherPool getSearcherPool() { + if (searcherPool == null) { + searcherPool = new SearcherPool(); + } + return searcherPool; + } + /** * Retrieve searcher for a new query * @@ -96,14 +106,14 @@ * @throws IOException */ private Searcher getSearcher() throws CorruptIndexException, IOException { - synchronized (this) { + synchronized (searcherSynchronizer) { // If cached searcher is null (as after an index write) if (cachedSearcher == null) { // Instanciate a new searcher cachedSearcher = new IndexSearcher(directory); } // Mark searcher as being used in a new query - searcherPool.capture(cachedSearcher); + getSearcherPool().capture(cachedSearcher); return cachedSearcher; } } @@ -116,8 +126,8 @@ * @throws IOException */ private void releaseSearcher(Searcher searcher) throws IOException { - synchronized (this) { - searcherPool.release(searcher); + synchronized (searcherSynchronizer) { + getSearcherPool().release(searcher); } } @@ -127,11 +137,11 @@ * @throws IOException */ private void resetReader() throws IOException { - synchronized (this) { + synchronized (searcherSynchronizer) { // Reset searcher if (cachedSearcher != null) { // Mark as should be closed asap - searcherPool.mark(cachedSearcher); + getSearcherPool().mark(cachedSearcher); cachedSearcher = null; } } @@ -139,39 +149,45 @@ @Override public void open(boolean create) throws Exception { - // Create an analyzer - Analyzer analyzer = new SimpleAnalyzer(); + if (writer == null) { + // Create an analyzer + Analyzer analyzer = new SimpleAnalyzer(); - File indexDir = new File(dbFolder); - // Create directories - File resultFolder = new File(indexDir.getParent()); - if (!resultFolder.exists()) { - resultFolder.mkdirs(); - } + File indexDir = new File(dbFolder); + // Create directories + File resultFolder = new File(indexDir.getParent()); + if (!resultFolder.exists()) { + resultFolder.mkdirs(); + } - // Base directory index - directory = FSDirectory.getDirectory(indexDir, lockFactory); + // Base directory index + directory = FSDirectory.getDirectory(indexDir, lockFactory); - // force creation if index doesn't exist - boolean realCreate = create; - if (!IndexReader.indexExists(directory)) { - realCreate = true; - } + // force creation if index doesn't exist + boolean realCreate = create; + if (!IndexReader.indexExists(directory)) { + realCreate = true; + } - // Instanciate unique writer - writer = new IndexWriter(directory, true, analyzer, realCreate); + // Instanciate unique writer + writer = new IndexWriter(directory, true, analyzer, realCreate); - // Write index on create - if (realCreate) { - commit(); + // Write index on create + if (realCreate) { + commit(); + } } } @Override public void close() throws Exception { - // Close writer and invalidate reader - writer.close(); + synchronized (writerSynchronizer) { + // Close writer and invalidate reader + writer.close(); + writer = null; + } resetReader(); + searcherPool = null; } /** @@ -180,17 +196,18 @@ * @throws CorruptIndexException * @throws IOException */ - private synchronized void synchedCommit() throws CorruptIndexException, - IOException { - // Flush in ram data - writer.flush(); - // Check if an optimization is required - Date now = new Date(); - long elapsed = now.getTime() - lastOptimize.getTime(); - // One optimize per period, if readers are closed - if (elapsed > optimizePeriod * 1000 && searcherPool.allClosed()) { - writer.optimize(); - lastOptimize = new Date(); + private void synchedCommit() throws CorruptIndexException, IOException { + synchronized (writerSynchronizer) { + // Flush in ram data + writer.flush(); + // Check if an optimization is required + Date now = new Date(); + long elapsed = now.getTime() - lastOptimize.getTime(); + // One optimize per period, if readers are closed + if (elapsed > optimizePeriod * 1000 && getSearcherPool().allClosed()) { + writer.optimize(); + lastOptimize = new Date(); + } } // Invalidate reader resetReader(); @@ -217,8 +234,10 @@ deleteElement(element); } - // add document to index - writer.addDocument(document); + synchronized (writerSynchronizer) { + // add document to index + writer.addDocument(document); + } } @Override @@ -461,7 +480,9 @@ terms[0] = new Term(KEY_UUID, uuid); terms[1] = new Term(KEY_VERSION, version.toString()); - writer.deleteDocuments(terms); + synchronized (writerSynchronizer) { + writer.deleteDocuments(terms); + } } /** Modified: trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java =================================================================== --- trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java 2008-01-10 15:58:24 UTC (rev 107) +++ trunk/simexplorer-si-storage/src/main/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java 2008-01-10 15:59:16 UTC (rev 108) @@ -2,6 +2,7 @@ import java.io.InputStream; import java.io.Reader; +import java.io.StringReader; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -27,7 +28,7 @@ /** * Indexing */ - protected static Database database; + protected Database database; /** * Storage @@ -45,9 +46,7 @@ public StorageEngine() { super(); // Indexing - if (database == null) { - database = new LuceneDatabase(); - } + database = new LuceneDatabase(); // Storage attachmentHandler = new FileSystemAttachmentHandler(); // Storing tmp data @@ -119,6 +118,15 @@ } } + if (element.getName() != null) { + Reader reader = new StringReader(element.getName()); + readers.add(reader); + } + if (element.getDescription() != null) { + Reader reader = new StringReader(element.getDescription()); + readers.add(reader); + } + // Insert element in database database.insertElement(element, readers); }
participants (1)
-
glandais@users.labs.libre-entreprise.org