你将如何测试连接池 [英] How would you test a Connection Pool
问题描述
我在Java中实现了一个非常简单的ConnectionPool。
它没有花哨的功能,只是获取/释放连接方法。
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.
谢谢!
以下是有帮助的代码:
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:
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;
}
}
推荐答案
你可以测试
- 当游泳池为空时获得连接给你一个连接
- 获得一个连接已经获得并且未被释放时的连接会为您提供另一个不同的连接
- 释放连接不会引发任何异常
- 获取一个发布后的连接给你相同的连接
- getting a connection when the pool is empty gives you a connection
- getting a connection when a connection has already been got and not released gives you another, different connection
- releasing a connection doesn't throw any exception
- getting a connection after one has been released gives you the same connection
注意这样的单元测试需要一个真实的数据库,真实的用户和密码来测试。您可以使连接池依赖于DataSource,并使用模拟DataSource返回模拟Connections来构建ConnectionPool,以便能够在不依赖真实数据库的情况下测试类。
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.
这篇关于你将如何测试连接池的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!