JdbcConnectionPool.java
package eu.javaexperience.database;
import java.io.Closeable;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import eu.javaexperience.asserts.AssertArgument;
import eu.javaexperience.database.failsafe.JdbcFailSafeConnection;
import eu.javaexperience.io.IOTools;
import eu.javaexperience.log.JavaExperienceLoggingFacility;
import eu.javaexperience.log.LogLevel;
import eu.javaexperience.log.Loggable;
import eu.javaexperience.log.Logger;
import eu.javaexperience.log.LoggingTools;
public class JdbcConnectionPool implements ConnectionPool, Closeable
{
public static final Logger LOG = JavaExperienceLoggingFacility.getLogger(new Loggable("JdbcConnectionPool"));
protected ConnectionCreator cc;
//protected long timeoutMs = 5*60*1000;
//protected String statemenetForTimeoutCheck = "SELECT DATABASE();";
public JdbcConnectionPool(ConnectionCreator cc)
{
this.cc = cc;
}
public JdbcConnectionPool(ConnectionBuilder type,String host,int port,String user, String passwd, String db)
{
cc = ConnectionCreator.fromConnectionBuilder(type, host, port, user, passwd, db);
}
public JdbcConnectionPool(ConnectionBuilder type,String user, String passwd, String db)
{
this(type,null,-1,user,passwd,db);
}
public JdbcConnectionPool(ConnectionBuilder type,String host,String user, String passwd, String db)
{
this(type,host,-1,user,passwd,db);
AssertArgument.assertNotNull(host, "host");
}
private final ArrayList<ConnectionData> pool = new ArrayList<>();
public synchronized JdbcIssuedConnection getConnection() throws SQLException
{
for(ConnectionData d:pool)
{
if(d.check())
{
LoggingTools.tryLogFormat(LOG, LogLevel.DEBUG, "Issue existing connection: %s", d.conn);
return new JdbcIssuedConnection(d);
}
}
///vagy új kapcsolat
ConnectionData ret = new ConnectionData(openNewConnection());
pool.add(ret);
LoggingTools.tryLogFormat(LOG, LogLevel.DEBUG, "Issue new connection: %s", ret.conn);
return new JdbcIssuedConnection(ret);
}
public class ConnectionData
{
public ConnectionData(Connection conn)
{
this.conn = conn;
}
boolean check() throws SQLException
{
return free;
}
boolean free = true;
Connection conn;
long lastGet = System.currentTimeMillis();
public boolean isFree()
{
return free;
}
public long getLastGet()
{
return lastGet;
}
}
protected Connection openNewConnection() throws SQLException
{
return new JdbcFailSafeConnection(cc, 3);
}
@Override
public synchronized void close() throws IOException
{
cc = null;
for(ConnectionData d:pool)
{
IOTools.silentClose(d.conn);
}
}
}