Java: удаление оператора 'print' вызывает исключение тайм-аута при запросе соединения (й) из DataSource? - PullRequest
0 голосов
/ 06 февраля 2012

Может кто-нибудь посоветовать следующую общую проблему Java

Вот некоторый псевдокод (исключение обработки исключений и т. Д.) Для обозначения возникшей у меня проблемы:

public void initializeConnection(DataSource dataSource) {

    // Declare collection to hold all connections
    Collection<Connection> pool = new ArrayList<Connection>();

    // Loop through all connections
    int i = 0;
    while(i <= dataSource.getMaxActive()){
       Connection conn = dataSource.getConnection();
       // do something with connection, then add it to a collection
       pool.add(conn)

       i++;
       // REMOVE THIS PRINT OUT AND CODE THROWS GETCONNECTION TIMEOUT EXCEPTION
       System.out.println( i );

    }

    // Traverse through the collection and close all connections
}

Код довольно прост:

  1. Перебрать все соединения в источнике данных
  2. Делать что-то с каждым соединением (более конкретно, использовать его для вызова хранимой процедуры, чтобы инициализировать состояние базы данных для соединения)
  3. Сохраните соединения в коллекции, чтобы затем их можно было закрыть (если соединение будет закрыто немедленно, это прекратит нам цикл всех соединений).

Приведенный выше код работает нормально,Проблема заключается в следующем: при удалении оператора печати выдается исключение тайм-аута, так как в течение 30 секунд не может быть найдено новое соединение.Так что, похоже, возникает какая-то проблема с потоками или временем - очевидно, что-то сломано, и это работает только из-за задержки, которая происходит из-за оператора print.

У кого-нибудь есть идеи, почему это происходит?

Спасибо!

1 Ответ

1 голос
/ 06 февраля 2012

Если вы вызываете dataSource.getConnection() из одного и того же потока несколько раз, вы обычно получаете одно и то же соединение каждый раз, потому что оно связано с потоком через ThreadLocal реализацией DataSource, и оно заметит, что вы уже получили подключение. Поэтому я сомневаюсь, что этот код на самом деле делает то, что вы хотите.

Если это не так, то код по крайней мере выполнит блок maxActive + 1 раз, что слишком часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...