Не удается найти современную реализацию пула объектов в Java

Я ищу современную реализацию пула объектов в Java. Я вижу общедоступный apache, но, честно говоря, я бы предпочел тот, который использует дженерики, и параллелизм из более поздних версий java.

Общий пул действительно хорошо работает? Код выглядит красиво, эээ, уродливо.

Мне нужно что-то, что позволяет настраивать проверку жизнеспособности и т. Д. И т. Д.

Спасибо!


person time4tea    schedule 03.09.2010    source источник
comment
Зачем вам в первую очередь нужен пул объектов? В современных JVM создание небольших объектов обходится очень и очень дешево. Эффективная Java, 2-е изд. В пункте 5 пулы объектов рекомендуются только для тяжеловесных объектов, таких как соединения с БД.   -  person Péter Török    schedule 03.09.2010
comment
Что ж, у меня есть что-то вроде подключения к базе данных (но не подключение к базе данных), которое я хотел бы объединить.   -  person time4tea    schedule 03.09.2010
comment
(отсюда и немного о проверке живучести)   -  person time4tea    schedule 03.09.2010
comment
Можете ли вы перечислить еще несколько требований, которым не может соответствовать apache-commons? Похоже, что потокобезопасность является одним из них. Любые другие?   -  person The Alchemist    schedule 03.09.2010
comment
дело даже не в том, что он не может их встретить... он просто кажется таким... старым. Например, интерфейсы не обобщаются, поэтому вы просто получаете Object. GenericObjectPool просто кажется устаревшим и грубым. Я просто предположил, что должна быть "более чистая" реализация вокруг   -  person time4tea    schedule 03.09.2010
comment
Но причина его старости в том, что они в значительной степени не нужны. Кроме того, старый подразумевает стабильный ;)   -  person Goibniu    schedule 03.09.2010
comment
почему они ненужны? (не троллинг!) это дорогие объекты внешним ресурсам. вы используете пул соединений с базой данных, верно? я хочу (что-то еще) пул соединений...   -  person time4tea    schedule 03.09.2010
comment
@Rulmeq в значительной степени ненужный не означает, что он никогда не нужен. Авторы библиотек не всегда понимают это правильно.   -  person Thorbjørn Ravn Andersen    schedule 22.06.2012
comment
commons-pool теперь поддерживает дженерики   -  person artbristol    schedule 19.12.2012
comment
Вот обсуждение этого в Гуаве: code.google.com /p/guava-libraries/issues/detail?id=683   -  person Fabian Zeindl    schedule 22.05.2014


Ответы (9)


Я вижу общедоступный apache, но, честно говоря, я бы предпочел тот, который использует дженерики, и параллелизм из более поздних версий java.

Ну, дело в том, что такого рода проекты (общие пулы объектов) не пользуются большой популярностью, потому что в настоящее время в них мало нужды (создание объектов дешево). Это, вероятно, объясняет, почему вы не видите многих из них (и на самом деле я знаю только о Commons Pool).

При этом, если вашей основной задачей являются дженерики, вы можете исправить пул Commons, см. POOL-83. к нему прикреплен патч.

Общий пул действительно хорошо работает? Код выглядит красиво, эээ, уродливо.

У него есть несколько известные ошибки (четыре), но, насколько мне известно, это работает. Что касается последнего предложения, ну, если вы думаете, что можете написать что-то лучше, и если у вас есть на это время, почему бы просто не сделать это?

Мне нужно что-то, что позволяет настраивать проверку жизнеспособности и т. Д. И т. Д.

У вас нет бесконечного количества вариантов. Либо

  1. Найдите то, что делает все, что вам нужно (я не знаю такой библиотеки, но это не значит, что ее нет).
  2. Если вы не можете найти что-то, что делает все, что вам нужно, из коробки, расширьте существующее решение.
  3. Сверните собственное решение.
person Pascal Thivent    schedule 07.09.2010
comment
Спасибо за ваш ответ - я полностью осознаю, что создание объектов само по себе очень дешево. Я бы никогда не использовал пул объектов для повторного использования объектов, которые существуют только в памяти. Там будут драконы. Однако часто объекты представляют собой какой-то внешний дорогостоящий в создании ресурс, который нельзя создать дешево. Подумайте о соединении с базой данных или SSL-соединении. Это такой тип мышления, который я хотел бы объединить. Я обновил код пула общих ресурсов. Я опубликую патч здесь или что-то в этом роде. - person time4tea; 09.09.2010
comment
@time4tea Я просто пытался закрепить свой ответ, не подразумевая, что вы не знали. Но спасибо за обратную связь и доступность патча. - person Pascal Thivent; 09.09.2010
comment
@PascalThivent Я согласен с тем, что создание объекта дешево, но инициализация объекта может быть дорогим. Другими словами, точно так же, как соединения с базой данных. - person Thorbjørn Ravn Andersen; 29.08.2012
comment
Я не понимаю, как дешевое создание объектов, которое, кажется, часто упоминается в этом вопросе, имеет какое-либо отношение к избыточным пулам объектов. Дешевизна должна сочетаться с количеством раз, когда она встречается, рисовое зерно дешево само по себе, но если вы покупаете его тоннами, оно становится дорогим. Таким образом, пулы объектов полезны, когда создание объектов становится узким местом, которое зависит от количества инициализаций, а не только от стоимости одной инициализации. - person alex.p; 01.03.2019
comment
Создание объекта стоит дорого. Люди приходят к выводу, что создание объектов дешево, основываясь на микробенчмарках, где JVM часто может игнорировать создание объектов с помощью анализа побега, а даже если нет, эффекты кэширования или GC не имеют большого значения. В реальном коде создание объекта происходит медленно, и его следует по возможности избегать — создание объекта часто сопровождается промахом кеша, потому что он использует часть памяти, которая не использовалась какое-то время. Это также заставляет GC запускаться чаще, повышая вероятность продвижения объектов до старого поколения и т. д. Таким образом, вы можете замедлить свои программы в 20 раз по сравнению с кодом на основе стека. - person Piotr Kołaczkowski; 20.02.2020

Commons Pool — хороший кандидат для вашего проекта.

  1. Generics Interface - The most obvious problem with commons pool is its pre-generics interface. There are a number of ways you can get around this. You can
    1. do casting;
    2. реализовать параллельный интерфейс, который выполняет приведение за вас; или же
    3. используйте патч, который определил Pascal
  2. Параллелизм из более поздней версии java. Это деталь реализации, о которой вам не следует беспокоиться. Если параллелизм правильный, то не имеет значения, каким образом была достигнута правильность. В качестве альтернативы, реализация пула, которая использует более свежие материалы, но чей параллелизм неправильный, по-прежнему является плохим кандидатом.
  3. Уродливый код. Вы должны использовать его, а не жениться на нем.
  4. Пользовательская проверка жизнеспособности — реализация validateObject для проверки жизнеспособности объектов. Мертвые объекты будут уничтожены. Вы также можете реализовать задачу Cron для периодического заимствования и возврата объектов, тем самым своевременно удаляя мертвые объекты. объекты.
person emory    schedule 11.09.2010
comment
Я не думаю, что параллелизм — это деталь реализации, о которой вам не следует заботиться; вы бы использовали пул объектов только в том случае, если хотите повысить производительность, так зачем вам использовать дорогостоящую синхронизацию монитора в этом случае, когда доступны структуры данных без блокировки/ожидания? - person BD at Rivenhill; 23.08.2012

Трудно дать рекомендацию, не зная, какие функции вам нужны.

Если количество объектов в пуле фиксировано, вы можете использовать BlockingQueue, как в этот пример из вопроса, упомянутого @codedevour

Если значения, которые вы хотите объединить, могут быть связаны с ключом, вы можете использовать MapMaker из Guava

ConcurrentMap<Key, Connection> connections = new MapMaker()
       .concurrencyLevel(32)
       .softKeys()
       .weakValues()
       .expiration(30, TimeUnit.MINUTES)
       .evictionListener(
           new MapEvictionListener<Key, Connection>() {
             public onEviction(Key key, Connection connection) {
               connection.close();
             } 
           });
       .makeComputingMap(
           new Function<Key, Connection>() {
             public Connection apply(Key key) {
               return createConnection(key);
             }
           });
person NamshubWriter    schedule 11.09.2010
comment
мне нравится этот пример MapMaker. Это не делает то, что мне нужно на этот раз! - person time4tea; 11.09.2010
comment
Какие функции вам нужны из пула объектов? Для чего это используется? - person NamshubWriter; 12.09.2010
comment
Похоже, этот способ использования MapMaker переносится на CacheBuilder. code.google.com/p/guava-libraries/wiki/MapMakerMigration - person Thorbjørn Ravn Andersen; 29.08.2012
comment
И это один из фрагментов кода, который, надеюсь, будет намного короче в Java 8. - person Thorbjørn Ravn Andersen; 21.05.2014

Оформить заказ КБОП. Это потокобезопасная блокировка одного ключа для одного объекта или одного ключа для пула нескольких объектов. Он легкий и не добавляет дополнительных зависимостей.

http://www.kbop.org

person Jeremy Unruh    schedule 21.04.2013
comment
Мертвый домен. Страница Github: github.com/gondor/kbop - person GuiSim; 23.02.2017

Кажется, это связано с вашим вопросом, возможно, вам действительно стоит подумать о написании пула объектов самостоятельно. Работает ли этот базовый пул объектов Java?.

Объединение в пул изначально было введено как действие по настройке для снижения производительности при создании объектов и, в частности, при сборке мусора. На современной JVM › 1.4 пул больше не нужен для оптимизации управления памятью в типичном бизнес-приложении. Это может даже негативно сказаться на производительности сборщика мусора. В особых случаях, таких как создание миллионов экземпляров при каждом вызове метода, это все равно может окупиться.

Однако пул экземпляров по-прежнему интересен для объектов с медленным созданием пользовательских постов. В некоторых случаях вы хотите внедрить некоторые зависимости после создания объекта, прочитать некоторую конфигурацию и т. д. Это может быть медленным и не должно выполняться снова и снова. В таких случаях объединение объектов улучшит общую производительность.

Адам Бьен -- Объединение объектов может быть полезным по совершенно другим причинам

Что вы думаете об улучшении Commons Pool Framework? Вы могли бы сделать некоторый рефакторинг и добавить общую часть, это было бы неплохо и для других.

person Christopher Klewes    schedule 10.09.2010

Еще один пул (yapool) содержит общую реализацию пула с возможностью обработки событий пула через прослушиватели (пример). Это обеспечивает большую гибкость в настройке поведения пула, добавлении функций и диагностике использования ресурсов пула. В качестве альтернативы вы также можете расширить реализацию пула, добавив желаемое поведение (пример). Это должно быть относительно просто, поскольку реализации пулов уже расширяют друг друга (Basic --> Bound --> Pruned).

Для начала вы можете использовать простой BoundPool. и установите свою собственную фабрику (см., например, "LongFactory" в ранее упомянутом примере событий пула) или просто используйте ObjectPool.

Yapool не имеет «синхронизированных» блоков и довольно быстр.

person vanOekel    schedule 08.12.2013


Что касается дженериков, то почему бы просто не использовать неуниверсальную библиотеку и не создать оболочку, которую вы используете для доступа к неуниверсальной библиотеке, отвечающей за приведение типов? Таким образом, есть одно место, где выполняется кастинг, что, по крайней мере, немного очистит код.

person jamiebarrow    schedule 13.09.2010

Пул - это традиционный способ, кеширование - это современный способ. И есть много современных реализаций кеша.

Чтобы узнать разницу между этими двумя, вы можете прочитать это: http://www.informit.com/guides/content.aspx?g=java&seqNum=104

Я считаю, что мы можем использовать кэш-библиотеку для объединения наших объектов, но не наоборот. Только не забудьте повторно инициализировать объект после того, как мы получим его из кеша. Так зачем иметь два разных животных (кэш и пул), если вы можете добиться всего, используя один?

person nanda    schedule 08.09.2010
comment
Спасибо. там почти нет информации. - person time4tea; 09.09.2010
comment
Возможно, он говорит о распределенном кэшировании. Что-то вроде memcached? Я предполагаю, что это своего рода «пул» ресурсов. - person jamiebarrow; 13.09.2010