Skip to main content
summaryrefslogtreecommitdiffstats
blob: 50ee2ff9cf71628876650485f5abfb8c221ed62d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*******************************************************************************
 * Copyright (c) 2013 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.jdbc.internal;

import static org.eclipse.osee.jdbc.JdbcException.newJdbcException;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import javax.sql.DataSource;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.pool.ObjectPool;
import org.eclipse.osee.framework.jdk.core.type.LazyObject;
import org.eclipse.osee.jdbc.JdbcPoolConfig;

/**
 * @author Roberto E. Escobar
 */
public class PoolFactory {

   private final PoolingDriverRef poolingDriver = new PoolingDriverRef();
   private final JdbcConnectionFactoryManager manager;
   private final JdbcPoolConfig poolConfiguration;

   public PoolFactory(JdbcConnectionFactoryManager manager, JdbcPoolConfig poolConfiguration) {
      this.manager = manager;
      this.poolConfiguration = poolConfiguration;
   }

   public void disposePools(Iterable<String> keys) {
      PoolingDriver driver = poolingDriver.get();
      for (String key : keys) {
         try {
            driver.closePool(key);
         } catch (SQLException ex) {
            // Do Nothing
         }
      }
      poolingDriver.invalidate();
   }

   public Map<String, String> getPoolStats() {
      Map<String, String> stats = new LinkedHashMap<>();

      PoolingDriver driver = poolingDriver.get();

      stats.put("db.pool.driver", poolConfiguration.getPoolConnectionDriver());

      String poolVersion = String.format("%s.%s", driver.getMajorVersion(), driver.getMinorVersion());
      stats.put("db.pool.version", poolVersion);

      String[] names = driver.getPoolNames();
      int count = 0;
      for (String name : names) {

         try {
            ObjectPool<?> pool = driver.getConnectionPool(name);
            stats.put(String.format("db.pool.%s.id", count), name);
            stats.put(String.format("db.pool.%s.active", count), String.valueOf(pool.getNumActive()));
            stats.put(String.format("db.pool.%s.idle", count), String.valueOf(pool.getNumIdle()));
         } catch (SQLException ex) {
            // Do Nothing
         } finally {
            count++;
         }
      }
      return stats;
   }

   public Callable<DataSource> createDataSourceFetcher(JdbcConnectionInfo dbInfo) {
      return new PooledDataSourceFetcher(manager, poolingDriver, poolConfiguration, dbInfo);
   }

   private final class PoolingDriverRef extends LazyObject<PoolingDriver> {

      @Override
      protected final FutureTask<PoolingDriver> createLoaderTask() {
         Callable<PoolingDriver> callable = new Callable<PoolingDriver>() {
            @Override
            public PoolingDriver call() throws Exception {
               String connectionPoolDriver = poolConfiguration.getPoolConnectionDriver();
               String connectionPoolId = poolConfiguration.getPoolConnectionId();
               try {
                  Class.forName(connectionPoolDriver);
               } catch (Exception ex) {
                  throw newJdbcException(ex, "Error loading connection pool driver [%s]", connectionPoolDriver);
               }
               PoolingDriver driver;
               try {
                  driver = (PoolingDriver) DriverManager.getDriver(connectionPoolId);
               } catch (SQLException ex) {
                  throw newJdbcException(ex, "Error finding connection pool driver with id [%s]", connectionPoolId);
               }
               return driver;
            }
         };
         return new FutureTask<PoolingDriver>(callable);
      }
   }
}

Back to the top