编程语言
首页 > 编程语言> > java – 如何测试连接池

java – 如何测试连接池

作者:互联网

我在Java中实现了一个非常简单的ConnectionPool.
它没有花哨的功能,只是获取/释放连接方法.

我该如何测试它是否有效?

我知道有很多连接池可以在那里使用,它比我要做的更可靠,但我只是想练习理解连接池的工作方式.

谢谢!

这是代码,以防它有帮助:

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;
    }
}

解决方法:

你可以测试一下

>当池为空时获取连接会为您提供连接
>在已经获得连接但未释放连接时获取连接会为您提供另一个不同的连接
>释放连接不会抛出任何异常
>在释放一个连接后获得连接可以获得相同的连接

请注意,这样的单元测试需要一个真实的数据库,并且需要测试真实的用户和密码.您可以使连接池依赖于DataSource,并使用模拟DataSource返回模拟Connections来构建ConnectionPool,以便能够在不依赖于真实数据库的情况下测试该类.

标签:java,unit-testing,testing,connection-pooling,integration-testing
来源: https://codeday.me/bug/20190930/1836153.html