Java: как ускорить реконструкцию JTree путем чтения данных с mongodb (удаленного сервера)? - PullRequest
2 голосов
/ 07 августа 2011

В основном, mongodb хранит каждый объект userobject (NodePro) с parentId.

Этот класс рекурсивно создает Jtree из запросов всех дочерних элементов данного parentId.

Проблема в том, что мне приходится ждать до 5 минут для загрузки всего дерева при работе с сотнями или тысячами узлов одного дерева.

Есть ли способ значительно ускорить это? в настоящее время даже имея дело с менее чем сотней узлов, дереву потребуется много времени для завершения.

public class BuildTree {

    public BuildTree(DefaultMutableTreeNode treeNode){
        DefaultMutableTreeNode aParentNode = treeNode;
        try {
            processChildren(aParentNode);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void processChildren(DefaultMutableTreeNode parentNode) throws Exception{
        NodePro np = (NodePro) parentNode.getUserObject();      

        List<NodePro> nodelist = NodeDAO.getInstance().getChildrenOfParent(np.getId().toString());

        if (nodelist.isEmpty()){    
            System.out.println("empty");
            return;
        }else{

             for (int i=0; i< nodelist.size(); i++)
              {            

                 NodePro childnode = nodelist.get(i);
                 DefaultMutableTreeNode child = new DefaultMutableTreeNode(childnode);

                 TreeModel.getInstance().insertNodeInto(child,parentNode,TreeModel.getInstance().getChildCount(parentNode));

                 DefaultMutableTreeNode parent = (DefaultMutableTreeNode) 
                    TreeModel.getInstance().getChild(parentNode, i);

                 processChildren(parent);
              }

            return;
        }   
    }

Ответы [ 2 ]

4 голосов
/ 07 августа 2011

@ trashgod прав в своем комментарии: где код тратит свое время?Это в создании объекта?DefaultMutableTreeNode плохо работает, когда вам нужно создать тысячи узлов.Это происходит во время получения информации об узле из MongoDB?

Если вы не можете ускорить создание дерева, вам нужно исследовать ленивую загрузку дочерних узлов.То есть не загружайте узел, пока пользователь не попросит увидеть дочерние элементы.

Другие возможности - загрузить дочерние узлы в фоновом потоке.

Однако, как и любая работа по улучшению производительностивам нужно измерить, какая часть вашего кода медленная, а затем выяснить, как ее улучшить.

1 голос
/ 07 августа 2011

это будет комментарий, но

удалить enless MongoDb engine в ваших темах, что не имеет никакого отношения к вашей проблеме (и количеству ваших сообщений)

есть три области

1 / вы не знакомы с (Аннотация / По умолчанию) TreeModel правильным и правильным способом, создайте JTree и его Model один раз, не так, как вы отобразили, затем строго разделенные Swing JComponets и Bussines Logics(загрузить / изменить / управлять / сохранить / что-либо с данными для Swing JComponents), вы создаете новый void() для любого вашего действия

2 / проблемы с Concurency в Swing ,потому что что-либо из / в базу данных в основном является заданием BackGroung, все должно быть заключено в invokeLater() и находится там Custom Java Look and Feel, затем в invokeAndWait()

3 / расширяется, поскольку @trashgod и @StanislavL правильно предложили внимательно прочитатьэтот пост о нераскрытом JDBC Objects

...