![JAR search and dependency download from the Maven repository](/logo.png)
com.tsc9526.monalisa.orm.datasource.DataSourceManager Maven / Gradle / Ivy
/*******************************************************************************************
* Copyright (c) 2016, zzg.zhou([email protected])
*
* Monalisa is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*******************************************************************************************/
package com.tsc9526.monalisa.orm.datasource;
import java.lang.reflect.Method;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.sql.DataSource;
import com.tsc9526.monalisa.orm.annotation.DB;
import com.tsc9526.monalisa.orm.dialect.Dialect;
import com.tsc9526.monalisa.orm.dialect.MysqlDialect;
import com.tsc9526.monalisa.tools.Tasks;
import com.tsc9526.monalisa.tools.clazz.MelpClass;
import com.tsc9526.monalisa.tools.logger.Logger;
/**
*
* @author zzg.zhou([email protected])
*/
public class DataSourceManager {
static Logger logger=Logger.getLogger(DataSourceManager.class);
private static DataSourceManager dm=new DataSourceManager();
public static DataSourceManager getInstance(){
return dm;
}
/**
* close data source, daemon thread ...
*/
public static void shutdown(){
Tasks.instance.destory();
}
private Map dss=new ConcurrentHashMap();
private Map dialects=new ConcurrentHashMap();
private DataSourceManager(){
Tasks.instance.addShutdown(new Runnable() {
public void run(){
Set jdbsURLs=new LinkedHashSet();
jdbsURLs.add("jdbc:relique:csv:monalisa-memory");
for(DBConfig cfg:dss.values()){
String url=cfg.getCfg().getUrl();
jdbsURLs.add(url);
cfg.close();
}
for(String url:jdbsURLs){
try{
DriverManager.deregisterDriver(DriverManager.getDriver(url));
}catch(SQLException e){}
}
shutdownMysqlThreads();
}
});
registerDialect(new MysqlDialect());
}
private void shutdownMysqlThreads(){
try {
Class> cls=MelpClass.forName("com.mysql.jdbc.AbandonedConnectionCleanupThread");
Method mth=(cls==null ? null : cls.getMethod("shutdown"));
if(mth!=null) {
mth.invoke(null);
}
}catch(ClassNotFoundException e){
//Do nothing
}catch (Throwable t) {
logger.error(""+t,t);
}
}
@SuppressWarnings("unchecked")
public void registerDialect(String dialectClass)throws Exception{
Class cd=(Class)MelpClass.forName(dialectClass);
registerDialect(cd.newInstance());
}
public void registerDialect(Dialect dialect){
dialects.put(dialect.getUrlPrefix(), dialect);
}
public void unregisterDialect(Dialect dialect){
dialects.remove(dialect.getUrlPrefix());
}
public DBConfig getDBConfig(Class> clazzWithDBAnnotation) {
DB db=clazzWithDBAnnotation.getAnnotation(DB.class);
if(db==null){
db=MelpClass.findAnnotation(clazzWithDBAnnotation, DB.class);
}
if(db==null){
throw new RuntimeException("Class without @DB: "+clazzWithDBAnnotation);
}
String dbKey=db.key();
if(dbKey==null || dbKey.length()<1){
dbKey=clazzWithDBAnnotation.getName();
}
return getDBConfig(dbKey,db,clazzWithDBAnnotation);
}
public DBConfig getDBConfig(String dbKey,DB db,boolean reInit) {
DBConfig cfg=dss.get(dbKey);
if(cfg==null){
cfg=getDBConfig(dbKey,db);
}else if(reInit){
cfg.init(db);
}
return cfg;
}
public DBConfig getDBConfig(String dbKey,DB db,String cfgBasePath) {
DBConfig cfg=dss.get(dbKey);
if(cfg==null){
cfg=getDBConfig(dbKey,db,(Class>)null);
}
cfg._cfg.cfgBasePath=cfgBasePath;
return cfg;
}
public DBConfig getDBConfig(String dbKey,DB db){
return getDBConfig(dbKey,db,(Class>)null);
}
public synchronized DBConfig getDBConfig(String dbKey,DB db,Class> clazzWithDBAnnotation){
DBConfig cfg=dss.get(dbKey);
if(cfg==null && db!=null){
cfg=new DBConfig(dbKey,db,clazzWithDBAnnotation);
putDBConfig(dbKey, cfg);
}
return cfg;
}
public DBConfig findDbConfig(String dbKey){
return dss.get(dbKey);
}
void putDBConfig(String dbKey,DBConfig cfg){
dss.put(dbKey, cfg);
}
public DataSource getDataSource(DBConfig db){
if(db==null){
throw new RuntimeException("DB cannot be null");
}
return db.getDataSource();
}
public Dialect getDialect(DBConfig db){
if(db==null){
return null;
}
String jdbcUrl=db.getCfg().getUrl();
return getDialect(jdbcUrl);
}
public Dialect getDialect(String jdbcUrl){
if(jdbcUrl==null){
return null;
}
for(String key:dialects.keySet()){
if(jdbcUrl.startsWith(key)){
return dialects.get(key);
}
}
throw new RuntimeException("JDBC-URL: "+jdbcUrl+", dialect not found in: "+dialects.keySet()+", use registerDialect() first!");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy