您将如何测试连接池 [英] 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.
谢谢!
这里是代码,以防万一:
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;
}
}
}
}
}
还有我的 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;
}
}
推荐答案
你可以测试一下
- 在池为空时获取连接为您提供连接
- 当一个连接已经被获得但没有被释放时获得一个连接会给你另一个不同的连接
- 释放连接不会引发任何异常
- 在一个连接被释放后获得一个连接会给你同样的连接
请注意,这样的单元测试需要一个真实的数据库,有真实的用户和密码进行测试.您可以让连接池依赖于数据源,并使用返回模拟连接的模拟数据源构建连接池,以便能够在不依赖真实数据库的情况下测试该类.
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屋!