Java执行器服务连接池

标签 java connection-pooling executorservice apache-commons-dbcp scheduledexecutorservice

我正在尝试对执行程序服务使用连接池。

当连接池配置为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 个任务,我们应该将 ma​​xTotal 设置为 10。intialSize 可以配置为您指定的数字认为一开始是最佳的,比如说 3 - 5。 ma​​xIdle 是你想要保持 Activity 的线程数,我们通常假设如果提交任务需要多少个线程。尽管没有标准建议,但值(value)可能由许多不同的因素决定,例如。

  1. 一分钟内提交的任务分布
  2. 任务持续时间
  3. 并行执行这些任务的紧迫性。

正如您提到的,您需要 10 个并行任务,那么您必须将 10 个并行任务配置为 maxTotal,考虑到您的任务分布和持续时间导致重叠。如果持续时间很短,并且分布均匀,您也可以以较低的数量生存。

关于Java执行器服务连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573458/

相关文章:

Java gson 错误 : Expected BEGIN_OBJECT but was BEGIN_ARRAY (but my type map is correct? )

java - 从 EntityManager 获取所有映射的实体

java - 在没有根架构的情况下验证 XML

java - 释放 JBOSS 7.2 中的包装连接

java - 在 Java 线程池中的每个工作线程上调用自定义关闭方法的优雅方法是什么?

java - 如何迭代对象数组[Gson反序列化]?

python - Python 脚本和 Tweepy 的 Cron 作业

java - 每个 http 请求的直接数据库连接与连接池 - 有什么区别

java - ThreadFactory 和 newThread(Runnable r) 如果它是线程,如何访问 r 的属性?

java - 使用 ExecutorService 产生的结果。哪一个类?