user3470415
user3470415

Reputation:

jTable populated from DB too slow, using Entity and EntityClasses

I've created a jtable then dragged and dropped my database into it, so it would automatically generate all columns into the table.

The problem is, it's taking too long to load, like twenty seconds.

Any way to optimize it?

When I run the query directly on MySQL Workbench, it takes like two seconds.

Relevant part of the generated code:

    bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

    MyDbPUEntityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("MyDbPU").createEntityManager();
    userQuery = java.beans.Beans.isDesignTime() ? null : MyDbPUEntityManager.createQuery("SELECT u FROM User u");
    userList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : userQuery.getResultList();


    org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, userList, jTable1);
    org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${id}"));
    columnBinding.setColumnName("Id");
    columnBinding.setColumnClass(Integer.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${nome}"));
    columnBinding.setColumnName("Nome");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${sexo}"));
    columnBinding.setColumnName("Sexo");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${cpf}"));
    columnBinding.setColumnName("CPF");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${cidade}"));
    columnBinding.setColumnName("Cidade");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${estado}"));
    columnBinding.setColumnName("Estado");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${ndoc}"));
    columnBinding.setColumnName("RG");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    columnBinding = 

jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${dataNasc}"));
    columnBinding.setColumnName("Data Nascimento");
    columnBinding.setColumnClass(String.class);
    columnBinding.setEditable(false);
    bindingGroup.addBinding(jTableBinding);
    jTableBinding.bind();

Upvotes: 2

Views: 360

Answers (1)

trashgod
trashgod

Reputation: 205785

Is org.jdesktop.beansbinding a bad choice?

The binding is irrelevant. Because database access latency is inherently stochastic, it should take place on a separate thread to avoid blocking the Swing event dispatch thread (EDT). At the same time, all GUI updates must be done on the EDT. SwingWorker is ideal for this. A complete example using a worker thread with org.jdesktop.beansbinding is seen here.

Are there faster, better alternatives?

Profiling may guide your search for optimal performance.

Upvotes: 3

Related Questions