Заполнение наборов данных из Oracle в потоках VB - PullRequest
1 голос
/ 20 ноября 2010

Я пытаюсь запустить пару процедур PL / SQL из приложения VB. Процедуры занимают некоторое время, поэтому я собираюсь поместить их в отдельные темы (тема, с которой я новичок)

В настоящее время каждый поток вызывает функцию, которая в свою очередь вызывает следующий код:

' Function getDataSet
' builds a data set from given information
' Parameters:
'   aCommand - the PL/SQL procedure to call
'   aParamCollection - an oraParameterCollection object containing all the parameters
'   aDataSet - a data set to hold the results
' Returns:
'   number of rows retrieved

Public Function getDataSet( _
    ByVal aCommand As String, _
    ByVal aParamCollection As oraParameterCollection, _
    ByRef aDataSet As DataSet _
    ) As Integer

    Dim result As Integer = 0

    ' define commands etc
    Dim cmd As OracleCommand = New OracleCommand(aCommand, dbConn)
    cmd.CommandType = CommandType.StoredProcedure

    ' add parameters for the query
    For i As Integer = 0 To aParamCollection.getParameterCount() - 1
        cmd.Parameters.Add(New OracleParameter( _
                                aParamCollection.getParameterByIndex(i).ParameterName, _
                                aParamCollection.getParameterByIndex(i).ParameterType)).Value = _
                                aParamCollection.getParameterByIndex(i).ParameterValue
    Next

    Dim param As OracleParameter = New OracleParameter("io_cursor", OracleDbType.RefCursor)
    cmd.Parameters.Add(param).Direction = ParameterDirection.Output
    CheckConnection()
    cmd.ExecuteNonQuery()

    Dim cur As OracleRefCursor
    cur = param.Value
    cmd.Dispose()

    Dim theAdaptr As New OracleDataAdapter

    If aDataSet IsNot Nothing Then
        theAdaptr.Fill(aDataSet, cur)
        result = aDataSet.Tables(0).Rows.Count
    End If

    Return result

End Function

Где:
aCommand = процедура PL / SQL для выполнения
aParamCollection = пользовательский класс, который содержит параметры, типы и значения
aDataSet = набор данных для хранения результирующих данных

Однако, когда я запускаю приложение, в этот момент я получаю нарушение прав доступа:

theAdaptr.Fill(aDataSet, cur)

Я предполагаю, что отдельные потоки не могут одновременно вызывать Fill, это правильно? В настоящее время я запускаю каждую тему следующим образом:

    Dim th_Mean As New Thread(AddressOf getMeanData)
    Dim th_Stdev As New Thread(AddressOf getStdevData)

    th_Mean.Name = "th_Mean"
    th_Stdev.Name = "th_Stdev"

    th_Mean.Start()
    th_Stdev.Start()    

    Do While th_Mean.IsAlive Or th_Stdev.IsAlive
    Loop

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

Спасибо за чтение BBZ

1 Ответ

0 голосов
/ 24 ноября 2010

Рассматривали ли вы добавление параллелизма в базе данных?Параллелизм (относительно) прост с декларативным SQL.В зависимости от ваших хранимых процедур, это может быть так же просто, как найти медленный запрос и добавить подсказку, что-то вроде:

select /*+ parallel(my_table) */ * from my_table;

Если процедура больше о построчной обработке, чем запросы, которые вам могут понадобитьсясмотреть на параллельные конвейерные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...