Pessoal, estou desenvolvendo um sistema em JavaFX, banco de dados MySQL e utilizando JDBC, porém ao desenvolver as primeiras telas estou me deparando com uma lentidão absurda no carregamento da TableView e dos dados nas telas.
Minhas tabelas possuem cerca de 5 mil registros e outras ultrapassam 10 milhões inclusive algumas com Blob imagens, porém a lentidão está até nas tabelas mais simples, vou postar aqui a estrutura apenas de uma tabela simples e que está bem lenta, por favor, poderiam avaliar se estou fazendo alguma coisa errada.
Segue abaixo estrutura BEAN (model), DAO e Controller do FXML:
Classe BEAN (model)
public class beanRECFornecedor {
int cod;
String codigo;
String fornecedor;
String contato;
String planejador;
@Override
public String toString() {
return "beanRECFornecedor{" + "cod=" + cod + ", codigo=" + codigo + ", fornecedor=" + fornecedor + ", contato=" + contato + ", planejador=" + planejador + '}';
}
public beanRECFornecedor() {
}
public beanRECFornecedor(int cod, String codigo, String fornecedor, String contato, String planejador) {
this.cod = cod;
this.codigo = codigo;
this.fornecedor = fornecedor;
this.contato = contato;
this.planejador = planejador;
}
public int getCod() {
return cod;
}
public void setCod(int cod) {
this.cod = cod;
}
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public String getFornecedor() {
return fornecedor;
}
public void setFornecedor(String fornecedor) {
this.fornecedor = fornecedor;
}
public String getContato() {
return contato;
}
public void setContato(String contato) {
this.contato = contato;
}
public String getPlanejador() {
return planejador;
}
public void setPlanejador(String planejador) {
this.planejador = planejador;
}
}
Classe DAO (crud)
public class daoRECFornecedor {
//Metodo para retornar todas os registros da tabela (Read - C"R"UD) e preenche o TablView
public ObservableList<beanRECFornecedor> obterTabelaCriterio(String Filtro1, String criterio1) {
ObservableList<beanRECFornecedor> lista = FXCollections.observableArrayList();
Connection conn = dbConexao.getConnection();
Statement stmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM fornecedor "
+ " WHERE " + Filtro1 + " LIKE '%" + criterio1 + "%' "
+ " ORDER BY fornecedor ASC";
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
beanRECFornecedor bean = new beanRECFornecedor();
bean.setCod(rs.getInt("cod"));
bean.setCodigo(rs.getString("codigo"));
bean.setFornecedor(rs.getString("fornecedor"));
bean.setContato(rs.getString("contato"));
bean.setPlanejador(rs.getString("planejador"));
lista.addAll(bean);
}
} catch (Exception e) {
e.printStackTrace();
dbConexao.close((com.mysql.jdbc.Connection) conn, stmt, rs);
} finally {
dbConexao.close((com.mysql.jdbc.Connection) conn, stmt, rs);
}
return lista;
}
}
Controller do formulário FXML onde tem a table view
public class controlTelaRECFornecedor implements Initializable {
daoRECFornecedor dao = new daoRECFornecedor();
@FXML
public TableView<beanRECFornecedor> tblViewFornecedor;
@FXML
private TableColumn<beanRECFornecedor, Integer> tblClmCod;
@FXML
private TableColumn<beanRECFornecedor, String> tblClmCodFornecedor;
@FXML
private TableColumn<beanRECFornecedor, String> tblClmFornecedor;
@FXML
private TableColumn<beanRECFornecedor, String> tblClmPlanejador;
@FXML
private TableColumn<beanRECFornecedor, String> tblClmContato;
@FXML
private JFXComboBox<String> txtFiltro1;
@FXML
private JFXTextField txtCriterio1;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Chama o método que inicializa o formulário preenchendo a Tableview
carregaGrid();
}
//Carrega TableView (Utilizado na iniciação deste FXML)
@FXML
private void carregaGrid() {
tblClmCod.setCellValueFactory(new PropertyValueFactory<>("cod"));
tblClmCodFornecedor.setCellValueFactory(new PropertyValueFactory<>("codigo"));
tblClmFornecedor.setCellValueFactory(new PropertyValueFactory<>("fornecedor"));
tblClmPlanejador.setCellValueFactory(new PropertyValueFactory<>("planejador"));
tblClmContato.setCellValueFactory(new PropertyValueFactory<>("contato"));
ObservableList<beanRECFornecedor> bean = FXCollections.observableArrayList(dao.obterTabelaCriterio(txtFiltro1.getSelectionModel().getSelectedItem(), txtCriterio1.getText()));
tblViewFornecedor.setItems(bean);
}
}