/**
* Copyright 2014 LinkedIn Corp. 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.
*/
package com.linkedin.proxy.pool;
import java.sql.DriverManager;
import java.util.Properties;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.log4j.Logger;
import com.linkedin.proxy.conn.MyConnection;
import com.linkedin.proxy.conn.MysqlConnection;
public class BlockingMysqlConnectionPool implements ConnectionPool
{
public static final String FLAG_PROXY_MYSQL_HOST = "mysql.host";
public static final String FLAG_PROXY_MYSQL_PORT = "mysql.port";
public static final String FLAG_PROXY_MYSQL_USERNAME = "mysql.userName";
public static final String FLAG_PROXY_MYSQL_USERPASS = "mysql.userPass";
public static final String FLAG_PROXY_MYSQL_CONN_POOL = "mysql.connPool";
private static final Logger m_log = Logger.getLogger(BlockingMysqlConnectionPool.class);
protected String m_connStr;
protected BlockingQueue<MyConnection> m_que;
@Override
public boolean init(Properties prop) throws Exception
{
//get mysql host name
String hostName;
String temp = prop.getProperty(FLAG_PROXY_MYSQL_HOST);
if(temp == null)
{
m_log.error("Mysql host name is missing");
return false;
}
else
{
hostName = temp;
m_log.debug("Mysql host name: " + hostName);
}
//get mysql host port
int hostPort;
temp = prop.getProperty(FLAG_PROXY_MYSQL_PORT);
if(temp == null)
{
m_log.error("Mysql host port is missing");
return false;
}
else
{
hostPort = Integer.parseInt(temp);
m_log.debug("Mysql host port: " + hostPort);
}
//get mysql user name
String userName;
temp = prop.getProperty(FLAG_PROXY_MYSQL_USERNAME);
if(temp == null)
{
m_log.error("Mysql user name is missing");
return false;
}
else
{
userName = temp;
m_log.debug("Mysql user name: " + userName);
}
//get mysql user pass
String userPass;
temp = prop.getProperty(FLAG_PROXY_MYSQL_USERPASS);
if(temp == null)
{
m_log.error("Mysql user pass is missing");
return false;
}
else
{
userPass = temp;
m_log.debug("Mysql user pass: " + userPass);
}
//get size of the connection pool
int connPool;
temp = prop.getProperty(FLAG_PROXY_MYSQL_CONN_POOL);
if(temp == null)
{
m_log.error("Connection pool size is missing");
return false;
}
else
{
connPool = Integer.parseInt(temp);
m_log.debug("Connection pool size: " + connPool);
}
m_connStr = "jdbc:mysql://" + hostName + ":" + hostPort + "/?useUnicode=true&characterEncoding=utf-8" + "&user=" + userName + "&password=" + userPass;
m_que = new LinkedBlockingQueue<MyConnection>(connPool);
try
{
for(int a = 0; a<connPool; a++)
{
MyConnection conn = new MysqlConnection(DriverManager.getConnection(m_connStr), "");
m_que.add(conn);
}
}
catch(Exception e)
{
m_log.fatal("Cannot create connection to Mysql Database", e);
return false;
}
return true;
}
public MyConnection getConnection(String dbName) throws Exception
{
MyConnection conn = m_que.take();
if(conn.isClosed())
{
m_log.debug(Thread.currentThread().getName() + ": Connection from pool is closed. Starting a new connection...");
conn = new MysqlConnection(DriverManager.getConnection(m_connStr), "");
}
return conn;
}
public void releaseConnection(MyConnection conn) throws Exception
{
m_que.put(conn);
}
public void closeAll() throws Exception
{
if(m_que != null)
{
while(!m_que.isEmpty())
{
MyConnection conn = m_que.take();
conn.closeConn();
}
}
}
}