我可以看到apache的commons,但说实话,我宁愿使用generics的东西,以及来自更新版本的java的并发东西。
那么事实是,这种types的项目(通用对象池)并没有太大的吸引力,因为现在对它们的需求不大(对象创build很便宜)。 这可能解释了为什么你没有看到很多(实际上,我只知道Commons Pool)。
话虽如此,如果仿制药是您最关心的问题,那么您可以修补Commons Pool,参见POOL-83 ,它附带了一个补丁。
公共泳池真的可以工作吗? 代码看起来很漂亮,呃,丑陋。
它有一些已知的错误 (四),但据我所知,它的工作原理。 而关于最后一句话,如果你认为你可以写更好的东西,而且如果你有时间的话,为什么不做呢?
我需要一些允许自定义生存validation等的东西
你没有无限的select。 或
find一些你需要的东西(我不知道这样的图书馆,这并不意味着没有)。
如果您无法find所需的一切,那么请扩展现有的解决scheme。
推出自己的解决scheme。
Commons Pool是您项目的理想select。
generics接口 – generics接口最明显的问题是它的generics接口。 有很多方法可以解决这个问题。 您可以
做铸造;
实现一个并行接口,为你做铸造; 要么
使用Pascal识别的补丁
来自更近期Java的并发的东西 – 这是一个你不应该关心的实现细节。 如果并发性是正确的,那么正确性如何实现并不重要。 或者,使用更新的东西,但其并发性是错误的池实现仍然是一个可怜的候选人。
丑陋的代码 – 你应该使用它,而不是结婚。
自定义生存validation – 实现validateObject来testing对象的活性。 死对象将被销毁。 您也可以执行一个Cron任务来定期借用和返回对象 – 迫使及时消除死对象。
不知道你需要什么function,很难提出build议。
如果池中的对象数量是固定的,那么可以使用BlockingQueue就像本例中的@codedevour提到的问题
如果要将池中的值与某个键相关联,则可以使用Guava的 MapMaker
ConcurrentMap connections = new MapMaker() .concurrencyLevel(32) .softKeys() .weakValues() .expiration(30, TimeUnit.MINUTES) .evictionListener( new MapEvictionListener() { public onEviction(Key key, Connection connection) { connection.close(); } }); .makeComputingMap( new Function() { public Connection apply(Key key) { return createConnection(key); } });
结帐KBOP。 这是一个线程安全阻止单个对象或单个键到多个对象池的单个键。 它是轻量级的,不添加额外的依赖。
这似乎与你的问题有关,也许你应该考虑自己编写一个对象池。 这个基本的Java对象池是否工作? 。
最初引入池作为一个调整行动,特别是缓慢执行对象创build和垃圾收集。 在典型的业务应用程序中,优化内存pipe理不再需要现代JVM> 1.4池。 它甚至会对垃圾收集器的性能产生负面影响。 在特殊情况下,例如在每个方法调用中创build数百万个实例,仍然可以得到回报。
实例池,但是对于缓慢的定制“后期制作”的对象仍然是有趣的。 在某些情况下,您希望在创build对象之后注入一些依赖项,读取一些configuration等。这可能很慢,不必一遍又一遍地执行。 在这种情况下,对象池将提高整体性能。
亚当Bien – 对象池可以仍然有用 – 为完全不同的原因
您如何看待增强公共泳池框架? 你可以做一些重构,添加通用部分,对其他人来说也不错。
另一个池( yapool )包含一个通用的池实现,可以通过监听器来处理池事件( 例子 )。 这为自定义池行为,添加函数和诊断池资源使用情况提供了很大的灵活性。 或者,您也可以扩展一个池实现来添加自己想要的行为( 示例 )。 这应该是相对直接的,因为池实现已经相互扩展(基本 – >绑定 – >修剪)。
首先,您可以使用一个简单的BoundPool并设置您自己的工厂(例如,参见前面提到的池事件示例中的“LongFactory”),或者只使用ObjectPool 。
Yapool没有“同步”块,速度相当快。
对于generics方面,为什么不只是使用非generics库,并创build一个包装,你用来访问非generics库照顾铸造? 这样就有一个地方在铸造完成,至less会清理代码。
池是传统的方式,caching是现代的方式。 那里有很多现代化的caching。
要了解这两者之间的差异,请阅读以下内容: http : //www.informit.com/guides/content.aspx?g=java&seqNum=104
我的观点是,我们可以使用一个caching库来集中我们的对象,而不是相反。 从caching中获取对象后,请不要忘记重新初始化对象。 那么为什么还有两种不同的动物(caching和游泳池)呢?