QA@IT
«質問へ戻る

0
本文
 VB.NETのマルチスレッドでORACLEDBにUPDATEを並列的にするアプリケーションを作っています。
- 配列の一番前から順に取り出し、次々UPDATE処理を何百件と行うものです。
- 
-私の知識不足もあって、正直原因がわかりません 
 
-***以下の部分のように作っています。
-※実際にはもう少ししっかりしているのですが、一部割愛してあります。
- 
-しかし、1~2百件処理したときにエラーが発生します。(※それまでの分はちゃんと更新されています。)
- 
-UPDATE文が失敗するのはいいのですが、トランザクション中でオブジェクトが存在しませんというのがわかりません。
- 中途半端にUPDATEされている部分があるので、しっかりロールバックしてほしいと思っています。
- 
-どうやら、スレッド毎にORASESSIONが確立できていないようで、他のセッションのコミットやロールバックが邪魔しているようです。
-間違っている個所のご指摘・修正例をいただけると助かります。
- よろしくお願いします。
-
-***************
-
-Imports System
-Imports System.Threading
-
-Public Class Form1
-
-    Dim ARRAY1 As New ArrayList
-    'ARRAY1には1000件近いデータが配列で入っている。
-
-    Dim OraSession As Object
-    Dim OraDatabase As Object
-    Dim OraDynaset As Object
-
-    '開始部分
-    Private Sub Main()
-
-        Dim threadA As New Thread( _
-            New ThreadStart(AddressOf ThreadMethod))
-        Dim threadB As New Thread( _
-            New ThreadStart(AddressOf ThreadMethod))
-        Dim threadC As New Thread( _
-            New ThreadStart(AddressOf ThreadMethod))
-
-        threadA.Start()
-
-    End Sub
-
-    'オラクルDBに接続する部分
-    Private Sub ORACLESESSION()
-
-        OraSession = CreateObject("OracleInProcServer.XOraSession")
-        OraDatabase = OraSession.OpenDatabase("TNS", "USER/PASS", 0)
-
-    End Sub
-
-    'マルチスレッドの基礎部分
-    Private Sub ThreadMethod()
-
-        ORACLESESSION()
-
-        For i As Integer = 0 To 99
-
-            EXEORACLE()
-
-        Next i
-    End Sub
-
-    'データのUPDATEを行います。
-        Private Sub EXEORACLE()
-
-        Dim FACTOR1 As String
-        Dim strSQL As String
-
-        SyncLock ARRAY1.SyncRoot
-
-            FACTOR1 = ARRAY1(0)
-            ARRAY1(0).RemoveAt(0)
-
-        End SyncLock
-
-        Try
-            OraSession.BeginTrans()
-
-            strSQL = "UPDATE HINMST SET ENDFLG = 1 WHERE MAKERCODE = '" & FACTOR1 & "'"
-
-            OraDatabase.ExecuteSQL(strSQL) 'まず、ここでエラーが発生する。(SQL実行エラー?)
-
-        Catch
-
-            OraSession.Rollback() 'そのあと、ここでエラーが発生する(※「ComErrorExceptionがハンドルされませんでした。」「ロールバックするオブジェクトが存在しません。」というエラー)
-
-            Exit Sub
-        End Try
-
-        OraSession.CommitTrans()
-
-    End Sub
-
-End Class
+WEBアプリなどではAPサーバー上の同じアプリをスレッドを複数作って並列処理などしてDBに更新・参照していると思いますが、
+グローバルにセッションを作らずに、スレッド毎に同じ変数を定義して、セッションを確立しているのでしょうか?

VB.NETのマルチスレッド毎にORASESSIONを確立するには??

VB.NETのマルチスレッドでORACLEDBにUPDATEを並列的にするアプリケーションを作っています。

WEBアプリなどではAPサーバー上の同じアプリをスレッドを複数作って並列処理などしてDBに更新・参照していると思いますが、
グローバルにセッションを作らずに、スレッド毎に同じ変数を定義して、セッションを確立しているのでしょうか?

VB.NETのマルチスレッドでORACLEDBにUPDATEを並列的にするアプリケーションを作っています。

WEBアプリなどではAPサーバー上の同じアプリをスレッドを複数作って並列処理などしてDBに更新・参照していると思いますが、
グローバルにセッションを作らずに、スレッド毎に同じ変数を定義して、セッションを確立しているのでしょうか?

質問を投稿

VB.NETのマルチスレッド毎にORASESSIONを確立するには??

VB.NETのマルチスレッドでORACLEDBにUPDATEを並列的にするアプリケーションを作っています。
配列の一番前から順に取り出し、次々UPDATE処理を何百件と行うものです。

私の知識不足もあって、正直原因がわかりません

***以下の部分のように作っています。
※実際にはもう少ししっかりしているのですが、一部割愛してあります。

しかし、1~2百件処理したときにエラーが発生します。(※それまでの分はちゃんと更新されています。)

UPDATE文が失敗するのはいいのですが、トランザクション中でオブジェクトが存在しませんというのがわかりません。
中途半端にUPDATEされている部分があるので、しっかりロールバックしてほしいと思っています。

どうやら、スレッド毎にORASESSIONが確立できていないようで、他のセッションのコミットやロールバックが邪魔しているようです。
間違っている個所のご指摘・修正例をいただけると助かります。
よろしくお願いします。

***************

Imports System
Imports System.Threading

Public Class Form1

Dim ARRAY1 As New ArrayList
'ARRAY1には1000件近いデータが配列で入っている。

Dim OraSession As Object
Dim OraDatabase As Object
Dim OraDynaset As Object

'開始部分
Private Sub Main()

    Dim threadA As New Thread( _
        New ThreadStart(AddressOf ThreadMethod))
    Dim threadB As New Thread( _
        New ThreadStart(AddressOf ThreadMethod))
    Dim threadC As New Thread( _
        New ThreadStart(AddressOf ThreadMethod))

    threadA.Start()

End Sub

'オラクルDBに接続する部分
Private Sub ORACLESESSION()

    OraSession = CreateObject("OracleInProcServer.XOraSession")
    OraDatabase = OraSession.OpenDatabase("TNS", "USER/PASS", 0)

End Sub

'マルチスレッドの基礎部分
Private Sub ThreadMethod()

    ORACLESESSION()

    For i As Integer = 0 To 99

        EXEORACLE()

    Next i
End Sub

'データのUPDATEを行います。
    Private Sub EXEORACLE()

    Dim FACTOR1 As String
    Dim strSQL As String

    SyncLock ARRAY1.SyncRoot

        FACTOR1 = ARRAY1(0)
        ARRAY1(0).RemoveAt(0)

    End SyncLock

    Try
        OraSession.BeginTrans()

        strSQL = "UPDATE HINMST SET ENDFLG = 1 WHERE MAKERCODE = '" & FACTOR1 & "'"

        OraDatabase.ExecuteSQL(strSQL) 'まず、ここでエラーが発生する。(SQL実行エラー?)

    Catch

        OraSession.Rollback() 'そのあと、ここでエラーが発生する(※「ComErrorExceptionがハンドルされませんでした。」「ロールバックするオブジェクトが存在しません。」というエラー)

        Exit Sub
    End Try

    OraSession.CommitTrans()

End Sub

End Class

VB.NETのマルチスレッドでORACLEDBにUPDATEを並列的にするアプリケーションを作っています。
 配列の一番前から順に取り出し、次々UPDATE処理を何百件と行うものです。
 
私の知識不足もあって、正直原因がわかりません 

***以下の部分のように作っています。
※実際にはもう少ししっかりしているのですが、一部割愛してあります。
 
しかし、1~2百件処理したときにエラーが発生します。(※それまでの分はちゃんと更新されています。)
 
UPDATE文が失敗するのはいいのですが、トランザクション中でオブジェクトが存在しませんというのがわかりません。
 中途半端にUPDATEされている部分があるので、しっかりロールバックしてほしいと思っています。
 
どうやら、スレッド毎にORASESSIONが確立できていないようで、他のセッションのコミットやロールバックが邪魔しているようです。
間違っている個所のご指摘・修正例をいただけると助かります。
 よろしくお願いします。

***************

Imports System
Imports System.Threading

Public Class Form1

    Dim ARRAY1 As New ArrayList
    'ARRAY1には1000件近いデータが配列で入っている。

    Dim OraSession As Object
    Dim OraDatabase As Object
    Dim OraDynaset As Object

    '開始部分
    Private Sub Main()

        Dim threadA As New Thread( _
            New ThreadStart(AddressOf ThreadMethod))
        Dim threadB As New Thread( _
            New ThreadStart(AddressOf ThreadMethod))
        Dim threadC As New Thread( _
            New ThreadStart(AddressOf ThreadMethod))

        threadA.Start()

    End Sub

    'オラクルDBに接続する部分
    Private Sub ORACLESESSION()

        OraSession = CreateObject("OracleInProcServer.XOraSession")
        OraDatabase = OraSession.OpenDatabase("TNS", "USER/PASS", 0)

    End Sub

    'マルチスレッドの基礎部分
    Private Sub ThreadMethod()

        ORACLESESSION()

        For i As Integer = 0 To 99

            EXEORACLE()

        Next i
    End Sub

    'データのUPDATEを行います。
        Private Sub EXEORACLE()

        Dim FACTOR1 As String
        Dim strSQL As String

        SyncLock ARRAY1.SyncRoot

            FACTOR1 = ARRAY1(0)
            ARRAY1(0).RemoveAt(0)

        End SyncLock

        Try
            OraSession.BeginTrans()

            strSQL = "UPDATE HINMST SET ENDFLG = 1 WHERE MAKERCODE = '" & FACTOR1 & "'"

            OraDatabase.ExecuteSQL(strSQL) 'まず、ここでエラーが発生する。(SQL実行エラー?)

        Catch

            OraSession.Rollback() 'そのあと、ここでエラーが発生する(※「ComErrorExceptionがハンドルされませんでした。」「ロールバックするオブジェクトが存在しません。」というエラー)

            Exit Sub
        End Try

        OraSession.CommitTrans()

    End Sub

End Class