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