我正在尝试对执行程序服务使用连接池。
当连接池配置为initialSize=3、maxToal=5、maxIdle=5 时,我遇到一些问题。
我每分钟需要一次处理 10 个服务。但它每分钟只选择 5 个服务。
如果我配置initialSize=3、maxToal=10、maxIdle=10,则每分钟选择10个服务..
我是多线程和连接的新手。下面是我的代码片段。请提供建议。
public class TestScheduledExecutorService {
public static void main (String a[]) {
ScheduledExecutorService service = null;
try {
TestObject runnableBatch = new TestObject() {
public void run() {
testMethod ();
}
};
service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnableBatch, 0, 30, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class TestObject implements Runnable{
public void testMethod (int inc) {
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
service.submit(new TestService());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
}
}
public class TestService implements Callable{
Connection conn = null;
public void process(Connection conn) {
try {
if (conn != null) {
System.out.println("Thread & Connection pool conn : "+Thread.currentThread() + " :: " +conn);
// service process here
} else {
System.out.println("Connection pool conn is null : ");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
@Override
public Object call() throws Exception {
ConnectionPoolTest cp = ConnectionPoolTest.getInstance();
BasicDataSource bds = cp.getBasicDataSource();
conn = bds.getConnection();
System.out.println(" call() "); **// it prints only 5 times for every minute eventhough total services are 10**
process(conn);
return null;
}
}
public class ConnectionPoolTest {
private static ConnectionPoolTest dataSource = new ConnectionPoolTest();
private static BasicDataSource basicDataSource = null;
private ConnectionPoolTest() {
}
public static ConnectionPoolTest getInstance() {
if (dataSource == null)
dataSource = new ConnectionPoolTest();
return dataSource;
}
public BasicDataSource getBasicDataSource() throws Exception {
try {
basicDataSource = new BasicDataSource();
basicDataSource.setInitialSize(3);
basicDataSource.setMaxTotal(10);
basicDataSource.setMaxIdle(10);
} catch (Exception e) {
throw e;
}
return basicDataSource;
}
}
最佳答案
对于执行者服务
initialSize : Specified Number of Threads to spin , when New executor is created.
maxTotal : Number of Threads that can exist at max peak load.
maxIdle : Number of Thread that are kept active even if load goes below threshold.
正如您所提到的,您想要并行执行 10 个任务,我们应该将 maxTotal 设置为 10。intialSize 可以配置为您指定的数字认为一开始是最佳的,比如说 3 - 5。 maxIdle 是你想要保持 Activity 的线程数,我们通常假设如果提交任务需要多少个线程。尽管没有标准建议,但值(value)可能由许多不同的因素决定,例如。
- 一分钟内提交的任务分布
- 任务持续时间
- 并行执行这些任务的紧迫性。
正如您提到的,您需要 10 个并行任务,那么您必须将 10 个并行任务配置为 maxTotal,考虑到您的任务分布和持续时间导致重叠。如果持续时间很短,并且分布均匀,您也可以以较低的数量生存。
关于Java执行器服务连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573458/