2015-12-02 3 views
1

Я хочу создать пул соединений для своей базы данных h2. Но я думаю, что мой пул открывает новое соединение каждый раз, когда я звоню getConnection(). Я думаю, там должно быть фиксированное количество многоразовых соединений, но если я запускаю этот код:H2 connection pool

Connection conn = DataSource.getInstance().getConnection(); 
     Statement stmt = conn.createStatement(); 
     ResultSet rs; 
     rs = stmt.executeQuery("SELECT * FROM NODE_USERS;"); 
     while (rs.next()) { 
      System.out.println(rs.getString("login")); 
     } 
     try { 
      // wait a bit 
      Thread.sleep(20000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     stmt.close(); 
     rs.close(); 
     conn.close(); 

DataSource:

public class DataSource { 

    private static volatile DataSource datasource; 
    private BasicDataSource ds; 

    private DataSource() throws IOException, SQLException, PropertyVetoException { 
     ds = new BasicDataSource(); 
     ds.setUsername("sa"); 
     ds.setPassword("sa"); 
     ds.setUrl("jdbc:h2:tcp://localhost/~/test");  
     ds.setMinIdle(5); 
     ds.setMaxActive(10); 
     ds.setMaxIdle(20); 
     ds.setMaxOpenPreparedStatements(180); 

    } 

    public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException { 
     if (datasource == null) { 
      synchronized (DataSource.class) { 
       if (datasource == null) { 
        datasource = new DataSource(); 
       } 
      } 
      datasource = new DataSource(); 
     } 
     return datasource; 
    } 

    public Connection getConnection() throws SQLException { 
     return this.ds.getConnection(); 
    } 

} 

, а затем выполнить select * from information_schema.sessions;, будет два ряда. Что не так? Также я пытался H2 tutorial example, но у меня тот же результат.

ответ

2

Вы используете пул соединений, а именно BasicDataSource. Сначала он создаст настроенное количество подключений, а затем, когда вызывается getConnection(), он либо повторно использует свободное объединение или создает новый, до установленного предела (или без ограничения, если он настроен так). Когда полученное соединение «закрыто» с использованием Connection.close(), оно фактически возвращается в пул, а не сразу закрывается.

В основном вы не контролируете, сколько открытых соединений будет в данный момент времени, кроме настройки минимальных и максимально разрешенных открытых соединений. Таким образом, вы наблюдаете за двумя открытыми связями, поэтому ничего не доказывает. Если вы хотите узнать, существует ли ограничение на открытые соединения, настройте BasicDataSource для использования не более 2 подключений с помощью BasicDataSource.maxActive(), а затем попытайтесь получить три соединения одновременно. И для другого теста, с той же конфигурацией, попробуйте получить два соединения, возвратив их с помощью Connection.close(), а затем получив еще два соединения.

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