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>&lt;sql-load-path&gt;</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);
>>>>> 
>>>>> 
>>> 
> 

Reply via email to