Executor Serviceに接続プーリングを使用しようとしています。Java Executorサービス接続プール
接続プールの設定がinitialSize = 3、maxToal = 5、maxIdle = 5のときに問題が発生します。
1分ごとに10のサービスを一度に処理する必要があります。しかし、1分ごとに5つのサービスしか選択しません。私は毎分のために、その摘み10個のサービスをINITIALSIZE = 3、maxToal = 10、maxIdle = 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;
}
}
"シングルトン"が壊れています。あなたが今やっているように毎回新しい 'BasicDataSource'を作成するはずがありません。 – Kayaman
ありがとうKayaman。このための解決策を教えてください。 – DEADEND
簡単な解決策はありません。あなたのコードは非常に多くの点で間違っています。私は接続プールとエグゼキュータの両方についていくつかの読書(チュートリアル、その他のスタックオーバーフローの投稿など)をすることをお勧めします。現在、あなたは完全に間違った方法でそれらの両方を使用しています。 – Kayaman