Есть ли способ ускорить загрузку встроенного контейнера EJB?

Я делаю свое первое веб-приложение Java EE, используя стеклянную рыбу и netbeans. Когда я создаю модульный тест, для которого требуется встроенный контейнер EJB, его загрузка может занять около 30 секунд. Я думал, что это вполне понятно, поскольку он «подражает» серверу Glassfish. Но потом я наткнулся на эту статью от Адама Биена, где говорится:

Весь тест с загрузкой контейнера занимает на моей машине около 5 секунд.

http://www.adam-bien.com/roller/abien/entry/embedding_ejb_3

org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
container

Поэтому я должен предположить, что что-то не настроено правильно. Я использую Linux Mint 12, в моем проекте используется база данных MySQL, а мой компьютер — двухъядерный с частотой 2 ГГц и оперативной памятью 4 ГБ. Почти все использует настройки по умолчанию из установки netbeans. (Я заказал новый процессор, который поднимет тест CPU Benchmark с 1700 до 7800 в соответствии с cpubenchmark.net)

Что я могу сделать, чтобы ускорить загрузку Embedded EJB Container?

глядя на вывод, кажется, что главный виновник:

org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA

Вот полный вывод:

Jan 9, 2012 5:01:57 PM com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default.
Jan 9, 2012 5:01:59 PM org.glassfish.ha.store.spi.BackingStoreFactoryRegistry register INFO: Registered org.glassfish.ha.store.adapter.cache.ShoalBackingStoreProxy for persistence-type = replicated in BackingStoreFactoryRegistry
Jan 9, 2012 5:02:00 PM com.sun.enterprise.v3.server.AppServerStartup run INFO: GlassFish Server Open Source Edition 3.1.1 (12) startup time : Embedded (1,476ms), startup services(2,053ms), total(3,529ms)
Jan 9, 2012 5:02:00 PM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run INFO: JMXStartupService: JMXConnector system is disabled, skipping.
Jan 9, 2012 5:02:02 PM org.glassfish.admin.mbeanserver.JMXStartupService shutdown INFO: JMXStartupService and JMXConnectors have been shut down.
Jan 9, 2012 5:02:02 PM com.sun.enterprise.v3.server.AppServerStartup stop INFO: Shutdown procedure finished
Jan 9, 2012 5:02:02 PM AppServerStartup run INFO: [Thread[GlassFish Kernel Main Thread,5,main]] exiting
Jan 9, 2012 5:02:02 PM org.glassfish.ha.store.spi.BackingStoreFactoryRegistry register INFO: Registered org.glassfish.ha.store.adapter.cache.ShoalBackingStoreProxy for persistence-type = replicated in BackingStoreFactoryRegistry
Jan 9, 2012 5:02:02 PM com.sun.enterprise.v3.server.AppServerStartup run INFO: GlassFish Server Open Source Edition 3.1.1 (12) startup time : Embedded (5,874ms), startup services(150ms), total(6,024ms)
Jan 9, 2012 5:02:02 PM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run INFO: JMXStartupService: JMXConnector system is disabled, skipping.
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.EJBContainerProviderImpl skipJar INFO: ... skipping entry with a Manifest file with a special attribute: glassfish-embedded-static-shell.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding EJB module to ScatteredArchive classes
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive mysql-connector-java-5.1.13-bin.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive commons-codec-1.6.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive commons-codec-1.6-bin.zip
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive ant.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive primefaces-3.0.RC2.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive ant-junit.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive log4j-1.2.15.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive classes
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive junit-4.8.2.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.EJBContainerImpl deploy INFO: [EJBContainerImpl] Deploying app: org.glassfish.embeddable.archive.ScatteredArchive@1ebafda6
Jan 9, 2012 5:02:08 PM org.hibernate.validator.util.Version <clinit> INFO: Hibernate Validator 4.1.0.Final
Jan 9, 2012 5:02:09 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.SecurityLifecycle <init> INFO: SEC1002: Security Manager is OFF.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.SecurityLifecycle onInitialization INFO: SEC1010: Entering Security Startup Service
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.PolicyLoader loadPolicy INFO: SEC1143: Loading policy provider com.sun.enterprise.security.provider.PolicyWrapper.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: SEC1115: Realm [admin-realm] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: SEC1115: Realm [file] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: SEC1115: Realm [certificate] of classtype [com.sun.enterprise.security.auth.realm.certificate.CertificateRealm] successfully created.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.SecurityLifecycle onInitialization INFO: SEC1011: Security Service(s) Started Successfully
Jan 9, 2012 5:02:17 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Jan 9, 2012 5:02:26 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Jan 9, 2012 5:02:26 PM org.eclipse.persistence.session.file:/tmp/gfembed2576733372934037196tmp/applications/classes/_REMPU INFO: EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
Jan 9, 2012 5:02:29 PM org.eclipse.persistence.session.file:/tmp/gfembed2576733372934037196tmp/applications/classes/_REMPU INFO: file:/tmp/gfembed2576733372934037196tmp/applications/classes/_REMPU login successful
...

Спасибо


person Alan B. Dee    schedule 09.01.2012    source источник
comment
дать согласие. Для меня это занимает 30 секунд, а не 5 секунд, о которых говорит АБ.   -  person Oliver Watkins    schedule 17.12.2013
comment
Наступил 2014 год, изменилась ли стратегия? как вы проводите тестирование ejb в junit   -  person Kalpesh Soni    schedule 04.12.2014
comment
Короткий ответ, я не. Это становится слишком грязным и, честно говоря, непрактичным. Вместо этого я начну модульный/интеграционный тест с точки входа назад. В идеальном мире я бы протестировал весь стек, но у меня есть крайний срок!   -  person Alan B. Dee    schedule 04.12.2014


Ответы (2)


Вы можете попробовать другую реализацию EJBContainer.

Время тестирования OpenEJB Embedded EJBContainer находится в диапазоне 1 секунды. Он поддерживает дескрипторы GlassFish — мы используем их вместо наших собственных, когда запускаем Java EE TCK, поскольку нам лень писать несколько тысяч дескрипторов, которые нам понадобятся, а TCK уже поставляется с полными дескрипторами GlassFish.

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

Для большего стиля модульного тестирования, возможно, проверьте это: https://stackoverflow.com/a/8716630/190816 создайте приложение в тестовом примере и добавьте немного насмешек по мере необходимости.

person David Blevins    schedule 11.01.2012
comment
Да, это то, что я понял, прочитав статьи Адама Биена. Мне придется немного поиграть, но, похоже, есть несколько вариантов. Но теперь я знаю, что Embedded EJB Container, настроенный Netbeans, — это не то, что мне следует использовать для модульных тестов. - person Alan B. Dee; 11.01.2012

Вот что я сделал до сих пор, и мой тестовый цикл сократился до 13 секунд.

1) Обновил свои процессоры. Я перешел с одного двухъядерного процессора 2 ГГц на два четырехъядерных процессора 2,5 ГГц, которые сократили время примерно на 5 с.

2) Вручную настроил файлы сборки, честно говоря, я не совсем понимаю, почему это имело такое значение, но это сократило почти 10 секунд. http://netbeans.org/kb/docs/javaee/javaee-entapp-junit.html#Exercise_1d

Map<String, Object> properties = new HashMap<String, Object>();
// Use the MODULES property to specify the set of modules to be initialized,
// in this case a java.io.File 
properties.put(EJBContainer.MODULES, new File("build/jar"));

3) Изменен файл persistence.xml, чтобы НЕ создавать таблицы базы данных. Мне просто нужно снова включить его при внесении изменений в структуру объекта.

Но цифры немного ошибочны, и простите меня, если я не потрачу время на надлежащий статистический анализ. Когда я включаю «создать» таблицу в постоянстве и возвращаюсь к базовой автоматической настройке, она запускается через 16 секунд. Но до появления процессоров у меня было 18 секунд. Так что цифры не совсем складываются.

Я также был очень рад получить предложение от Адама Биена. Я спросил его, не хочет ли он написать статью на эту тему. Он сказал, что это подробно описано в этой статье, и более подробная информация может можно найти в его книге и в другой статье:

person Alan B. Dee    schedule 10.01.2012
comment
Учитывая, что весь JBoss 7 запускается менее чем за секунду, это все еще кажется долгим сроком! - person Tom Anderson; 11.01.2012
comment
Согласованный. Однако, когда я читаю статьи Адама Биена, я думаю, что неправильно подходил к проблеме, путая модульное тестирование с интеграционным тестированием. То, что он излагает, кажется гораздо более практичным. - person Alan B. Dee; 11.01.2012