Skip to content

Instantly share code, notes, and snippets.

@darkleaf
Created August 30, 2024 10:10
Show Gist options
  • Save darkleaf/c1ce980dc35532af991f5833f19d9d71 to your computer and use it in GitHub Desktop.
Save darkleaf/c1ce980dc35532af991f5833f19d9d71 to your computer and use it in GitHub Desktop.
(ns pool
(:import
(org.apache.commons.pool2 ObjectPool BasePooledObjectFactory PooledObjectFactory)
(org.apache.commons.pool2.impl DefaultPooledObject GenericObjectPool GenericObjectPoolConfig)))
(set! *warn-on-reflection* true)
;; таймаут? W
;; как останавливать? W
;; как плавно расти?
;; как плавно скукоживаться?
(def factory
(reify PooledObjectFactory
(makeObject [_]
(locking prn
(prn :make))
(let [obj (Object.)]
(DefaultPooledObject. obj)))
(activateObject [_ p]
(locking prn
(prn :activate p)))
(destroyObject [_ p]
(locking prn
(prn :destroy p)))
(passivateObject [_ p]
(locking prn
(prn :passivate p)))
(validateObject [_ p]
(locking prn
(prn :validate p))
true)))
(def config
(doto (GenericObjectPoolConfig.)
(.setMaxWait (java.time.Duration/ofSeconds 2))
(.setTimeBetweenEvictionRuns (java.time.Duration/ofSeconds 5))
(.setSoftMinEvictableIdleTime (java.time.Duration/ofSeconds 1))))
(def ^ObjectPool pool (GenericObjectPool. factory config))
(let [o (.borrowObject pool)]
(try
o
(finally
(.returnObject pool o))))
(dotimes [_ 40]
(future
(let [o (.borrowObject pool)]
(try
o
(finally
(.returnObject pool o))))))
(dotimes [_ 20]
(let [o (.borrowObject pool)]
(try
o
(finally
(.returnObject pool o))))
(Thread/sleep 2000))
(.close pool)
(.getNumActive pool)
(.getNumIdle pool)
GenericObjectPoolConfig/DEFAULT_DURATION_BETWEEN_EVICTION_RUNS
GenericObjectPoolConfig/DEFAULT_SOFT_MIN_EVICTABLE_IDLE_DURATION
(.toSeconds GenericObjectPoolConfig/DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment