Обнаружьте, кто создал поток (w. Eclipse)

Проблема с этим состоит в том, что, когда механизм SQL идет для оценки выражения, он проверяет ОТ части для получения по запросу надлежащих таблиц, и затем, ГДЕ часть для обеспечения некоторых основных критериев, таким образом, он не может правильно оценить динамическое условие на который столбец проверить по.

можно использовать оператор Where, когда Вы проверяете, КУДА критерии в предикате, такой как

WHERE account_location = CASE @locationType
                              WHEN 'business' THEN 45
                              WHEN 'area' THEN 52
                         END

так в Вашем особом случае, Вы собираетесь должны поместить запрос в хранимую процедуру или создать три отдельных запроса.

22
задан jschmier 11 March 2011 в 19:09
поделиться

4 ответа

Я неукоснительно называю свои потоки (например, используя Thread (Runnable, String) ), в противном случае они получают общее и несколько бесполезное имя. Сброс потоков выделит то, что запущено, и (следовательно) что их создало. Я ценю, что это не решает проблему создания сторонних потоков.

РЕДАКТИРОВАТЬ: В информационном бюллетене JavaSpecialist недавно (февраль 2015 г.) эта проблема была решена с помощью диспетчера безопасности. См. здесь для получения дополнительных сведений.

БОЛЬШЕ: Пара подробностей по использованию техники JavaSpecialist: API SecurityManager включает "checkAccess (newThreadBeingCreated)", который вызывается в потоке создателя потока. У нового потока уже инициализировано «имя». Таким образом, в этом методе у вас есть доступ как к потоку создателя потока, так и к новому, и вы можете регистрировать / печатать и т. Д. Когда я попробовал это, отслеживаемый код начал выдавать исключения защиты доступа; Я исправил это, вызвав его в AccessController.doPriviledged (new PrivilegedAction () {...}, где метод run () вызывал отслеживаемый код.

10
ответ дан 29 November 2019 в 05:31
поделиться

Хорошо, я смог решить (своего рода) проблему самостоятельно: я установил точку останова в

Thread.start() 

и вручную прошел через каждый вызов. Таким образом, я довольно быстро обнаружил, что Class.forName () инициализировал много статического кода, который в свою очередь создал эти загадочные потоки.

Хотя мне удалось решить свою проблему, я все еще думаю, что более общая задача все еще не решена.

14
ответ дан 29 November 2019 в 05:31
поделиться

К сожалению, нет. В Eclipse я вижу все блокирующие потоки, но их трассировки стека отражают только их внутреннее состояние и (по-видимому) не раскрывают никакой информации о местоположении их создания. Кроме того, заглянув внутрь объекта (используя представление переменных), я не смог получить никаких дополнительных подсказок.

0
ответ дан 29 November 2019 в 05:31
поделиться

При отладке приложения Eclipse вы можете остановить все потоки, щелкнув org.eclipse.equinox.launcher.Main в представлении отладки.

Затем оттуда для каждого потока вы можете увидеть трассировку стека и перейти к методу thred run.

Иногда это может помочь, а иногда нет. .

Как сказал Брайан, называть потоки - это хорошая практика, потому что это единственный способ легко определить, «кто их создал»

1
ответ дан 29 November 2019 в 05:31
поделиться