2012-04-01 2 views
0

я использую пулы соединения в Tomcat 6 и я configued этот путь внутри context.xml файлаПочему подключение к базе данных закрывается после каждой операции

<Resource name="jdbc/myoracle" auth="Container" 
       type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
       url="jdbc:oracle:thin:@127.0.0.1:1521:ORCLE" 
       username="scott" password="tiger" maxActive="20" maxIdle="10" 
       maxWait="-1"/> 

И это мой завод класс, чтобы получить соединение с помощью DataSource

public class ConnPoolFactory { 
    private static DataSource dataSource; 
    private static Connection connection; 

    private ConnPoolFactory() { 
    } 

    public static synchronized Connection getConnection() throws SQLException { 

     try { 

      if (connection == null) { 
       Context initContext = new InitialContext(); 
       Context envContext = (Context) initContext 
         .lookup("java:/comp/env"); 
       dataSource = (DataSource) envContext.lookup("jdbc/myoracle"); 
       connection = dataSource.getConnection(); 
      } else { 
       return connection; 
      } 

     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

     return connection; 

    } 
} 

И от моего сервлета внутри наконец блока, я закрываю это так

try { 

connection = ConnPoolFactory.getConnection(); 
finally 

{ 

if(conn!=null) 
con.close(); 
} 

В моем пользовательском интерфейсе я могу дать разные команды (нажмите кнопку), например Insert, Update, Delete, Select -.

Проблема, с которой я сталкиваюсь, заключается в том, что приложение запускается только для одной команды, то есть, если я нажал кнопку «Вставить», она вставляет запись отлично, а после этого, если еще раз я даю любую команду, Исключение на консоли сервера, говорящее, что соединение закрыто.

Если я удалить, что, наконец, блок кода внутри моего сервлета, то приложение работает нормально для любого числа команд

Может кто-нибудь пожалуйста, дайте мне знать, что случилось с этим finnaly блок ??

+2

Вам интересно, почему соединение закрыто после того, как вы вызвали его? – Mat

ответ

1

Переменная Connection в ConnPoolFactory должна быть локальной, а не статической. Переменная, которую вы должны тестировать для null, не равна connection, но dataSource. После того как вы получили ненулевое значение этого, вы затем возвращаете dataSource.getConnection(). Затем вызывающий абонент должен закрыть это соединение, когда он закончит с ним.

0

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

Необходимо, чтобы ваш сервлет возвращал соединение после использования или фабрика создавала новое соединение каждый раз.

Edit: пытаясь быть более явным:

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

Кстати, вы можете столкнуться с еще одной неприятной ошибкой, если вы не закрываете свое соединение: вы будете делиться соединением между потоками сервлета, если одновременно выполняются два запроса, которые могут или не могут работать в зависимости от выполняемых вами операций БД.

+0

Я не вижу ничего в коде. Наверное, я прав с моим заявлением. – Pawan

+0

Попробуйте в модульном тесте: Соединение c = ConnPoolFactory.getConnection(); c.close(); c = ConnPoolFactory.getConnection(); // использовать соединение – ptyx

 Смежные вопросы

  • Нет связанных вопросов^_^