Author: boisvert
Date: Wed Oct 7 01:15:27 2009
New Revision: 822547
URL: http://svn.apache.org/viewvc?rev=822547&view=rev
Log:
Fix issue where InstanceManagement.listInstances() and variants would fail on
Oracle if > 1000 instances match selection criteria
Modified:
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
Modified:
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java?rev=822547&r1=822546&r2=822547&view=diff
==============================================================================
---
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
(original)
+++
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
Wed Oct 7 01:15:27 2009
@@ -312,13 +312,23 @@
if (instances.size() == 0) {
return new HashMap<Long, Collection<CorrelationSetDAO>>();
}
- Long[] iids = new Long[instances.size()];
+ ArrayList<Long> iids = new ArrayList<Long>(instances.size());
int i=0;
for (ProcessInstanceDAO dao: instances) {
- iids[i] = dao.getInstanceId();
+ iids.add(dao.getInstanceId());
i++;
}
- Collection<HCorrelationSet> csets =
getSession().getNamedQuery(HCorrelationSet.SELECT_CORSETS_BY_INSTANCES).setParameterList("instances",
iids).list();
+ Collection<HCorrelationSet> csets = new ArrayList<HCorrelationSet>();
+ // some databases don't like long lists of values with IN operator
+ // so we select in batches. Oracle 9i, for instance, doesn't support
+ // more than 1000 -- we opt to be conservative.
+ final int batchSize = 100;
+ int index = 0;
+ while (index < iids.size()) {
+ List<Long> subList = iids.subList(index, Math.min(index+batchSize,
iids.size()));
+
csets.addAll(getSession().getNamedQuery(HCorrelationSet.SELECT_CORSETS_BY_INSTANCES).setParameterList("instances",
subList).list());
+ index += batchSize;
+ }
Map<Long, Collection<CorrelationSetDAO>> map = new HashMap<Long,
Collection<CorrelationSetDAO>>();
for (HCorrelationSet cset: csets) {
Long id = cset.getInstance().getId();