Подтвердить что ты не робот

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

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

Хорошо ли работает общий фонд? Код выглядит симпатичным, erm, уродливым.

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

Хорошо ли работает общий фонд? Код выглядит симпатичным, erm, уродливым.

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

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

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

  • Найдите то, что делает все, что вам нужно (я не знаю такую ​​библиотеку, которая не означает, что ее нет).
  • Если вы не можете найти что-то, что делает все, что вам нужно из коробки, а затем расширить существующее решение.
  • Создайте собственное решение.

Ответ 2

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

  • Интерфейс общих интерфейсов. Наиболее очевидной проблемой для пула общин является его предварительный интерфейс. Есть несколько способов обойти это. Ты можешь
    • сделать литье;
    • реализовать параллельный интерфейс, который выполняет кастинг для вас; или
    • используйте патч который определил Паскаль
  • Concurrency Материал из более ранней версии java. Это подробная информация о реализации, о которой вам не нужно заботиться. Если concurrency правильный, то не имеет значения, как была достигнута правильность. Альтернативно, реализация пула, которая использует более свежие данные, но чей concurrency является неправильным, по-прежнему является бедным кандидатом.
  • Уродливый код. Вы должны использовать его, а не жениться на нем.
  • Индивидуальная проверка достоверности. Внесите validateObject, чтобы проверить жизнеспособность объектов. Мертвые объекты будут уничтожены. Вы также можете выполнить задачу Cron, чтобы периодически брать и возвращать объекты - заставляя своевременно уничтожать мертвые объекты.

Ответ 3

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

Если количество объектов в пуле фиксировано, вы можете использовать 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);
             }
           });

Ответ 4

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

http://www.kbop.org

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

Существует реализация пула объектов в http://code.google.com/p/spf4j/ Я нахожу, что это лучшая реализация, чем та, что в апаче. Код не так уродлив, и он работает лучше...

Ответ 8

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

Ответ 9

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

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

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