Вопрос по реализации пула соединений - PullRequest
1 голос
/ 29 апреля 2020

Мне задали в интервью следующий вопрос. Код, данный мне:

interface Connection {
    void execute();
    void close();
}


interface ConnectionPool {
    Connection getConnection();
}

class Client {

    ConnectionPool connectionPool = new MyConnectionPool() ;

    Connection connection  = connectionPool.getConnection();

    public void execute() {
        try{
        connection.execute();
    }finally {
            connection.close();
        }
    }
}

class MyConnectionPool implements ConnectionPool {

    MyConnectionPool(List<Connection> connections) {

    }
    @Override
    public Connection getConnection() {
        return null;
    }
}

Здесь реализация Соединения выполняется кем-то другим, я могу только изменить класс пула MyConnection или создать новые классы. Проблема заключается в том, что всякий раз, когда клиент вызывает connection.close, объект соединения фактически закрыт, вместо этого необходимо добавить его обратно в пул соединений, который может использовать кто-то другой.

Моя реализация похожа на

class MyConnectionPool implements ConnectionPool {

    Queue<Connection> connections;

    MyConnectionPool(List<Connection> connections) {
        this.connections = new LinkedList(connections);
    }
    @Override
    public Connection getConnection() {
        MyConnection connection = new MyConnection(connections.poll(), this);
        return connection;
    }

    public void closeConnection(Connection connection) {
        connections.add(connection);
    }
}

class MyConnection implements Connection {


    Connection connection;
    boolean isClosed = false;
    MyConnectionPool connectionPool;

    MyConnection(Connection connection, MyConnectionPool connectionPool) {
        this.connection = connection;
    }

    @Override
    public void execute() {
        if (!isClosed){
            connection.execute();
        }
    }

    @Override
    public void close() {
        if (!isClosed) {
            connectionPool.closeConnection(this);
        }

    }
}

Это правильно? Есть ли лучший способ добиться того же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...