Как протестировать пул соединений
я реализовал очень простой ConnectionPool в Java. Он не имеет причудливых функций, просто методы подключения get/release.
Как я могу проверить его работу?
Я знаю, что есть много пулов соединений, готовых к использованию, которые намного надежнее, чем то, что я буду делать, но я просто пытаюсь практиковать, чтобы понять, как работает пул соединений.
спасибо!
вот код, если это поможет:
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;
}
}
}
}
}
и мои соединении 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;
}
}
4 ответов
вы можете проверить это
- получение соединения, когда пул пуст, дает вам соединение
- получение соединения, когда соединение уже получено и не выпущено, дает вам другое, другое соединение
- освобождение соединения не вызывает никаких исключений
- получение соединения после того, как один был выпущен дает вам то же самое соединение
отметим, что такой тест будет нужна реальная база данных, с реальным пользователем и паролем для проверки. Вы можете сделать свой пул соединений зависимым от источника данных и построить свой ConnectionPool, используя макет источника данных, возвращающий макет соединений, чтобы иметь возможность тестировать класс без зависимости от реальной базы данных.
для интеграционного теста вы можете использовать д. Банкрофт чтобы загрузить базу данных с подготовленными данными, а затем написать тесты, которые запрашивают базу данных.
для модульного теста вы можете использовать насмешливую библиотеку, такую как Mockito чтобы убедиться, что вы получите поведение, которое вы ожидаете. В данном случае база данных не требуется. [EDIT: однако из-за статических вызовов метода, таких как DriverManager.getConnection (), это потребует некоторого рефакторинга и / или зависимости инъекция.]
объединив модульные тесты и интеграционные тесты (и смешайте в некоторых многопоточных модульных тестах), вы можете пройти долгий путь к тестированию своей работы.
промышленные пулы соединений прочности имеют способность проверить соединения путем делать соединение и исполнять простой запрос SQL (например "выберите 1") для того чтобы обеспечить что соединение жизнеспособно перед давать его вне. Твоя не.
Я не вижу где вы можете инициализировать пул соединений с фиксированным количеством соединений. Весь смысл пула соединений заключается в амортизации затрат на создание соединения по всем клиентам.
Я бы беспокоился о дизайне ваш пул соединений.
Что касается тестирования, то просто начните писать модульные тесты. Поскольку ваш пул будет общим, обязательно напишите несколько многопоточных тестов, чтобы убедиться, что он действительно потокобезопасен.
вы также должны проверить параллелизм / масштабируемость при загрузке с использованием нескольких потоков.