Моя процедура возвращает несколько наборов результатов. Могу ли я передать их службе исполнителя?

#java #grails #groovy #resultset #executorservice

Вопрос:

Чего я здесь пытаюсь добиться, так это того, что все мои наборы результатов занимают так много времени, и я хочу сократить время, используя многопоточность. В каком-то методе я обрабатываю значение этого набора результатов. Или есть какой-либо другой способ параллельной обработки всех этих наборов результатов?

 sql.call("{call MY_PROCEDURE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}",
                [caseNumber, version, followUpNumber, caseType,
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.resultSet(OracleTypes.CURSOR), Sql.resultSet(OracleTypes.CURSOR),
                 Sql.NUMERIC]) { po_case_info, po_prod_info, po_event_info, po_pe_info, po_med_hist_info,
                                 po_death_info, po_dosage_info, po_lab_info, po_narrative_info, po_version_info,
                                 po_literature_info, po_patient_info, po_pregnancy_info, po_study_info, po_case_ref_info,
                                 po_device_info, po_device_problem, po_cmnt_case_info, po_version_num ->

executorService.submit({ ->
                if (po_case_info != null) {
                    while (po_case_info.next()) {
                        resultSetCount  
                        someMethod(po_case_info)
                    }
                    if (resultSetCount == Constants.Commons.ZERO) {
                        someMethod()
                    }
                }
            } as Runnable)

executorService.submit({ ->
                if (po_prod_info != null) {
                    while (po_prod_info.next()) {
                        resultSetCount  
                        someMethod(po_prod_info)
                    }
                    if (resultSetCount == Constants.Commons.ZERO) {
                        someMethod()
                    }
                }
            } as Runnable)

.
.
.
.
.
}
 

Я получаю эту ошибку

 
java.sql.SQLException: Closed Resultset
        at oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:297)
        at oracle.jdbc.driver.GeneratedResultSet.getString(GeneratedResultSet.java:1460)
        at sun.reflect.GeneratedMethodAccessor878.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1432)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1218)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
        at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:913)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:904)
        at groovy.sql.GroovyResultSetExtension.invokeMethod(GroovyResultSetExtension.java:101)
        at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:931)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:908)
        at groovy.sql.GroovyResultSetProxy.invoke(GroovyResultSetProxy.java:93)
        at com.sun.proxy.$Proxy179.getString(Unknown Source)
        at java_sql_ResultSet$getString.call(Unknown Source)
 

Комментарии:

1. наверняка вы можете, как и любой другой объект. ошибка, которая у вас возникла из — за логики в вашем коде-бьюсь об заклад, вы закрыли инструкцию, и она закрыла все наборы результатов

2. @daggett Я не закрываю ни одно заявление, этот код работает нормально, если я не использую службу исполнителя.

3. о, я скучала по этому. sql.call(query){ ... } делаю это для тебя.

4. спасибо , в этом и была проблема.

5. В будущем убедитесь, что вы лучше форматируете, и, поскольку у вас есть решение, вы можете написать ответ самостоятельно и закрыть вопрос.