Olá Guilherme, seguem um exemplo de como está hoje, mas usei o atributo como estático justamente pra não ocorrer o problema que citei na pergunta:
PS: dei uma simplificada em partes não relevantes.
Classe Database:
package br.com.ricardosander.meupetshop.database;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
public class Database {
    private static DataSource pool;
    public Database() throws SQLException, PropertyVetoException {
        if (Database.pool == null) {
            String host = null;
            int port = 0;
            String database = null;
            String user = null;
            String password = null;
            //Lé configurações de um arquivo....
ComboPooledDataSource pool = new ComboPooledDataSource();
            pool.setDriverClass("com.mysql.jdbc.Driver");
            pool.setJdbcUrl("jdbc:mysql://" + host + ":" + port + "/" + database);
            pool.setUser(user);
            pool.setPassword(password);
            pool.setMinPoolSize(1);
            pool.setAcquireIncrement(5);
            pool.setMaxPoolSize(20);
            Database.pool = pool;
        }
    }
    public Connection getConnection() throws SQLException {
        return Database.pool.getConnection();
    }
}
Um model de exemplo
package br.com.ricardosander.meupetshop.model;
public class Pet {
    private long id;
    private String name;
    //outros atributos, construtores, getters e setters.....
}
Uma DAO de exemplo
package br.com.ricardosander.meupetshop.dao;
import br.com.ricardosander.meupetshop.database.Database;
import br.com.ricardosander.meupetshop.model.Pet;
import br.com.ricardosander.meupetshop.model.User;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;
public class MySQLPetDAO  {
    public List<Pet> find(User user) {
        LinkedList<Pet> pets = new LinkedList<>();
        StringBuilder sqlBuilder = new StringBuilder();
        sqlBuilder
                .append("   SELECT ")
                .append("       A.ID ")
                .append(" ,     A.NOME ")
                .append("  FROM animal A ")
                .append("   WHERE A.USUARIO = ? ");
        String sql = sqlBuilder.toString();
        try (
                Connection connection = new Database().getConnection();
                PreparedStatement preparedStatement = connection.prepareStatement(sql)
        ) {
            preparedStatement.setLong(1, user.getId());
            if (preparedStatement.execute()) {
                ResultSet resultSet = preparedStatement.getResultSet();
                while (resultSet.next()) {
                    pets.add(
                            new Pet(
                                    resultSet.getLong("ID"),
                                    resultSet.getString("NOME"),
                                    )
                    );
                }
            }
        } catch (SQLException | PropertyVetoException e) {
            System.out.println("Erro ao conectar no banco de dados ou realizar query.");
            e.printStackTrace();
        }
        return pets;
    }
    @Override
    public Pet find(User user, long id) {
        StringBuilder sqlBuilder = new StringBuilder();
        sqlBuilder
                .append("   SELECT ")
                .append("       A.ID ")
                .append(" ,     A.NOME ")
                .append("  FROM animal A ")
                .append("   WHERE A.USUARIO = ? AND A.ID = ? ");
        String sql = sqlBuilder.toString();
        try (
                Connection connection = new Database().getConnection();
                PreparedStatement preparedStatement = connection.prepareStatement(sql)
        ) {
            preparedStatement.setLong(1, user.getId());
            preparedStatement.setLong(2, id);
            if (preparedStatement.execute()) {
                ResultSet resultSet = preparedStatement.getResultSet();
                if (resultSet.next()) {
                    return new Pet(
                            resultSet.getLong("ID"),
                            resultSet.getString("NOME")
                    );
                }
            }
        } catch (SQLException | PropertyVetoException e) {
            System.out.println("Erro ao conectar no banco de dados ou realizar query.");
            e.printStackTrace();
        }
        return null;
    }
    public boolean insert(Pet pet) {
//implementação do insert omitida...
        return false;
    }
    public boolean remove(Pet pet) {
        //implementação do insert omitida...
        return false;
    }
}