I have implemented a very simple ConnectionPool in Java. It has no fancy features, just get/release connection methods.
How can I test it is working?
I know there are plenty of connection Pools ready to use out there, which are much more reliable than what I'll do, but I am just trying to practice to understand how connections Pool work.
Thank you!
Here is the code in case it helps:
public class ConnectionPoolImpl implements ConnectionPool {
private Vector<PooledConnection> connections; // The connections container
String url;
String username;
String password;
/**
* Instanciates a new MySQLConnectionPool
* @param nbConnectionsMax
*/
public ConnectionPoolImpl(String DBUrl, String username, String password){
this.connections = new Vector<PooledConnection>();
this.url = DBUrl;
this.username = username;
this.password = password;
}
/**
* Returns a connection from the pool, if some are available, or create a new one.
*
* @return the connection.
*/
public Connection getConnection() throws SQLException {
synchronized(this.connections){
// Checking if there is an available connection to return
for(PooledConnection c : this.connections){
if(!c.isUsed()){
c.setUsed();
return c.getConnection();
}
}
// If there are none, open a new one and return it
Connection conn = DriverManager.getConnection(url, username, password);
PooledConnection pConn = new PooledConnection(conn);
pConn.setUsed();
connections.add(pConn);
return pConn.getConnection();
}
}
/**
* Releases a connection to the pool.
*
* @param con the connection to release.
*/
public void releaseConnection(Connection con) throws SQLException {
synchronized(this.connections){
for(PooledConnection c : this.connections){
if(c.getConnection().equals(con)){
c.setFree();
return;
}
}
}
}
}
And my PooledConnection.java:
public class PooledConnection {
private Connection conn;
private boolean used;
public PooledConnection(Connection conn){
this.conn = conn;
this.used = false;
}
public void setUsed(){
this.used = true;
}
public void setFree(){
this.used = false;
}
public boolean isUsed(){
return this.used;
}
public Connection getConnection(){
return this.conn;
}
}
You could test that
Note that such a unit test would need a real database, with a real user and password to test. You could make your connection pool depend on a DataSource, and build your ConnectionPool using a mock DataSource returning mock Connections, in order to be able to test the class without depending on a real database.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With