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);
}
}
}
|