/* * Seldon -- open source prediction engine * ======================================= * * Copyright 2011-2015 Seldon Technologies Ltd and Rummble Ltd (http://www.seldon.io/) * * ******************************************************************************************** * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ******************************************************************************************** */ package io.seldon.db.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @Component public class JDBCConnectionFactory { private static Logger logger = Logger.getLogger( JDBCConnectionFactory.class.getName() ); private static JDBCConnectionFactory factory; private Map<String,DataSource> dataSources = new ConcurrentHashMap<>(); private Map<String,String> clientToCatalog = new ConcurrentHashMap<>(); private InitialContext ctx; public JDBCConnectionFactory(){ try { ctx = new InitialContext(); } catch (NamingException e) { ctx = null; logger.error("Couldn't start JDNI context",e); } factory = this; } // public static JDBCConnectionFactory initialise( Map<String,String> jndiKeys,Map<String,String> clientToCatalog) throws NamingException // { // if (factory == null) // factory = new JDBCConnectionFactory(); // // for(Map.Entry<String, String> jndiKey : jndiKeys.entrySet()) // factory.addDataSource(ctx, jndiKey.getKey(), jndiKey.getValue(),clientToCatalog.get(jndiKey.getKey())); // // return factory; // } public static JDBCConnectionFactory get() { return factory; } public void addDataSource(String key,String jndi,String dbName) throws NamingException { DataSource ds = (DataSource)ctx.lookup(jndi); addDataSource(key, ds, dbName); } public void addDataSource(String key,DataSource ds,String dbName) { dataSources.put(key, ds); if (dbName != null) clientToCatalog.put(key, dbName); else clientToCatalog.put(key, key); } public Connection getConnection(String client) throws SQLException { return getConnection(client,false); } public Connection getConnection(String client,boolean readonly) throws SQLException { DataSource ds = dataSources.get(client); Connection c = null; if (ds != null) { c = ds.getConnection(); if (readonly) c.setReadOnly(true); else c.setReadOnly(false); c.setCatalog(clientToCatalog.get(client)); } else { // logger.error("Can't get connection for client "+client); final String message = "Can't get connection for client " + client; logger.error(message, new Exception(message)); } return c; } }