我把Jsch放入了公共池(带有弹簧池支持)并取得了初步成功
http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#aop-ts-pool
然而:
我们应该在会话中汇集频道而不是汇集会话吗?每个Jsch会话创建一个线程.池化Jsch会话将创建x个线程.汇集渠道,实际上只有一个Jsch线程.
(commons-pool)如果Jsch会话变得陈旧会发生什么?如何在commons-pool的上下文中重新生成会话或使用spring pool支持?如何检测它是否陈旧?
谢谢
我一直在寻求在我的应用程序的一部分中实现池化。我想使用 Commons Pool 库,但有点担心close()行为是如何工作的。通过查看javadocs和源代码,似乎不清楚在close()调用该方法时池中创建的对象是否会被销毁。据我所知,只有池中空闲的对象才会被销毁——任何正在使用但尚未返回的对象都不会被触及。
我在这里错过了什么吗?我想确保在池关闭时所有对象都被正确销毁。
有没有人以前使用过它并且知道它是如何工作的?
我正在使用Apache Commons Pool库来维护一个基础连接池(可以看作任何类型的连接,并不重要).
我面临的问题是,我发现将对象返回池的唯一方法是通过从GenericObjectPool类调用returnObject方法以编程方式进行.这会强制应用程序保证从池中借用对象的返回,无论应用程序中是否有任何异常或意外行为.
即使我在整个应用程序中控制对象返回池中,我发现完全依赖程序员返回对象的风险很大.有人知道在超过给定超时后自动返回对象的方法(回收对象).一旦超过借用对象的超时,它也可以以任何方式使池创建新对象.
PS:我的应用程序公开了一组REST Web服务,它们连接到分布式memcache服务器(Couchbase).池创建了一组与Couchbase的连接.
任何建议都会有所帮助!
编辑
我尝试过的第一个解决方案是创建一个New Class(CouchbaseClientHandler),它包含一个连接Object,该对象来自存储在池中的对象类型(CouchbaseClient).我已经在CouchbaseClientHandler上实现了finalize方法,如果对该对象的引用因意外异常而丢失,则确保关联实际返回到池中.当垃圾收集器销毁对象时,将返回该对象.这没有按预期工作.无法预测垃圾收集器何时到达回收物体,并且通常需要比预期更长的时间.
我现在实际工作的解决方案有点不同,但更安全.由于我的池旨在被Web服务使用,并且因为每个Web服务都在一个单独且独特的线程中运行(我在Tomcat上使用Jersey),所以我决定使用映射唯一线程ID的静态hashmap变量到执行webservice时从池中借用的CouchbaseClient对象列表.由于我的Web服务是以这样的方式设计的,无论发生什么,处理程序方法将在返回之前处理最终输出,我可以确保始终运行一个方法,将那些借用的对象(连接)返回到池,没有有效地回到游泳池.
虽然这对我来说效果很好,但我真的想知道是否有更好的方法来声明或擦除未被返回的超时借用对象.
web-services connection-pooling production-environment apache-commons-pool
我正在使用Apache Commons Pool创建一个Nashorn引擎池.在应用程序启动时,我调用preparePool()将所有脚本minIdle的实例数预热eval()到引擎中,以便它可以invokeFunction()立即应答呼叫.
热身
@Override
public NashornScriptEngine create() {
// ...
try {
engine.eval(asset1);
engine.eval(asset2);
engine.eval(asset3);
} // ...
return engine;
}
Run Code Online (Sandbox Code Playgroud)
根据池大小和预加载脚本的复杂性,这需要相当长的时间.
问题
我可以只预热一个实例并将其安全地克隆到minIdle实例数吗?
是否可以安全地序列化并保留已创建实例的克隆?(这将允许维护引擎缓存,如果其中一个资产发生更改,则只需要使其无效)
相关资源(适当时将更新此部分)
我有一个运行多个线程的 tomcat - spring4.2 应用程序。每个线程仅从一个队列中出队,但是分配给一个队列的线程不止一个。
事情开始很好,但是在几个小时/大约 50 万个出队操作之后,我发现线程出队的速度非常慢。
在 jvisualvm 中看到橙色的线程 ie park 线程转储如下:
"EMLT_2" - Thread t@64
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <2cf42d7> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:48)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:86)
at com.mycomp.sam.processors.SimpleDequeuer.dequeue(SimpleDequeuer.java:25)
at com.mycomp.sam.processors.EMLT.run(EMLT.java:29)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"EMLT_1" - Thread t@63
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <2cf42d7> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
at …Run Code Online (Sandbox Code Playgroud) concurrency locking java.util.concurrent jedis apache-commons-pool
当使用apache common pool时,它可以为我提供Java对象池的良好实现。然而,它们的KeyedPoolableObjectFactory接口不是类型安全的。Java中有没有对象池库可以提供泛型接口供我们创建类型安全的对象池?
我正在编写一个守护进程来获取某些游戏的服务器统计信息。
在编译中我收到一条消息:
无法访问 org.apache.commons.pool2.impl.GenericObjectPoolConfig 类文件,找不到 org.apache.commons.pool2.impl.GenericObjectPoolConfig
在这行代码中:


我已经将commons-pooling-1.6.jar添加到我的类路径并尝试实例化a StackObjectPool并且每次都失败了:
// Deprecated.
ObjectPool<T> oPool = new StackObjectPool<T>();
// Error: Cannot instantiate the type BasePoolableObjectFactory<T>.
PoolableObjectFactory<T> oFact = new BasePoolableObjectFactory<T>();
ObjectPool<T> oPool = new StackObjectPool<T>(oFact);
Run Code Online (Sandbox Code Playgroud)
这是一个弃用的API吗?如果是这样,Commons Pooling的一些开源替代品是什么?否则,我如何实例化StackObjectPool?
java ×5
pooling ×2
apache ×1
concurrency ×1
jedis ×1
jsch ×1
locking ×1
maven ×1
nashorn ×1
objectpool ×1
spring ×1
web-services ×1