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