Как добиться "нормального" рукописного Connection Pool?

Знаю что есть готовые решения Pool Connection. Но мне нужен самописный, как мне в методе returnConnection() не допустить "чужого" Connection который могут передать в параметры. Который не был порождён из моего самописного Pool ? Может быть посоветуете что ещё можно дописать ? Исправить?

public class ConnectionPool {
    private static volatile ConnectionPool instance;
    private ConfigurationManager confManager;

    private BlockingQueue <Connection> listConnections;

    private String userNameDB;
    private String passwordDB;
    private String driverDB;
    private String urlDB;
    private int sizePool;

    private ConnectionPool() {
        confManager = ConfigurationManager.getInstance();
        listConnections = new ArrayBlockingQueue<>(sizePool);

        userNameDB = confManager.getUserNameDB();
        passwordDB = confManager.getPasswordDB();
        driverDB = confManager.getDriverDB();
        urlDB = confManager.getUrlDB();
        sizePool = confManager.getSizePool();

        try {
            Class.forName(driverDB);
            fillPool();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            /* Log4j */
        }
    }

    public static ConnectionPool getInstance(){
        if (instance == null){
            synchronized(ConnectionPool.class){
                if(instance == null){
                    instance = new ConnectionPool();
                }
            }
        }
        return instance;
    }

    private Connection createConnection(){
        Connection connection = null;

        try {
            connection = DriverManager.getConnection(urlDB, userNameDB, passwordDB);
        } catch (SQLException e) {
            e.printStackTrace();
            /* Log4j */
        }
        return connection;
    }

    private void fillPool(){
        for (int i = 0; i < sizePool; i++) {
            try {
                listConnections.put(createConnection());
            } catch (InterruptedException e) {
                e.printStackTrace();
                /* Log4j */
            }
        }
    }

    public Connection getConnection(){
        synchronized(ConnectionPool.class){
            Connection connect = null;
            try {
                connect = listConnections.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
                /* Log4j */
            }
            return connect;
        }
    }

    public void returnConnection(Connection connection){
        /* ПРОБЛЕМА: можно закинуть любой Connection в мою очередь */
    }


}


Ответы (0 шт):