change committed in rev. 1627489 Jacopo
On Sep 25, 2014, at 10:42 AM, Jacopo Cappellato <[email protected]> wrote: > Sorry for the delay of my response. > I am going to commit a change this morning and then I will follow up to > further discuss when I will have a free slot of time. > > Jacopo > > On Sep 25, 2014, at 9:19 AM, Adrian Crum <[email protected]> > wrote: > >> Actually, I would like to restore this feature. We have a 12 CPU server that >> is being bogged down by this change. Always using one thread per CPU is an >> overly simplistic approach and it can make performance suffer. >> >> >> Adrian Crum >> Sandglass Software >> www.sandglass-software.com >> >> On 9/24/2014 9:44 AM, Jacopo Cappellato wrote: >>> Adrian, >>> >>> thank you for the review! I am going to followup with you an this shortly >>> as soon as I'll have a free moment. >>> >>> Jacopo >>> >>> On Sep 23, 2014, at 8:05 PM, Adrian Crum >>> <[email protected]> wrote: >>> >>>> The configurable thread count (maxWorkerPoolSize) is a useful feature. It >>>> is a shame to see it removed. >>>> >>>> Adrian Crum >>>> Sandglass Software >>>> www.sandglass-software.com >>>> >>>> On 9/23/2014 6:04 PM, [email protected] wrote: >>>>> Author: jacopoc >>>>> Date: Tue Sep 23 17:04:20 2014 >>>>> New Revision: 1627092 >>>>> >>>>> URL: http://svn.apache.org/r1627092 >>>>> Log: >>>>> Moved the thread pool executor object from GenericDAO to the DatabaseUtil >>>>> class where it was actually used: this change simplifies the API and >>>>> allows to shutdown the pool when it is no more needed. >>>>> Removed a series of methods that are no more needed after this >>>>> refactoring or were not used. >>>>> >>>>> Modified: >>>>> >>>>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java >>>>> >>>>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java >>>>> ofbiz/trunk/framework/entity/dtd/entity-config.xsd >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java >>>>> >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java >>>>> >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java >>>>> >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java >>>>> >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java >>>>> >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/ExecutionPool.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -44,7 +44,7 @@ public final class ExecutionPool { >>>>> public static final String module = ExecutionPool.class.getName(); >>>>> public static final ExecutorService GLOBAL_BATCH = new >>>>> ThreadPoolExecutor(0, Integer.MAX_VALUE, 5, TimeUnit.SECONDS, new >>>>> SynchronousQueue<Runnable>(), new ExecutionPoolThreadFactory(null, >>>>> "OFBiz-batch")); >>>>> public static final ForkJoinPool GLOBAL_FORK_JOIN = new >>>>> ForkJoinPool(); >>>>> - private static final ExecutorService pulseExecutionPool = >>>>> Executors.newFixedThreadPool(autoAdjustThreadCount(-1), new >>>>> ExecutionPoolThreadFactory(null, "OFBiz-ExecutionPoolPulseWorker")); >>>>> + private static final ExecutorService pulseExecutionPool = >>>>> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), >>>>> new ExecutionPoolThreadFactory(null, "OFBiz-ExecutionPoolPulseWorker")); >>>>> >>>>> protected static class ExecutionPoolThreadFactory implements >>>>> ThreadFactory { >>>>> private final ThreadGroup group; >>>>> @@ -65,22 +65,8 @@ public final class ExecutionPool { >>>>> } >>>>> } >>>>> >>>>> - private static int autoAdjustThreadCount(int threadCount) { >>>>> - if (threadCount == 0) { >>>>> - return 1; >>>>> - } else if (threadCount < 0) { >>>>> - int numCpus = Runtime.getRuntime().availableProcessors(); >>>>> - return Math.abs(threadCount) * numCpus; >>>>> - } else { >>>>> - return threadCount; >>>>> - } >>>>> - } >>>>> - >>>>> - public static ScheduledExecutorService >>>>> getScheduledExecutor(ThreadGroup group, String namePrefix, int >>>>> threadCount, boolean preStart) { >>>>> - return getScheduledExecutor(group, namePrefix, threadCount, 0, >>>>> preStart); >>>>> - } >>>>> public static ScheduledExecutorService >>>>> getScheduledExecutor(ThreadGroup group, String namePrefix, int >>>>> threadCount, long keepAliveSeconds, boolean preStart) { >>>>> - ScheduledThreadPoolExecutor executor = new >>>>> ScheduledThreadPoolExecutor(autoAdjustThreadCount(threadCount), new >>>>> ExecutionPoolThreadFactory(group, namePrefix)); >>>>> + ScheduledThreadPoolExecutor executor = new >>>>> ScheduledThreadPoolExecutor(threadCount, new >>>>> ExecutionPoolThreadFactory(group, namePrefix)); >>>>> if (keepAliveSeconds > 0) { >>>>> executor.setKeepAliveTime(keepAliveSeconds, TimeUnit.SECONDS); >>>>> executor.allowCoreThreadTimeOut(true); >>>>> @@ -114,7 +100,7 @@ public final class ExecutionPool { >>>>> } >>>>> >>>>> static { >>>>> - int numberOfExecutionPoolPulseWorkers = >>>>> autoAdjustThreadCount(-1); >>>>> + int numberOfExecutionPoolPulseWorkers = >>>>> Runtime.getRuntime().availableProcessors(); >>>>> for (int i = 0; i < numberOfExecutionPoolPulseWorkers; i++) { >>>>> pulseExecutionPool.execute(new ExecutionPoolPulseWorker()); >>>>> } >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -616,7 +616,7 @@ public class CatalinaContainer implement >>>>> return; >>>>> } >>>>> >>>>> - ScheduledExecutorService executor = >>>>> ExecutionPool.getScheduledExecutor(CATALINA_THREAD_GROUP, >>>>> "catalina-startup", -1, true); >>>>> + ScheduledExecutorService executor = >>>>> ExecutionPool.getScheduledExecutor(CATALINA_THREAD_GROUP, >>>>> "catalina-startup", Runtime.getRuntime().availableProcessors(), 0, true); >>>>> try { >>>>> List<Future<Context>> futures = new >>>>> ArrayList<Future<Context>>(); >>>>> >>>>> >>>>> Modified: ofbiz/trunk/framework/entity/dtd/entity-config.xsd >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/dtd/entity-config.xsd?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- ofbiz/trunk/framework/entity/dtd/entity-config.xsd (original) >>>>> +++ ofbiz/trunk/framework/entity/dtd/entity-config.xsd Tue Sep 23 >>>>> 17:04:20 2014 >>>>> @@ -411,7 +411,6 @@ under the License. >>>>> <xs:attribute type="xs:string" name="table-type"/> >>>>> <xs:attribute type="xs:string" name="character-set"/> >>>>> <xs:attribute type="xs:string" name="collate"/> >>>>> - <xs:attribute type="xs:integer" name="max-worker-pool-size" >>>>> default="0"/> >>>>> </xs:attributeGroup> >>>>> <xs:element name="sql-load-path"> >>>>> <xs:complexType> >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -36,7 +36,7 @@ public abstract class DelegatorFactory i >>>>> public static final String module = >>>>> DelegatorFactoryImpl.class.getName(); >>>>> private static final ConcurrentHashMap<String, Future<Delegator>> >>>>> delegators = new ConcurrentHashMap<String, Future<Delegator>>(); >>>>> private static final ThreadGroup DELEGATOR_THREAD_GROUP = new >>>>> ThreadGroup("DelegatorFactory"); >>>>> - private static final ScheduledExecutorService executor = >>>>> ExecutionPool.getScheduledExecutor(DELEGATOR_THREAD_GROUP, >>>>> "delegator-startup", -1, 10, true); >>>>> + private static final ScheduledExecutorService executor = >>>>> ExecutionPool.getScheduledExecutor(DELEGATOR_THREAD_GROUP, >>>>> "delegator-startup", Runtime.getRuntime().availableProcessors(), 10, >>>>> true); >>>>> >>>>> public static Delegator getDelegator(String delegatorName) { >>>>> Future<Delegator> future = getDelegatorFuture(delegatorName); >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/model/Datasource.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -74,7 +74,6 @@ public final class Datasource { >>>>> private final String tableType; // type = xs:string >>>>> private final String characterSet; // type = xs:string >>>>> private final String collate; // type = xs:string >>>>> - private final int maxWorkerPoolSize; // type = xs:integer >>>>> private final List<SqlLoadPath> sqlLoadPathList; // <sql-load-path> >>>>> private final List<ReadData> readDataList; // <read-data> >>>>> private final InlineJdbc inlineJdbc; // <inline-jdbc> >>>>> @@ -161,22 +160,6 @@ public final class Datasource { >>>>> this.tableType = element.getAttribute("table-type").intern(); >>>>> this.characterSet = >>>>> element.getAttribute("character-set").intern(); >>>>> this.collate = element.getAttribute("collate").intern(); >>>>> - String maxWorkerPoolSize = >>>>> element.getAttribute("max-worker-pool-size").intern(); >>>>> - if (maxWorkerPoolSize.isEmpty()) { >>>>> - this.maxWorkerPoolSize = 1; >>>>> - } else { >>>>> - try { >>>>> - int maxWorkerPoolSizeInt = >>>>> Integer.parseInt(maxWorkerPoolSize); >>>>> - if (maxWorkerPoolSizeInt == 0) { >>>>> - maxWorkerPoolSizeInt = 1; >>>>> - } else if (maxWorkerPoolSizeInt < -2) { >>>>> - maxWorkerPoolSizeInt = -2; >>>>> - } >>>>> - this.maxWorkerPoolSize = maxWorkerPoolSizeInt; >>>>> - } catch (Exception e) { >>>>> - throw new GenericEntityConfException("<datasource> >>>>> element max-worker-pool-size attribute is invalid" + lineNumberText); >>>>> - } >>>>> - } >>>>> List<? extends Element> sqlLoadPathElementList = >>>>> UtilXml.childElementList(element, "sql-load-path"); >>>>> if (sqlLoadPathElementList.isEmpty()) { >>>>> this.sqlLoadPathList = Collections.emptyList(); >>>>> @@ -384,11 +367,6 @@ public final class Datasource { >>>>> return this.collate; >>>>> } >>>>> >>>>> - /** Returns the value of the <code>max-worker-pool-size</code> >>>>> attribute. */ >>>>> - public int getMaxWorkerPoolSize() { >>>>> - return this.maxWorkerPoolSize; >>>>> - } >>>>> - >>>>> /** Returns the <code><sql-load-path></code> child elements. */ >>>>> public List<SqlLoadPath> getSqlLoadPathList() { >>>>> return this.sqlLoadPathList; >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -31,12 +31,8 @@ import java.util.List; >>>>> import java.util.Map; >>>>> import java.util.Set; >>>>> import java.util.TreeSet; >>>>> -import java.util.concurrent.Callable; >>>>> import java.util.concurrent.ConcurrentHashMap; >>>>> -import java.util.concurrent.ExecutorService; >>>>> -import java.util.concurrent.Future; >>>>> >>>>> -import org.ofbiz.base.concurrent.ExecutionPool; >>>>> import org.ofbiz.base.util.Debug; >>>>> import org.ofbiz.base.util.UtilValidate; >>>>> import org.ofbiz.entity.Delegator; >>>>> @@ -78,7 +74,6 @@ public class GenericDAO { >>>>> private final GenericHelperInfo helperInfo; >>>>> private final ModelFieldTypeReader modelFieldTypeReader; >>>>> private final Datasource datasource; >>>>> - private final ExecutorService executor; >>>>> >>>>> public static GenericDAO getGenericDAO(GenericHelperInfo helperInfo) { >>>>> String cacheKey = helperInfo.getHelperFullName(); >>>>> @@ -94,11 +89,6 @@ public class GenericDAO { >>>>> this.helperInfo = helperInfo; >>>>> this.modelFieldTypeReader = >>>>> ModelFieldTypeReader.getModelFieldTypeReader(helperInfo.getHelperBaseName()); >>>>> this.datasource = >>>>> EntityConfig.getDatasource(helperInfo.getHelperBaseName()); >>>>> - this.executor = >>>>> ExecutionPool.getScheduledExecutor(GENERIC_DAO_THREAD_GROUP, >>>>> "OFBiz-entity-datasource(" + helperInfo.getHelperFullName() + ")", >>>>> datasource.getMaxWorkerPoolSize(), false); >>>>> - } >>>>> - >>>>> - public <T> Future<T> submitWork(Callable<T> callable) throws >>>>> GenericEntityException { >>>>> - return this.executor.submit(callable); >>>>> } >>>>> >>>>> private void addFieldIfMissing(List<ModelField> fieldsToSave, String >>>>> fieldName, ModelEntity modelEntity) { >>>>> @@ -1228,13 +1218,13 @@ public class GenericDAO { >>>>> /* >>>>> ====================================================================== */ >>>>> >>>>> public void checkDb(Map<String, ModelEntity> modelEntities, >>>>> List<String> messages, boolean addMissing) { >>>>> - DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo, >>>>> this.executor); >>>>> + DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo); >>>>> dbUtil.checkDb(modelEntities, messages, addMissing); >>>>> } >>>>> >>>>> /** Creates a list of ModelEntity objects based on meta data from the >>>>> database */ >>>>> public List<ModelEntity> induceModelFromDb(Collection<String> >>>>> messages) { >>>>> - DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo, >>>>> this.executor); >>>>> + DatabaseUtil dbUtil = new DatabaseUtil(this.helperInfo); >>>>> return dbUtil.induceModelFromDb(messages); >>>>> } >>>>> } >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelper.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -49,8 +49,6 @@ public interface GenericHelper { >>>>> */ >>>>> public String getHelperName(); >>>>> >>>>> - public <T> Future<T> submitWork(Callable<T> callable) throws >>>>> GenericEntityException; >>>>> - >>>>> /** Creates a Entity in the form of a GenericValue and write it to >>>>> the database >>>>> *@return GenericValue instance containing the new instance >>>>> */ >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericHelperDAO.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -57,10 +57,6 @@ public class GenericHelperDAO implements >>>>> return this.helperInfo.getHelperFullName(); >>>>> } >>>>> >>>>> - public <T> Future<T> submitWork(Callable<T> callable) throws >>>>> GenericEntityException { >>>>> - return genericDAO.submitWork(callable); >>>>> - } >>>>> - >>>>> /** Creates a Entity in the form of a GenericValue and write it to >>>>> the database >>>>> *@return GenericValue instance containing the new instance >>>>> */ >>>>> >>>>> Modified: >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java >>>>> URL: >>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java?rev=1627092&r1=1627091&r2=1627092&view=diff >>>>> ============================================================================== >>>>> --- >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java >>>>> (original) >>>>> +++ >>>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java >>>>> Tue Sep 23 17:04:20 2014 >>>>> @@ -40,6 +40,7 @@ import java.util.Set; >>>>> import java.util.TreeSet; >>>>> import java.util.concurrent.Callable; >>>>> import java.util.concurrent.ExecutorService; >>>>> +import java.util.concurrent.Executors; >>>>> import java.util.concurrent.Future; >>>>> import java.util.concurrent.FutureTask; >>>>> >>>>> @@ -47,7 +48,6 @@ import org.ofbiz.base.concurrent.Executi >>>>> import org.ofbiz.base.util.Debug; >>>>> import org.ofbiz.base.util.UtilTimer; >>>>> import org.ofbiz.base.util.UtilValidate; >>>>> -import org.ofbiz.base.util.UtilXml; >>>>> import org.ofbiz.entity.GenericEntityException; >>>>> import org.ofbiz.entity.config.model.Datasource; >>>>> import org.ofbiz.entity.config.model.EntityConfig; >>>>> @@ -62,8 +62,6 @@ import org.ofbiz.entity.model.ModelRelat >>>>> import org.ofbiz.entity.model.ModelViewEntity; >>>>> import org.ofbiz.entity.transaction.TransactionFactoryLoader; >>>>> import org.ofbiz.entity.transaction.TransactionUtil; >>>>> -import org.w3c.dom.Document; >>>>> -import org.w3c.dom.Element; >>>>> >>>>> /** >>>>> * Utilities for Entity Database Maintenance >>>>> @@ -85,18 +83,12 @@ public class DatabaseUtil { >>>>> protected String password = null; >>>>> >>>>> boolean isLegacy = false; >>>>> - protected ExecutorService executor; >>>>> >>>>> // OFBiz DatabaseUtil >>>>> public DatabaseUtil(GenericHelperInfo helperInfo) { >>>>> - this(helperInfo, null); >>>>> - } >>>>> - >>>>> - public DatabaseUtil(GenericHelperInfo helperInfo, ExecutorService >>>>> executor) { >>>>> this.helperInfo = helperInfo; >>>>> this.modelFieldTypeReader = >>>>> ModelFieldTypeReader.getModelFieldTypeReader(helperInfo.getHelperBaseName()); >>>>> this.datasourceInfo = >>>>> EntityConfig.getDatasource(helperInfo.getHelperBaseName()); >>>>> - this.executor = executor; >>>>> } >>>>> >>>>> // Legacy DatabaseUtil >>>>> @@ -108,31 +100,6 @@ public class DatabaseUtil { >>>>> this.isLegacy = true; >>>>> } >>>>> >>>>> - protected <T> Future<T> submitWork(Callable<T> callable) { >>>>> - if (this.executor == null) { >>>>> - FutureTask<T> task = new FutureTask<T>(callable); >>>>> - task.run(); >>>>> - return task; >>>>> - } >>>>> - return this.executor.submit(callable); >>>>> - } >>>>> - >>>>> - protected <T> List<Future<T>> submitAll(Collection<? extends >>>>> Callable<T>> tasks) { >>>>> - List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); >>>>> - if (this.executor == null) { >>>>> - for (Callable<T> callable: tasks) { >>>>> - FutureTask<T> task = new FutureTask<T>(callable); >>>>> - task.run(); >>>>> - futures.add(task); >>>>> - } >>>>> - return futures; >>>>> - } >>>>> - for (Callable<T> callable: tasks) { >>>>> - futures.add(this.executor.submit(callable)); >>>>> - } >>>>> - return futures; >>>>> - } >>>>> - >>>>> protected Connection getConnection() throws SQLException, >>>>> GenericEntityException { >>>>> Connection connection = null; >>>>> if (!isLegacy) { >>>>> @@ -216,6 +183,9 @@ public class DatabaseUtil { >>>>> if (isLegacy) { >>>>> throw new RuntimeException("Cannot run checkDb on a legacy >>>>> database connection; configure a database helper (entityengine.xml)"); >>>>> } >>>>> + >>>>> + ExecutorService executor = >>>>> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); >>>>> + >>>>> UtilTimer timer = new UtilTimer(); >>>>> timer.timerString("Start - Before Get Database Meta Data"); >>>>> >>>>> @@ -233,7 +203,7 @@ public class DatabaseUtil { >>>>> timer.timerString("After Get All Table Names"); >>>>> >>>>> // get ALL column info, put into hashmap by table name >>>>> - Map<String, Map<String, ColumnCheckInfo>> colInfo = >>>>> this.getColumnInfo(tableNames, checkPks, messages); >>>>> + Map<String, Map<String, ColumnCheckInfo>> colInfo = >>>>> getColumnInfo(tableNames, checkPks, messages, executor); >>>>> if (colInfo == null) { >>>>> String message = "Could not get column information from the >>>>> database, aborting."; >>>>> if (messages != null) messages.add(message); >>>>> @@ -455,7 +425,7 @@ public class DatabaseUtil { >>>>> >>>>> if (addMissing) { >>>>> // create the table >>>>> - tableFutures.add(submitWork(new >>>>> CreateTableCallable(entity, modelEntities, tableName))); >>>>> + tableFutures.add(executor.submit(new >>>>> CreateTableCallable(entity, modelEntities, tableName))); >>>>> } >>>>> } >>>>> } >>>>> @@ -478,7 +448,7 @@ public class DatabaseUtil { >>>>> List<Future<AbstractCountingCallable>> fkIndicesFutures = new >>>>> LinkedList<Future<AbstractCountingCallable>>(); >>>>> for (ModelEntity curEntity: entitiesAdded) { >>>>> if (curEntity.getRelationsOneSize() > 0) { >>>>> - fkIndicesFutures.add(submitWork(new >>>>> AbstractCountingCallable(curEntity, modelEntities) { >>>>> + fkIndicesFutures.add(executor.submit(new >>>>> AbstractCountingCallable(curEntity, modelEntities) { >>>>> public AbstractCountingCallable call() throws >>>>> Exception { >>>>> count = createForeignKeyIndices(entity, >>>>> datasourceInfo.getConstraintNameClipLength(), messages); >>>>> return this; >>>>> @@ -507,7 +477,7 @@ public class DatabaseUtil { >>>>> List<Future<AbstractCountingCallable>> disFutures = new >>>>> LinkedList<Future<AbstractCountingCallable>>(); >>>>> for (ModelEntity curEntity: entitiesAdded) { >>>>> if (curEntity.getIndexesSize() > 0) { >>>>> - disFutures.add(submitWork(new >>>>> AbstractCountingCallable(curEntity, modelEntities) { >>>>> + disFutures.add(executor.submit(new >>>>> AbstractCountingCallable(curEntity, modelEntities) { >>>>> public AbstractCountingCallable call() throws >>>>> Exception { >>>>> count = createDeclaredIndices(entity, messages); >>>>> return this; >>>>> @@ -755,17 +725,19 @@ public class DatabaseUtil { >>>>> >>>>> } >>>>> >>>>> - >>>>> + executor.shutdown(); >>>>> timer.timerString("Finished Checking Entity Database"); >>>>> } >>>>> >>>>> /** Creates a list of ModelEntity objects based on meta data from the >>>>> database */ >>>>> public List<ModelEntity> induceModelFromDb(Collection<String> >>>>> messages) { >>>>> + ExecutorService executor = >>>>> Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); >>>>> + >>>>> // get ALL tables from this database >>>>> TreeSet<String> tableNames = this.getTableNames(messages); >>>>> >>>>> // get ALL column info, put into hashmap by table name >>>>> - Map<String, Map<String, ColumnCheckInfo>> colInfo = >>>>> this.getColumnInfo(tableNames, true, messages); >>>>> + Map<String, Map<String, ColumnCheckInfo>> colInfo = >>>>> getColumnInfo(tableNames, true, messages, executor); >>>>> >>>>> // go through each table and make a ModelEntity object, add to >>>>> list >>>>> // for each entity make corresponding ModelField objects >>>>> @@ -789,66 +761,10 @@ public class DatabaseUtil { >>>>> newEntList.add(newEntity); >>>>> } >>>>> >>>>> + executor.shutdown(); >>>>> return newEntList; >>>>> } >>>>> >>>>> - public Document induceModelFromDb(String packageName) { >>>>> - Document document = UtilXml.makeEmptyXmlDocument("entitymodel"); >>>>> - Element root = document.getDocumentElement(); >>>>> - root.appendChild(document.createElement("title")); >>>>> - root.appendChild(document.createElement("description")); >>>>> - root.appendChild(document.createElement("copyright")); >>>>> - root.appendChild(document.createElement("author")); >>>>> - root.appendChild(document.createElement("version")); >>>>> - >>>>> - // messages list >>>>> - List<String> messages = new ArrayList<String>(); >>>>> - >>>>> - // get ALL tables from this database >>>>> - TreeSet<String> tableNames = this.getTableNames(messages); >>>>> - >>>>> - // get ALL column info, put into hashmap by table name >>>>> - Map<String, Map<String, ColumnCheckInfo>> colInfo = >>>>> this.getColumnInfo(tableNames, true, messages); >>>>> - >>>>> - boolean isCaseSensitive = false; >>>>> - DatabaseMetaData dbData = this.getDatabaseMetaData(null, >>>>> messages); >>>>> - if (dbData != null) { >>>>> - try { >>>>> - isCaseSensitive = dbData.supportsMixedCaseIdentifiers(); >>>>> - } catch (SQLException e) { >>>>> - Debug.logError(e, "Error getting db meta data about case >>>>> sensitive", module); >>>>> - } >>>>> - } >>>>> - >>>>> - if (UtilValidate.isNotEmpty(packageName)) { >>>>> - String catalogName = null; >>>>> - try { >>>>> - catalogName = this.getConnection().getCatalog(); >>>>> - } catch (Exception e) { >>>>> - // ignore >>>>> - } >>>>> - packageName = "org.ofbiz.ext." + (catalogName != null ? >>>>> catalogName : "unknown"); >>>>> - } >>>>> - >>>>> - >>>>> - // iterate over the table names is alphabetical order >>>>> - for (String tableName: new TreeSet<String>(colInfo.keySet())) { >>>>> - Map<String, ColumnCheckInfo> colMap = colInfo.get(tableName); >>>>> - ModelEntity newEntity = new ModelEntity(tableName, colMap, >>>>> modelFieldTypeReader, isCaseSensitive); >>>>> - root.appendChild(newEntity.toXmlElement(document, >>>>> "org.ofbiz.ext." + packageName)); >>>>> - } >>>>> - >>>>> - // print the messages to the console >>>>> - for (String message: messages) { >>>>> - Debug.logInfo(message, module); >>>>> - } >>>>> - return document; >>>>> - } >>>>> - >>>>> - public Document induceModelFromDb() { >>>>> - return this.induceModelFromDb(""); >>>>> - } >>>>> - >>>>> public DatabaseMetaData getDatabaseMetaData(Connection connection, >>>>> Collection<String> messages) { >>>>> if (connection == null) { >>>>> connection = getConnectionLogged(messages); >>>>> @@ -1129,7 +1045,7 @@ public class DatabaseUtil { >>>>> }; >>>>> } >>>>> >>>>> - public Map<String, Map<String, ColumnCheckInfo>> >>>>> getColumnInfo(Set<String> tableNames, boolean getPks, Collection<String> >>>>> messages) { >>>>> + private Map<String, Map<String, ColumnCheckInfo>> >>>>> getColumnInfo(Set<String> tableNames, boolean getPks, Collection<String> >>>>> messages, ExecutorService executor) { >>>>> // if there are no tableNames, don't even try to get the columns >>>>> if (tableNames.size() == 0) { >>>>> return new HashMap<String, Map<String, ColumnCheckInfo>>(); >>>>> @@ -1261,7 +1177,7 @@ public class DatabaseUtil { >>>>> List<Future<AbstractCountingCallable>> >>>>> pkFetcherFutures = new LinkedList<Future<AbstractCountingCallable>>(); >>>>> for (String curTable: tableNames) { >>>>> curTable = >>>>> curTable.substring(curTable.indexOf('.') + 1); //cut off schema name >>>>> - >>>>> pkFetcherFutures.add(submitWork(createPrimaryKeyFetcher(dbData, >>>>> lookupSchemaName, needsUpperCase, colInfo, messages, curTable))); >>>>> + >>>>> pkFetcherFutures.add(executor.submit(createPrimaryKeyFetcher(dbData, >>>>> lookupSchemaName, needsUpperCase, colInfo, messages, curTable))); >>>>> } >>>>> for (AbstractCountingCallable pkFetcherCallable: >>>>> ExecutionPool.getAllFutures(pkFetcherFutures)) { >>>>> pkCount += >>>>> pkFetcherCallable.updateData(messages); >>>>> >>>>> >>> >
