После некоторого времени срыва мозга я разобрался со своими собственными ошибками ... Я хочу применить это новое знание, так что ... вот и я
Я сделал очень большую ошибку , объявив объект Connection в качестве статического объекта в моем коде ... так что, очевидно, несмотря на то, что я создал новое Connection для каждого нового объекта данных, который я создал, каждая транзакция прошла через одно статическое соединение.
После исправления этой первой проблемы я вернулся к таблице параметров и понял, что мой процесс:
- Чтение идентификатора из входной таблицы
- Взять блок данных, относящихся к идентификатору, считанному на шаге 1, сохраненный в других таблицах ввода
- Числа хруста: прочитать соответствующие входные таблицы и обработать данные, хранящиеся в них
- Сохранить результаты в одной или нескольких выходных таблицах
- Повторите процесс, пока у меня есть ожидающие идентификаторы во входной таблице
Благодаря использованию выделенного соединения для чтения входных данных и выделенного соединения для записи выходных данных производительность моей программы увеличилась ... но мне нужно было намного больше!
Мой первоначальный подход к шагам 3 и 4 заключался в том, чтобы сохранить в выводе каждый из результатов, как только я их получил ... Но я нашел лучший подход:
- Считать входные данные
- Сократить числа и поместить результаты в кучу очередей (по одной для каждой выходной таблицы)
- Отдельный поток проверяет каждую секунду, есть ли данные в какой-либо из очередей. Если в очереди есть данные, запишите их в таблицы.
Итак, разделив задачи ввода и вывода, используя разные соединения, и перенаправив выходные данные основного процесса в очередь, и используя выделенный поток для задач хранения вывода, я наконец достиг того, чего хотел: многопоточное выполнение DML!
Я знаю, что есть более подходящие подходы к этой конкретной проблеме, но этот работает вполне нормально.
Так что ... если кто-то застрянет с такой проблемой ... Надеюсь, это поможет.