2012-01-21 3 views
3

При использовании пула соединений Oracle JDBC существует ли способ управления раздачей соединений? В частности, есть ли способ указать использование стратегии LIFO? Кажется, что соединения можно раздавать круговым способом.Стратегия распределения доступа к пулу Oracle JDBC?

В этом сценарии:

  • макс соединения в пуле используются (10)
  • после этого, только один параллельное соединения постоянно используются, каждые 5 сек извлекаются и возвращается
  • неактивность устанавливаются в 60 сек.

Если используется стратегия раундного вращения, каждое из 10 объединенных соединений будет использоваться в течение 60 секунд. Когда происходит проверка таймаута бездействия, каждое соединение будет активным в течение последней минуты, поэтому никакое соединение не будет кандидатом для закрытия. Пул соединений останется с 10 соединениями, хотя на самом деле требуется только 1. По крайней мере, это то, что я, кажется, испытываю. Я бы хотел, чтобы пул сократился до 1 соединения.

Является ли мое понимание того, как драйвер работает правильно? Есть ли способ контролировать стратегию распределения соединений из пула (LIFO, FIFO, round robin) или мне придется использовать другие механизмы объединения?

Ниже приведен тест (с использованием устаревшей апис). В этом случае, были созданы 3 соединения, и это только сжиматься до 2, а не 1.

EDIT более точно отражать выше описание:

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import oracle.jdbc.pool.OracleDataSource; 


public class Main { 

    public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException, SQLException { 

     String url = "jdbc:oracle:thin:@//host:1521/SID"; 
     String user = "user"; 
     String pwd = "pwd"; 

     OracleDataSource ocpds; 

     ArrayList<Connection> tempConnList = new ArrayList<>(); 


     try { 

      ocpds = new OracleDataSource(); 
      ocpds.setURL(url); 
      ocpds.setUser(user); 
      ocpds.setPassword(pwd); 

      java.util.Properties prop = new java.util.Properties(); 
      prop.setProperty("MinLimit", "1"); 
      prop.setProperty("MaxLimit", "10"); 

      prop.setProperty("InactivityTimeout", "60"); // seconds 
      prop.setProperty("AbandonedConnectionTimeout", "60"); // seconds 
      prop.setProperty("PropertyCheckInterval", "60"); // seconds    

      // set DataSource properties 
      ocpds.setConnectionCachingEnabled(true); 
      ocpds.setConnectionCacheProperties(prop); 
      ocpds.setConnectionCacheName("TestCache"); 


      // Ramp up to max 
      for (int i=0; i<10; i++) { 
       Connection conn = ocpds.getConnection(); 
       tempConnList.add(conn); 
      } 

      // Release them all 
      for (Connection conn : tempConnList) { 
       conn.close(); 
      } 


      // Grab and release one connection at a time 
      for (int i = 0; i < 60; i++) { 

       System.out.println(new java.util.Date()); 

       // Grab and release 
       Connection conn = ocpds.getConnection(); 
       conn.close(); 

       try { 
        Thread.currentThread().sleep(5000); 
       } catch (InterruptedException ie) { 
        System.err.println("error message: " + ie.getMessage()); 
       } 

      } 

     } catch (SQLException e) { 
      System.err.println("error message: " + e.getMessage()); 
     } finally { 
      for (Connection conn : tempConnList) { 
       if (conn != null) { try { conn.close(); } catch (SQLException ignored) {}; } 
      } 
     } 
    } 

} 

ответ

2

поддержка Oracle ответил, что метод межлабораторных используется для обратной связи с пулом. В Oracle JDBC 12 (текущая версия 11.2.0.3), будет собственностью, «UseLIFO», что позволит «последнему в первом вышел» поиск:

prop.setProperty("UseLIFO", "true"); 

В примере, публикуемом в этом вопросе, это позволит простоям сократить время пула до одного соединения.

+0

Начиная с 11 г Oracle устарел OracleImplicitConnectionCache, который предоставляет свойство UseLIFO. Oracle говорит, что вместо этого используется [UniversalConnectionPool] (http://docs.oracle.com/cd/E18283_01/java.112/e12265/connect.htm). ASPP нуждается в источнике данных; где это свойство не поддерживается. Итак, переместившись на 11g или 12c драйвер, используя UCP, можно ли использовать это поведение? –

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