Java 如何正确使用Swing-performance技巧处理大数据

Java 如何正确使用Swing-performance技巧处理大数据,java,mysql,swing,Java,Mysql,Swing,有一个应用程序,我基本上是用Swing、JDBC和MySQL编写的 在数据库中,有诸如物品、公司、订单、交易、客户等表格 还有一些java类描述了它们 用户可以创建、更新、删除有关它们的信息 我举了一个我的问题的例子。文章以id、名称、价格、公司、单位为特征。当用户想要保存新文章时,他会从所有公司的列表中为本文选择公司。这张透视图上的列表可能真的很大 现在我可以想出两种方法来解决这个问题 当应用程序启动时,它连接到数据库并加载所有数据,然后我将使用这些数据工作 public final cl

有一个应用程序,我基本上是用Swing、JDBC和MySQL编写的

  • 在数据库中,有诸如物品、公司、订单、交易、客户等表格
  • 还有一些java类描述了它们
  • 用户可以创建、更新、删除有关它们的信息
我举了一个我的问题的例子。文章以id、名称、价格、公司、单位为特征。当用户想要保存新文章时,他会从所有公司的列表中为本文选择公司。这张透视图上的列表可能真的很大

现在我可以想出两种方法来解决这个问题

  • 当应用程序启动时,它连接到数据库并加载所有数据,然后我将使用这些数据工作

    public final class AllInformationController {
    public static final Collection<Company> COMPANIES= new HashSet<>(1_000_000);
    public static final Collection<Article> ARTICLES= new HashSet<>(1_000_000);
    public static final Collection<Order> ORDERS= new HashSet<>(1_000_000);
    public static final Collection<Transaction> transactionsHistory= new HashSet<>(10_000_000);
    //etc...
    private AllInformationController() {}
    }
    
    公共最终类AllInformation Controller{
    公共静态最终收集公司=新哈希集(1_000_000);
    公共静态最终收集文章=新哈希集(1_000_000);
    公共静态最终收款单=新哈希集(1_000_000);
    公共静态最终收集事务历史记录=新哈希集(10_000_000);
    //等等。。。
    专用AllInformation Controller(){}
    }
    
    然后,如果用户想更改一些公司数据(如地址或电话等),在这样做之后,程序应该更新该公司的数据库信息

  • 第二种方法基本上是在用户每次查询或更改某些信息时连接到数据库。因此,我将主要使用
    ResultSet的


  • 我更喜欢第二种方式,只是不确定它是否是最好的。我认为应该有更高效的方法来处理成本更低的数据。

    第二种方法更好,尽管它们之间可能有一个最佳的例子。这里的第二种方法允许多个应用程序(或同一应用程序的用户)同时修改数据,因为如果一次加载所有数据(特别是如果用户暂时离开应用程序),第一种方法可能会使用旧数据。我将使用第二种方法,然后找出要进行哪些优化

    因为您认为第一种方法可能是可用的,所以我假设您不会有太多用户同时使用该工具。如果是这种情况,那么您可能不需要使用第1个方法本身提供的任何优化,因为不会有太多的数据库使用


    当你说第二种方法比第一种方法更频繁地使用结果集时,其实不需要这样。您可以使用第一种方法中的相同方法,将数据转换为Java数据结构,以便在第二种方法中使用。

    您已经做出了一个非常糟糕的决定:

    只有在选择的数量相当有限的情况下,列表才能合理工作;低于10-20,您可以使用组合框。对于成千上万的选择来说,一个列表是非常麻烦的,而且它越长,从列表中选择就越慢,也越不方便

    这通常通过某种搜索字段(例如,用户类型客户编号、按tab键和获取信息)来解决,可能与搜索对话框(具有更多搜索选项和选择结果的方式)结合使用


    由于您通常只会在搜索请求中选择几个项目,因此直接查询数据库通常是可行的。对于搜索对话框,您可能需要人为地限制结果的数量(使用特定的SQL子句进行分页)。

    听起来像是一个搜索任务jpa@Andreasjpa是下一级:)我打错了。数据不在列表中,而是显示在表中。反正是一样的。我想在这张桌子上搜索一下,也许这是个好主意。如果我执行一些搜索对话框,是否可以通过JTextField在数据库中执行“实时搜索”例如,用户键入文章的名称,一些监听器将转到DB,然后提供带有名称的列表供选择?我这样问是因为我没有尝试过这样做,所以不知道这种方法是否足够快。@标记live search的效果主要取决于您的数据库,在开始搜索时(例如,输入X个字符后)稍加调整通常是可行的。连接到JTextField可能需要很多工作,但原则上很简单,您需要处理线程(对于实际的SQL查询)以及一些潜在的棘手的焦点管理(对于selectresults弹出窗口)。几年前我也做过类似的事情(我们为此入侵了JComboBox)。要让它在外观和感觉上保持一致(事件发生的顺序稍有不同等),这是一件非常麻烦的事情。您能否给出一个在另一个线程中执行查询并显示结果的示例,因为我的版本非常慢,并且有一些bug。我还发现有两种主要的自动完成方法。1.使用swingx自动完成2。使用Java2AutoComplete。也许你建议我用哪一种?
    And when user wants to save new article he chooses the company for this article
    from the _list_ of all companies