0

ObjectDB のクエリ パフォーマンスに大きな問題があります。これが私たちのコードです。どんな助けでも大歓迎です。

クエリの最初のバージョンでは、データベースからの最初の 40 レコードに対して 50 ミリ秒の結果が得られますが、40 以上のレコードをクエリする 2 番目のバージョンでは 19 秒になります。53回の記録からパフォーマンスが大幅に低下することを突き止めました。他のクエリでは、しきい値が異なります。結果のサイズが原因である可能性があります (おそらく関連オブジェクトの数に関連しています)。

コードの最初のバージョン。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("objectdb://10.10.10.14/E_POLICIJA.odb;user=admin;password=admin"); //$NON-NLS-1$

           em = emf.createEntityManager();


         long startTime;
         long endTime;

         startTime = System.currentTimeMillis();

          int i = 0;
          while(i < 40){
              TypedQuery<AktImpl> queryAkt =
                  em.createQuery("SELECT e FROM AktImpl e", AktImpl.class);

              queryAkt.setFirstResult(i);
              queryAkt.setMaxResults(20);
              queryAkt.getResultList();
              i += 20; 
          }

          endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime));
    }

コードの 2 番目のバージョン

           EntityManagerFactory emf =
                    Persistence.createEntityManagerFactory("objectdb://10.10.10.14/E_POLICIJA.odb;user=admin;password=admin"); //$NON-NLS-1$

           em = emf.createEntityManager();


         long startTime;
         long endTime;

         startTime = System.currentTimeMillis();

          int i = 0;
          while(i < 60){
              TypedQuery<AktImpl> queryAkt =
                  em.createQuery("SELECT e FROM AktImpl e", AktImpl.class);

              queryAkt.setFirstResult(i);
              queryAkt.setMaxResults(20);
              queryAkt.getResultList();
              i += 20; 
          }

          endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime));
    }

助けてくれてありがとう

4

1 に答える 1

0

問題は、その特定のアプリケーションで定義された循環熱心な関係であることが判明しました。これは、クエリ結果を使用して多くのオブジェクトを再帰的にロードする必要がありました。

解決策は、関係設定を熱心から怠惰に変更することでした。

詳細については、このフォーラム スレッドを参照してください。

于 2014-01-17T13:12:12.700 に答える