package net.sinofool.dbpool.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DBConfig {
private static final Logger logger = LoggerFactory.getLogger(DBConfig.class);
private HashMap<String, DBInstance> instances = new HashMap<String, DBInstance>();
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
public DBServer getDBServer(String instance, int access, String pattern) {
DBInstance db;
rwLock.readLock().lock();
try {
db = instances.get(instance);
} finally {
rwLock.readLock().unlock();
}
if (db == null) {
logger.warn("DBServer " + instance + " is null!");
return null;
}
return db.getDBServer(access, pattern);
}
/**
*
* @param newConfig
* @return changed servers
*/
public List<DBServer> reloadConfig(final Map<String, net.sinofool.dbpool.idl.DBServer[]> newConfig) {
List<DBServer> changes = new ArrayList<DBServer>();
rwLock.writeLock().lock();
try {
HashMap<String, DBInstance> newInstances = new HashMap<String, DBInstance>();
for (Entry<String, net.sinofool.dbpool.idl.DBServer[]> entry : newConfig.entrySet()) {
DBInstance value = instances.containsKey(entry.getKey()) ? instances.get(entry.getKey())
: new DBInstance();
List<DBServer> change = value.reloadConfig(entry.getValue());
changes.addAll(change);
newInstances.put(entry.getKey(), value);
}
instances = newInstances;
return changes;
} finally {
rwLock.writeLock().unlock();
}
}
}