春の起動時のパフォーマンスの問題

ベン:

何千ものクラスを持つかなり大きなアプリケーションにSpringを統合しようとしています。コンポーネントのスキャンが原因で、コンテナの起動に大幅な遅延が発生しています。

「基本パッケージ」で指定されたディレクトリの数は、関係のないディレクトリのスキャンに費やされる時間を減らすために最小限に抑えていますが、初期化のクラスパススキャンの部分にはまだ約1〜2分かかります。

では、スキャンプロセスを最適化する方法はありますか?起動時にクラスパスをスキャンするのではなく、クラスパスの候補をファイルに保存し、コンテナーをファイルから取得することを考えましたが、どこから始めればよいか、それが可能かどうかさえわかりません。

アドバイスは大歓迎です。前もって感謝します。


Edit1自動生成されたxmlファイルからBean定義を読み込み、Springのブートストラップ時間を9〜10秒に短縮しました。これにより、コンポーネントのクラスパススキャンにSpringが使用するリフレクションAPIが起動遅延の主な原因であることが確認されます。
xmlファイルの生成に関しては、同じ問題のある人に役立つ可能性があるため、ここにコードがあります。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;


public class ConfigurationWriter {

    public ArrayList<String> beanDefinitions = new ArrayList<String>();

    public ConfigurationWriter() {

        // the context loaded with old fashioned way (classpath scanning)
        ApplicationContext context = SpringContainerServiceImpl.getInstance().getContext();
        String[] tab = context.getBeanDefinitionNames();
        for (int i = 0; i < tab.length - 6; i++) {
            Class clazz = context.getType(tab[i]);
            String scope = context.isPrototype(tab[i]) ? "prototype" : "singleton";
            String s = "<bean id=\"" + tab[i] + "\" class=\"" + clazz.getName() + "\" scope=\"" + scope + "\"/>";
            beanDefinitions.add(s);
        }
        // Collections.addAll(beanDefinitions, tab);

    }

    @SuppressWarnings("restriction")
    public void generateConfiguration() throws FileNotFoundException {
        File xmlConfig = new File("D:\\dev\\svn\\...\\...\\src\\test\\resources\\springBoost.xml");
        PrintWriter printer = new PrintWriter(xmlConfig);

        generateHeader(printer);

        generateCorpse(printer);

        generateTail(printer);

        printer.checkError();

    }

    @SuppressWarnings("restriction")
    private void generateCorpse(PrintWriter printer) {

        for (String beanPath : beanDefinitions) {
            printer.println(beanPath);
        }

    }

    @SuppressWarnings("restriction")
    private void generateHeader(PrintWriter printer) {
        printer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        printer.println("<beans xmlns=\"http://www.springframework.org/schema/beans\"");
        printer.println("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
        printer.println("xmlns:context=\"http://www.springframework.org/schema/context\"");
        printer.println("xsi:schemaLocation=\"");
        printer.println("http://www.springframework.org/schema/mvc");
        printer.println("http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd");
        printer.println("http://www.springframework.org/schema/beans");
        printer.println("http://www.springframework.org/schema/beans/spring-beans-3.0.xsd");
        printer.println("http://www.springframework.org/schema/context");
        printer.println("http://www.springframework.org/schema/context/spring-context-3.0.xsd\"");
        printer.println("default-lazy-init=\"true\">");
    }

    @SuppressWarnings("restriction")
    private void generateTail(PrintWriter printer) {
        // printer.println("<bean class=\"com.xxx.frmwrk.spring.processors.xxxBeanFactoryPostProcessor\"/>");
        printer.println("<bean class=\"com.xxx.frmwrk.spring.processors.xxxPostProcessor\"/>");
        printer.println("</beans>");
    }

}

編集2: Spring 5には、コンテキストの初期化を高速化するための重要な最適化セットが含まれており、コンパイル時に候補コンポーネントのインデックスを生成できる興味深い便利な機能も備えています:Spring Context Indexer

ラルフ:

質問:ディレクトリ内のクラスのいくつ(%)がSpring Beanですか?

回答:確かではありません(非常に大きなプロジェクトです)が、xmlファイルとプロパティファイルが別々の場所に分離されているため、90〜100%程度だと私は思います。

問題が本当にコンポーネントのスキャンであり、Beanの初期化プロセス自体ではない場合(そして私はそれを疑っています)、考えられる唯一の解決策は、コンポーネントのスキャンの代わりにSpring XML構成を使用することです。-(XMLファイルを自動的に作成できます)。

しかし、多くのクラスがあり、90%-100%がBeanである場合、スキャンされたファイルの削減により、最大で10%-0%の改善が見られます。

初期化をスピードアップする他の方法を試す必要があります。遅延読み込みまたは遅延読み込み関連のテクニックを使用するか、(そしてそれは冗談ではありません)より高速なハードウェアを使用します(スタンドアロンアプリケーションでない場合)。


Spring XMLを生成する簡単な方法は、元のアプリケーションのようにクラスパススキャンを使用する単純なSpringアプリケーションを作成することです。すべてのBeanが初期化されると、Spring ContextのBeanを反復処理し、Beanが重要なパッケージに属しているかどうかを確認し、このBeanのXML構成をファイルに書き込みます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

春のセキュリティ-エラーはパフォーマンスの問題を引き起こす

分類Dev

IsMatch使用時のREGEXパフォーマンスの問題

分類Dev

DataReaderのパフォーマンスの問題、奇妙な動作

分類Dev

パフォーマンスの問題

分類Dev

DECENDANTS使用時のMDXクエリのパフォーマンスの問題

分類Dev

SpringBootプロセス実行時のパフォーマンスの問題

分類Dev

起動時のGuiceのパフォーマンスを向上させる方法

分類Dev

SQL削除*パフォーマンスの問題を引き起こす

分類Dev

Rのループのパフォーマンスの問題

分類Dev

matplotlibの凡例のパフォーマンスの問題

分類Dev

PageStorageKeyでのFlutterListViewのパフォーマンスの問題

分類Dev

VirtualBoxでのLinuxMintのパフォーマンスの問題

分類Dev

Burrows-PythonのWheelerのパフォーマンスの問題

分類Dev

Djangoの多対多のパフォーマンスの問題

分類Dev

SQLでのUNION句のパフォーマンスの問題

分類Dev

Where andContainsでのLINQtoEntitiesのパフォーマンスの問題

分類Dev

HikariCP での Postgresql のパフォーマンスの問題

分類Dev

NestJsテストのパフォーマンスの問題

分類Dev

システムのパフォーマンスの問題

分類Dev

Pythonリスト操作のパフォーマンスの問題

分類Dev

iOSデバイスのパフォーマンスの問題

分類Dev

イオンタブのパフォーマンスの問題

分類Dev

イオンタブのパフォーマンスの問題

分類Dev

ループ内のjQueryパフォーマンスの問題

分類Dev

SSESIMDコードのパフォーマンスの問題

分類Dev

カーソルのパフォーマンス低下の問題

分類Dev

Retina Macbook ProでのWebGLパフォーマンスの問題

分類Dev

LinkedBlockingQueueでのJavaパフォーマンスの問題

分類Dev

Java ByteBufferのパフォーマンスの問題

Related 関連記事

  1. 1

    春のセキュリティ-エラーはパフォーマンスの問題を引き起こす

  2. 2

    IsMatch使用時のREGEXパフォーマンスの問題

  3. 3

    DataReaderのパフォーマンスの問題、奇妙な動作

  4. 4

    パフォーマンスの問題

  5. 5

    DECENDANTS使用時のMDXクエリのパフォーマンスの問題

  6. 6

    SpringBootプロセス実行時のパフォーマンスの問題

  7. 7

    起動時のGuiceのパフォーマンスを向上させる方法

  8. 8

    SQL削除*パフォーマンスの問題を引き起こす

  9. 9

    Rのループのパフォーマンスの問題

  10. 10

    matplotlibの凡例のパフォーマンスの問題

  11. 11

    PageStorageKeyでのFlutterListViewのパフォーマンスの問題

  12. 12

    VirtualBoxでのLinuxMintのパフォーマンスの問題

  13. 13

    Burrows-PythonのWheelerのパフォーマンスの問題

  14. 14

    Djangoの多対多のパフォーマンスの問題

  15. 15

    SQLでのUNION句のパフォーマンスの問題

  16. 16

    Where andContainsでのLINQtoEntitiesのパフォーマンスの問題

  17. 17

    HikariCP での Postgresql のパフォーマンスの問題

  18. 18

    NestJsテストのパフォーマンスの問題

  19. 19

    システムのパフォーマンスの問題

  20. 20

    Pythonリスト操作のパフォーマンスの問題

  21. 21

    iOSデバイスのパフォーマンスの問題

  22. 22

    イオンタブのパフォーマンスの問題

  23. 23

    イオンタブのパフォーマンスの問題

  24. 24

    ループ内のjQueryパフォーマンスの問題

  25. 25

    SSESIMDコードのパフォーマンスの問題

  26. 26

    カーソルのパフォーマンス低下の問題

  27. 27

    Retina Macbook ProでのWebGLパフォーマンスの問題

  28. 28

    LinkedBlockingQueueでのJavaパフォーマンスの問題

  29. 29

    Java ByteBufferのパフォーマンスの問題

ホットタグ

アーカイブ