From b05422171a772db8f8745cac3f3c922c1943bb53 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Tue, 4 Jul 2006 14:34:50 +0000 Subject: [PATCH] Some more modification to make things more Spring friendly. Updated Spring configurations to match. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3278 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/avm-console-context.xml | 83 +++++++++++-- config/alfresco/avm-console.properties | 17 +++ config/alfresco/avm-test-context.xml | 80 +++++++++++-- config/alfresco/avm-test.properties | 17 +++ .../org/alfresco/repo/avm/AVMCrawlTest.java | 2 +- .../org/alfresco/repo/avm/AVMServiceImpl.java | 110 +++++++----------- .../alfresco/repo/avm/AVMServiceTestBase.java | 1 - .../alfresco/repo/avm/DirectoryNodeImpl.java | 1 + .../org/alfresco/repo/avm/OrphanReaper.java | 17 +-- .../repo/avm/SimultaneousLoadTest.java | 2 +- .../repo/avm/hibernate/HibernateHelper.java | 86 -------------- .../repo/avm/hibernate/HibernateTxn.java | 77 +++++------- .../alfresco/repo/avm/util/BulkLoader.java | 2 - 13 files changed, 260 insertions(+), 235 deletions(-) create mode 100644 config/alfresco/avm-console.properties create mode 100644 config/alfresco/avm-test.properties delete mode 100644 source/java/org/alfresco/repo/avm/hibernate/HibernateHelper.java diff --git a/config/alfresco/avm-console-context.xml b/config/alfresco/avm-console-context.xml index 06ec6b13e3..4bd1aaa7f5 100644 --- a/config/alfresco/avm-console-context.xml +++ b/config/alfresco/avm-console-context.xml @@ -2,9 +2,72 @@ - + + + + + + config/alfresco/avm-console.properties + + + + + + + ${db.driver} + + + ${db.url} + + + ${db.username} + + + ${db.password} + + + ${db.pool.initial} + + + ${db.pool.max} + + + 1 + + + + + + + + + + + ${hibernate.dialect} + ${hibernate.current_session_context_class} + ${hibernate.connection.isolation} + ${hibernate.default_batch_fetch_size} + ${hibernate.jdbc.batch_versioned_data} + ${hibernate.cache.use_second_level_cache} + ${hibernate.hbm2ddl.auto} + + + + + org/alfresco/repo/avm/hibernate/AVM.hbm.xml + + + + + + + + + + + @@ -16,27 +79,30 @@ 50 - - + + + + build/test-results/storage - - false + + ${avm.initialize} - - + + + @@ -45,4 +111,5 @@ + \ No newline at end of file diff --git a/config/alfresco/avm-console.properties b/config/alfresco/avm-console.properties new file mode 100644 index 0000000000..c12eccf301 --- /dev/null +++ b/config/alfresco/avm-console.properties @@ -0,0 +1,17 @@ +# Database specifics. +db.driver=com.mysql.jdbc.Driver +db.url=jdbc:mysql://127.0.0.1/avm +db.username=root +db.password= +db.pool.initial=4 +db.pool.max=32 +# Hibernate properties +hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect +hibernate.current_session_context_class=thread +hibernate.connection.isolation=2 +hibernate.default_batch_fetch_size=16 +hibernate.jdbc.batch_versioned_data=true +hibernate.cache.use_second_level_cache=true +hibernate.hbm2ddl.auto=update +# AVM specific properties. +avm.initialize=false diff --git a/config/alfresco/avm-test-context.xml b/config/alfresco/avm-test-context.xml index 6af48aa60f..e3da45b53a 100644 --- a/config/alfresco/avm-test-context.xml +++ b/config/alfresco/avm-test-context.xml @@ -2,9 +2,72 @@ - + + + + + + config/alfresco/avm-test.properties + + + + + + + ${db.driver} + + + ${db.url} + + + ${db.username} + + + ${db.password} + + + ${db.pool.initial} + + + ${db.pool.max} + + + 1 + + + + + + + + + + + ${hibernate.dialect} + ${hibernate.current_session_context_class} + ${hibernate.connection.isolation} + ${hibernate.default_batch_fetch_size} + ${hibernate.jdbc.batch_versioned_data} + ${hibernate.cache.use_second_level_cache} + ${hibernate.hbm2ddl.auto} + + + + + org/alfresco/repo/avm/hibernate/AVM.hbm.xml + + + + + + + + + + + @@ -16,20 +79,21 @@ 50 - - + + + build/test-results/storage - - true + + ${avm.initialize} - - + + \ No newline at end of file diff --git a/config/alfresco/avm-test.properties b/config/alfresco/avm-test.properties new file mode 100644 index 0000000000..30b1384f15 --- /dev/null +++ b/config/alfresco/avm-test.properties @@ -0,0 +1,17 @@ +# Database specifics. +db.driver=com.mysql.jdbc.Driver +db.url=jdbc:mysql://127.0.0.1/avm +db.username=root +db.password= +db.pool.initial=4 +db.pool.max=32 +# Hibernate properties +hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect +hibernate.current_session_context_class=thread +hibernate.connection.isolation=2 +hibernate.default_batch_fetch_size=16 +hibernate.jdbc.batch_versioned_data=true +hibernate.cache.use_second_level_cache=true +hibernate.hbm2ddl.auto=create +# AVM specific properties. +avm.initialize=true diff --git a/source/java/org/alfresco/repo/avm/AVMCrawlTest.java b/source/java/org/alfresco/repo/avm/AVMCrawlTest.java index 8f44df13fe..9a7ef0525b 100644 --- a/source/java/org/alfresco/repo/avm/AVMCrawlTest.java +++ b/source/java/org/alfresco/repo/avm/AVMCrawlTest.java @@ -35,7 +35,7 @@ public class AVMCrawlTest extends AVMServiceTestBase */ public void testCrawl() { - int n = 4; // Number of Threads. + int n = 8; // Number of Threads. int m = 16; // How many multiples of content to start with. long runTime = 1200000; // Ten minutes fService.purgeRepository("main"); diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index 1ebdac6809..4166c9c164 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -28,12 +28,10 @@ import java.util.List; import java.util.SortedMap; import org.alfresco.repo.avm.SuperRepository; -import org.alfresco.repo.avm.hibernate.HibernateHelper; import org.alfresco.repo.avm.hibernate.HibernateTxn; import org.alfresco.repo.avm.hibernate.HibernateTxnCallback; import org.hibernate.Query; import org.hibernate.Session; -import org.hibernate.tool.hbm2ddl.SchemaExport; /** * Implements the AVMService. Stub. @@ -74,12 +72,7 @@ public class AVMServiceImpl implements AVMService /** * Whether the tables should be dropped and created. */ - private boolean fCreateTables; - - /** - * The HibernateHelper. - */ - private HibernateHelper fHibernateHelper; + private boolean fInitialize; /** * Basic constructor for the service. @@ -94,61 +87,47 @@ public class AVMServiceImpl implements AVMService */ public void init() { - fTransaction = new HibernateTxn(fHibernateHelper.getSessionFactory()); - if (fCreateTables) + try { - SchemaExport se = new SchemaExport(fHibernateHelper.getConfiguration()); - se.drop(false, true); - se.create(false, true); - File storage = new File(fStorage); - storage.mkdirs(); - fNodeIssuer = new Issuer(0L); - fContentIssuer = new Issuer(0L); - fLayerIssuer = new Issuer(0L); + fTransaction.perform( + new HibernateTxnCallback() + { + public void perform(Session sess) + { + Query query = sess.createQuery("select max(an.id) from AVMNodeImpl an"); + Long val = (Long)query.uniqueResult(); + fNodeIssuer = new Issuer(val == null ? 0L : val + 1L); + query = sess.createQuery("select max(fc.id) from FileContentImpl fc"); + val = (Long)query.uniqueResult(); + fContentIssuer = new Issuer(val == null ? 0L : val + 1L); + query = sess.createQuery("select max(an.layerID) from AVMNodeImpl an"); + val = (Long)query.uniqueResult(); + fLayerIssuer = new Issuer(val == null ? 0L : val + 1L); + } + }, false); fSuperRepository = new SuperRepository(fNodeIssuer, fContentIssuer, fLayerIssuer, fStorage); - try - { - createRepository("main"); - } - catch (Exception e) - { - // TODO Log this and abort in some useful way. - } - } - else - { - try - { - fTransaction.perform( - new HibernateTxnCallback() - { - public void perform(Session sess) - { - Query query = sess.createQuery("select max(an.id) from AVMNodeImpl an"); - Long val = (Long)query.uniqueResult(); - fNodeIssuer = new Issuer(val == null ? 0L : val + 1L); - query = sess.createQuery("select max(fc.id) from FileContentImpl fc"); - val = (Long)query.uniqueResult(); - fContentIssuer = new Issuer(val == null ? 0L : val + 1L); - query = sess.createQuery("select max(an.layerID) from AVMNodeImpl an"); - val = (Long)query.uniqueResult(); - fLayerIssuer = new Issuer(val == null ? 0L : val + 1L); - } - }, false); - fSuperRepository = new SuperRepository(fNodeIssuer, - fContentIssuer, - fLayerIssuer, - fStorage); - } - catch (Exception e) - { - e.printStackTrace(System.err); - // TODO Log this and abort in some useful way. - } } + catch (Exception e) + { + e.printStackTrace(System.err); + // TODO Log this and abort in some useful way. + } + if (fInitialize) + { + createRepository("main"); + } + } + + /** + * Set the Hibernate Transaction wrapper. + * @param txn + */ + public void setHibernateTxn(HibernateTxn txn) + { + fTransaction = txn; } /** @@ -161,23 +140,14 @@ public class AVMServiceImpl implements AVMService } /** - * Set whether we should drop and create tables. - * @param createTables + * Set whether we should create an initial repository. + * @param initialize */ - public void setCreateTables(boolean createTables) + public void setInitialize(boolean initialize) { - fCreateTables = createTables; + fInitialize = initialize; } - /** - * Set the HibernateHelper. - * @param helper - */ - public void setHibernateHelper(HibernateHelper helper) - { - fHibernateHelper = helper; - } - /** * Get an InputStream from a file. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java b/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java index 23c1c6a710..861454cc65 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Map; import java.util.TreeMap; -import org.alfresco.repo.avm.hibernate.HibernateHelper; import org.hibernate.stat.Statistics; import org.springframework.context.support.FileSystemXmlApplicationContext; diff --git a/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java index d9f4c33ce3..dec6c2aad0 100644 --- a/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/DirectoryNodeImpl.java @@ -56,6 +56,7 @@ abstract class DirectoryNodeImpl extends AVMNodeImpl implements DirectoryNode @SuppressWarnings("unchecked") protected ChildEntry getChild(String name, boolean write) { + // TODO This may be very Dangerous! Session sess = SuperRepository.GetInstance().getSession(); ChildEntry entry = (ChildEntry)sess.get(ChildEntryImpl.class, new ChildEntryImpl(name, this, null), (write && getIsNew()) ? LockMode.UPGRADE : LockMode.READ); diff --git a/source/java/org/alfresco/repo/avm/OrphanReaper.java b/source/java/org/alfresco/repo/avm/OrphanReaper.java index a4d433f71b..e7bf7dbb32 100644 --- a/source/java/org/alfresco/repo/avm/OrphanReaper.java +++ b/source/java/org/alfresco/repo/avm/OrphanReaper.java @@ -19,7 +19,6 @@ package org.alfresco.repo.avm; import java.util.List; -import org.alfresco.repo.avm.hibernate.HibernateHelper; import org.alfresco.repo.avm.hibernate.HibernateTxn; import org.alfresco.repo.avm.hibernate.HibernateTxnCallback; import org.hibernate.Query; @@ -68,11 +67,6 @@ public class OrphanReaper implements Runnable */ private Thread fThread; - /** - * The Hibernate helper to use. - */ - private HibernateHelper fHibernateHelper; - /** * Create one with default parameters. */ @@ -113,14 +107,14 @@ public class OrphanReaper implements Runnable { fBatchSize = size; } - + /** - * Set the HibernateHelper to use. - * @param helper The helper to use. + * Set the Hibernate Transaction Wrapper. + * @param transaction */ - public void setHibernateHelper(HibernateHelper helper) + public void setHibernateTxn(HibernateTxn transaction) { - fHibernateHelper = helper; + fTransaction = transaction; } /** @@ -128,7 +122,6 @@ public class OrphanReaper implements Runnable */ public void init() { - fTransaction = new HibernateTxn(fHibernateHelper.getSessionFactory()); fThread = new Thread(this); fThread.start(); } diff --git a/source/java/org/alfresco/repo/avm/SimultaneousLoadTest.java b/source/java/org/alfresco/repo/avm/SimultaneousLoadTest.java index a07efb1597..845513768d 100644 --- a/source/java/org/alfresco/repo/avm/SimultaneousLoadTest.java +++ b/source/java/org/alfresco/repo/avm/SimultaneousLoadTest.java @@ -43,7 +43,7 @@ public class SimultaneousLoadTest extends AVMServiceTestBase Thread [] threads = new Thread[n]; for (int i = 0; i < n; i++) { - Loader loader = new Loader("source", "main:/d" + i, m); + Loader loader = new Loader("/Users/britt/stuff/" + i, "main:/d" + i, m); threads[i] = new Thread(loader); threads[i].start(); } diff --git a/source/java/org/alfresco/repo/avm/hibernate/HibernateHelper.java b/source/java/org/alfresco/repo/avm/hibernate/HibernateHelper.java deleted file mode 100644 index 333a6a21e1..0000000000 --- a/source/java/org/alfresco/repo/avm/hibernate/HibernateHelper.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2006 Alfresco, Inc. - * - * Licensed under the Mozilla Public License version 1.1 - * with a permitted attribution clause. You may obtain a - * copy of the License at - * - * http://www.alfresco.org/legal/license.txt - * - * 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. - */ - -package org.alfresco.repo.avm.hibernate; - -import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; - -/** - * Like 83.7 gazillion others, a HibernateHelper. This will go away. - * @author britt - */ -public class HibernateHelper -{ - /** - * The single instance of this. - */ - private static HibernateHelper fgInstance = null; - - /** - * The Hibernate Configuration object. - */ - private Configuration fCfg; - - /** - * The Hibernate SessionFactory; - */ - private SessionFactory fFactory; - - public HibernateHelper() - { - fCfg = null; - fFactory = null; - setup(); - fgInstance = this; - } - - public SessionFactory getSessionFactory() - { - return fFactory; - } - - public Configuration getConfiguration() - { - return fCfg; - } - - public void setup() - { - try - { - fCfg = new Configuration(); - fCfg.configure(); - fFactory = fCfg.buildSessionFactory(); - } - catch (Throwable t) - { - t.printStackTrace(System.err); - System.exit(1); - } - } - - public void shutdown() - { - fFactory.close(); - } - - public static HibernateHelper GetInstance() - { - return fgInstance; - } -} diff --git a/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java b/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java index d0da555963..295bf7de70 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java +++ b/source/java/org/alfresco/repo/avm/hibernate/HibernateTxn.java @@ -18,11 +18,11 @@ package org.alfresco.repo.avm.hibernate; */ import java.util.Random; -import java.util.concurrent.locks.ReentrantReadWriteLock; import org.alfresco.repo.avm.AVMException; -import org.hibernate.FlushMode; +import org.alfresco.repo.avm.AVMNotFoundException; import org.hibernate.HibernateException; +import org.hibernate.ObjectNotFoundException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.StaleStateException; @@ -46,20 +46,22 @@ public class HibernateTxn */ private Random fRandom; - /** - * The BFL. - */ - private ReentrantReadWriteLock fLock; - /** * Make one up. * @param sessionFactory The SessionFactory. */ - public HibernateTxn(SessionFactory sessionFactory) + public HibernateTxn() { - fSessionFactory = sessionFactory; fRandom = new Random(); - fLock = new ReentrantReadWriteLock(true); // Make the lock fair. + } + + /** + * Set the Hibernate Session factory. + * @param factory + */ + public void setSessionFactory(SessionFactory factory) + { + fSessionFactory = factory; } /** @@ -76,18 +78,7 @@ public class HibernateTxn { try { - /* - if (write) - { - fLock.writeLock().lock(); - } - else - { - fLock.readLock().lock(); - } - */ sess = fSessionFactory.openSession(); -// sess.setFlushMode(FlushMode.ALWAYS); txn = sess.beginTransaction(); callback.perform(sess); txn.commit(); @@ -113,23 +104,23 @@ public class HibernateTxn { if (t instanceof StaleStateException) { - System.err.println("Lost Race"); - StackTraceElement [] stack = t.getStackTrace(); - long threadID = Thread.currentThread().getId(); - for (StackTraceElement frame : stack) - { - System.err.println(threadID + " " + frame); - } +// System.err.println("Lost Race"); +// StackTraceElement [] stack = t.getStackTrace(); +// long threadID = Thread.currentThread().getId(); +// for (StackTraceElement frame : stack) +// { +// System.err.println(threadID + " " + frame); +// } } else { - System.err.println("Deadlock"); - StackTraceElement [] stack = t.getStackTrace(); - long threadID = Thread.currentThread().getId(); - for (StackTraceElement frame : stack) - { - System.err.println(threadID + " " + frame); - } +// System.err.println("Deadlock"); +// StackTraceElement [] stack = t.getStackTrace(); +// long threadID = Thread.currentThread().getId(); +// for (StackTraceElement frame : stack) +// { +// System.err.println(threadID + " " + frame); +// } try { long interval; @@ -154,20 +145,14 @@ public class HibernateTxn } // TODO Crack t into more useful exception types. // Otherwise nothing we can do except throw. - throw new AVMException("Unrecoverable error", t); + if (t instanceof ObjectNotFoundException) + { + throw new AVMNotFoundException("Object not found.", t); + } + throw new AVMException("Unrecoverable error."); } finally { - /* - if (write) - { - fLock.writeLock().unlock(); - } - else - { - fLock.readLock().unlock(); - } - */ if (sess != null) { try diff --git a/source/java/org/alfresco/repo/avm/util/BulkLoader.java b/source/java/org/alfresco/repo/avm/util/BulkLoader.java index f1b562669e..56a663214f 100644 --- a/source/java/org/alfresco/repo/avm/util/BulkLoader.java +++ b/source/java/org/alfresco/repo/avm/util/BulkLoader.java @@ -25,8 +25,6 @@ import java.io.OutputStream; import org.alfresco.repo.avm.AVMException; import org.alfresco.repo.avm.AVMService; -import org.alfresco.repo.avm.AVMServiceImpl; -import org.alfresco.repo.avm.hibernate.HibernateHelper; /** * This takes a filesystem directory path and a repository path and name