Как обойти соединение JDBC без использования Spring / JPA / Hibernate - PullRequest
6 голосов
/ 09 декабря 2010

У нас есть приложение Java J2EE, которое использовало отдельные вызовы веб-службы для каждой вставки / обновления строки базы данных. Это оказалось слишком медленно. Они привели меня, чтобы «быстро» это исправить. Я планирую преобразовать все вызовы веб-службы в простой JDBC. Для этого мне нужно получить соединение JDBC из пула, а затем использовать его несколькими различными способами. Мне нужно использовать одно и то же соединение JDBC в нескольких DAO, чтобы объединить все это в одну транзакцию базы данных. Я могу явно передать соединение JDBC каждому DAO, который в этом нуждается, но для этого потребуется изменить МНОГО сигнатур методов, а также МНОГО модульных тестов (что противоречит «быстрой» части).

Я пытаюсь найти хороший способ поместить соединение JDBC куда-нибудь, а затем просто взять его в нужных ему методах без необходимости явно передавать его повсюду. Мы не можем использовать Spring, JPA или Hibernate в этом проекте, потому что команда поддержки не будет поддерживать эти технологии. Я могу поместить соединение JDBC в EJB, но я не уверен, насколько надежным это будет. Я мог бы создать собственный Singleton для управления соединениями с базой данных для каждого пользователя (сеанс?), Но я должен был бы быть осторожным с безопасностью потоков. Если кто-то пытался сделать что-то подобное раньше, я был бы признателен за несколько советов.

Ответы [ 4 ]

2 голосов
/ 09 декабря 2010

Вы можете использовать ThreadLocal. Настройте точку входа, а затем DAO

class ConnectionUtil {
    public static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>();
}

public Return method(Args arg) {
    ConnectionUtil.connection.set(newConnection());
    try {
        ...
    } finally {
        ConnectionUtil.connection.remove();
    }
}

Довольно уродливо, но, похоже, этого хочет ваш босс.

2 голосов
/ 09 декабря 2010

Использование Apache Commons DBCP .Это проект пула подключений от Apache и то, что используется внутри многих движков.

1 голос
/ 09 декабря 2010

Мы делали это раньше (5 лет назад или около того в IBM WebSphere).Мы написали собственный пул и сохранили jdbc-соединения в хеш-таблице с sessionID.Единственная ловушка заключалась в том, чтобы закрыть соединение на sessionend и вернуть его в пул (мы сделали это с помощью sessionlistener)Если один пользовательский сеанс подключается только к одному jdbc-соединению, безопасность потока наследуется.Таким образом, синглтонный подход определенно работает.Наш прирост производительности был ужасным.

0 голосов
/ 09 декабря 2010

Кроме того, что я сделал для DAO, это не передача соединения в сигнатуре метода, а в конструкторе.Затем я удерживаю объект, который изначально создает соединение, ответственный за его закрытие.

...