Как точно JdbcTemplate с TransactionManager сотрудничает?

Насколько я понял, что DataSourceTransactionManager связывает соединение JDBC от указанного DataSource до текущего потока, допуская одно ограниченное потоком Соединение на DataSource. Если это будет пул соединений, то это возьмет одно из доступных соединений.

После этого, если я использую JdbcTemplate в транзакции, он получит соединение, связанное DataSourceTransactionManager. Я понимаю механизм правильно? Туда любой требования для того, чтобы сделать бобовое определение менеджера транзакций (т.е. одиночный элемент)?

6
задан Alexey Kalmykov 12 February 2010 в 09:27
поделиться

1 ответ

Не знаю, очень ли это пифонично, но я бы сделал это в этом пути:

def is_sublist(a, b):
    if not a: return True
    if not b: return False
    return b[:len(a)] == a or is_sublist(a, b[1:])

Более короткое решение предлагается в этом обсуждении , но оно страдает от тех же проблем, что и решения с set - оно не рассматривает порядок элементов.

ОБНОВЛЕНИЕ:
Вдохновленный MAK я представил более лаконичную и четкую версию своего кода.

ОБНОВЛЕНИЕ: Существует проблема с производительностью этого метода из-за копирования списка в срезах. Кроме того, поскольку рекурсивность является рекурсивной, можно столкнуться с ограничением рекурсии для длинных списков. Для исключения копирования можно использовать фрагменты Numpy , которые создают ракурсы, а не копии . При возникновении проблем с производительностью или ограничением рекурсии следует использовать решение без рекурсии.

-121--1665241-

xwininfo и xprop позволяет получить то, что вы хотите, но это немного сложно.

xwininfo позволяет получить все известные окна, а xprop запросить X об идентификаторе одного окна для параметра _NET_WM_PID.

До сих пор хакерским способом было бы:

#!/bin/sh

findpid=$1

known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')

for id in ${known_windows}
do
    xp=$(xprop -id $id _NET_WM_PID)
    if test $? -eq 0; then
        pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')

        if test "x${pid}" = x${findpid}
        then
            echo "Windows Id: $id"
        fi
    fi
done

Результат:

mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e

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

Может быть, вы должны получить эти инструменты источники, чтобы сделать то, что вы хотите.

-121--1279054-

Вы довольно подробно описали, как это работает. Логика синхронизации транзакций Spring несет довольно страшную ответственность за поддержание синхронизации транзакций между JDBC, Hibernate, JPA и т.д., и конечный результат довольно бесшовен.

Менеджеры транзакций должны быть одиночными, да. Любая транзакция управляется только одним менеджером по транзакциям, и если несколько из них лежат вокруг, вы находитесь в мире боли.

3
ответ дан 17 December 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: