Как многопоточность вызовов хранимых процедур в Java из списка массивов? - PullRequest
0 голосов
/ 09 января 2019

В настоящее время у меня есть Java-программа, которая запускает один вызов хранимой процедуры по одной записи за раз из списка массивов, который проходит до тех пор, пока все записи не будут обработаны. Для возврата из вызова хранимой процедуры требуется около 8 секунд на каждую запись. После завершения вызова он получает сообщение XML от SP и продолжает код, чтобы записать это сообщение в очередь, а затем обновляет поле в базе данных, чтобы пометить запись как обработанную.

То, что я хотел бы сделать, это иметь x количество потоков, ударить / вызвать хранимую процедуру за один раз, чтобы ускорить время обработки полного списка массивов и перейти к другим шагам, как сейчас. Список массивов может быть от нескольких сотен записей до 4000 и более.

Есть ли способ пройти через тот же процесс после вызова, но добавить многопоточность для одновременного попадания в SP несколько раз, чтобы все не сталкивалось друг с другом, вызывая проблемы? Я только кодировал в течение короткого периода времени, поэтому, пожалуйста, потерпите меня, спасибо!

public void callStoredProcedure(){

    Connection conn = null;
    DSConnection dsc = new DSConnection();

    CallableStatement callableStatement = null;

    /*
     * stored procedure LWN_XML_PURCHASEORDER
     * 
     *  in_company IN NUMBER,
        in_PO_NUMBER IN VARCHAR2,
        in_po_release IN NUMBER,
        in_po_code IN VARCHAR2,
        in_object_TYPE IN VARCHAR2,
        RET_CODE OUT NUMBER,
        RET_MSG OUT CLOB)
    */

    ArrayList<YmpohdroutDbo> PurchOrderList = new ArrayList<YmpohdroutDbo>(getInsertUpdatePurchOrders().values());

    try {

        //conn = dsc.getConnection();

        ProcedureResult res;

        for(int i=0;i<PurchOrderList.size();i++) {

            conn = dsc.getConnection();

            // calling SP   
            callableStatement = conn.prepareCall("{ call "+PurchaseOrder.dbProperties.getProperty("Schema") +".LWN_XML_PURCHASEORDER(?,?,?,?,?,?,?)}");

            // register input fields of SP
            callableStatement.setInt(1, PurchOrderList.get(i).getCompany());
            callableStatement.setString(2, PurchOrderList.get(i).getPO_Number());
            callableStatement.setInt(3, PurchOrderList.get(i).getPO_Release());
            callableStatement.setString(4, PurchOrderList.get(i).getPO_Code());
            callableStatement.setString(5, (PurchaseOrder.projProperties.getProperty(Constants.SEC_KEY_COMMENT_TYPE))); 

            // register output fields of stored procedure 
            callableStatement.registerOutParameter(6, java.sql.Types.INTEGER);
            callableStatement.registerOutParameter(7, java.sql.Types.CLOB);

            // execute LWN_XML_PURCHASEORDER SP
            callableStatement.execute();

            res = new ProcedureResult();
            res.setCode(callableStatement.getInt(6));
            res.setMessage(callableStatement.getClob(7));

            // send response from SP to MQ
            PurchaseOrder.writeClobMQMessage(res.getMessage());

            // mark record as processed 
            markRecordAsProcessed(PurchOrderList.get(i), conn);

            DSConnection.close(conn, null, callableStatement, null);
        }   
    } catch (Exception e) {
        logger.error(e);
        System.exit(1);
    } finally {
        if (callableStatement != null) {
            try {
                callableStatement.close();
            } catch (SQLException e) {
                logger.error(e);
            }
        }

        if (conn != null) {
            DSConnection.close(conn, null, callableStatement, null);
        }
    }

}

1 Ответ

0 голосов
/ 09 января 2019

Вы можете просто запустить несколько потоков, каждый из которых выполняет один и тот же метод callStoredProcedure. Единственное изменение состоит в том, чтобы переместить PurchaseOrderList из callStoredProcedure, чтобы сделать его общим для всех потоков, и преобразовать его в очередь вместо ArrayList.

UPDT это частный случай шаблона «производитель-потребитель» с одним производителем, который заполняет очередь, и несколькими потребителями, которые берут элементы (записи) из очереди.

...