【问题标题】:jTable populated from DB too slow, using Entity and EntityClasses使用实体和实体类从数据库填充的 jTable 太慢了
【发布时间】:2014-07-24 13:39:32
【问题描述】:

我创建了一个 jtable,然后将我的数据库拖放到其中,因此它会自动将所有列生成到表中。

问题是,加载时间太长,大概二十秒。

有什么办法优化吗?

当我直接在 MySQL Workbench 上运行查询时,大约需要两秒钟。

生成代码的相关部分:

    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();

【问题讨论】:

  • 查询需要多长时间?直接在数据库执行?
  • 直接在Mysql Workbench上,大概需要两秒。
  • 该表的一行大概有 34 列,我只在代码中显示我想要的那些,但我认为列数不是问题。你知道如果我使用 JDBC 代替生成代码,性能会大幅提升吗?
  • 通过使用 org.jdesktop.beansbinding 没有机会改变一些东西
  • 使用SwingWorker,代表example

标签: java swing jpa netbeans


【解决方案1】:

org.jdesktop.beansbinding 是不是一个糟糕的选择?

绑定无关紧要。因为数据库访问延迟本质上是随机的,所以它应该发生在一个单独的线程上以避免阻塞 Swing event dispatch thread (EDT)。同时,所有 GUI 更新都必须在 EDT 上完成。 SwingWorker 非常适合这个。使用带有org.jdesktop.beansbinding 的工作线程的完整示例见here

有更快、更好的选择吗?

Profiling 可以指导您寻找最佳性能。

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2015-07-09
    相关资源
    最近更新 更多