2012-04-25 3 views
0

나는 스스로 프로그래밍 (java..mostly 여기에서 질문을 읽는 것으로부터 많다.)하고 내 프로그램은 작동하지만 나는 그들이 할 수있는 한 빨리 그 것인지 확신하지 못한다. 내 응용 프로그램을 프로파일 링하기 시작했고 모든 프로그램에서 큰 추세는 다른 서비스 (대기열 서버, 데이터베이스 서버 등)에 데이터를 연결/끌어 오기/보내는 것 (일반적으로 프로그램의 40 % 이상이 연결 관련 작업에 사용됩니다)입니다.많은 연결을 위해 프로그램을 설계하는 방법은 무엇입니까?

사람들이이 문제를 없애기 위해 따르는 디자인 패턴이나 구조가 있습니까? 데이터베이스에서 데이터를 가져 와서 결과 (예 : result + 1)를 수행하고 다시 전송하는 간단한 문제가있는 경우 어떻게 프로그램을 구조화하면 대부분의 시간이 데이터 처리에 소비됩니까? 그 자체? 데이타의 폴링이 복잡해지면 잘해야한다는 것을 이해합니다.하지만이 작업을 대규모로 수행하고 데이터베이스/대기열 서버에서 많은 간단한 작업을 수행해야하는 경우 어떻게해야합니까?

이것은 잠시 동안 귀찮았습니다. 따라서 스레드를 사용하는 방법을 배웠고 동시에 데이터를 보낼 준비가 된 스레드 설문을 만들었습니다 (그래서 내 프로그램이 승인을 기다리고 있지 않음). 그러나 나는 보일 수 없습니다. 프로그램에서 데이터를 처리 할 때 CPU가 처리 할 수있는 것보다 빠른 속도로 새 데이터를 폴링 할 수 없으므로 데이터 유입을 향상시키는 방법을 알아 내야합니다. 또한 각 요청마다 연결/채널을 다시 열지 않았 음을 확인했지만 시간이 오래 걸립니다.

나는 이것이 일반적인 문제이며 누군가 내 프로그램 (선호하는 자바)을 디자인하는 법을 배울 수있는 자원을 가리킬 수 있다면 고맙겠습니다. 그렇게 큰 부분은 연결에 지출되지 않습니다./서비스 api는 데이터를 얻습니다. 나는 일반적인 포인터를 찾고 어떤 예제도 좋을 것이다. 질문이 너무 일반적이고 코드 샘플을 사용하여 쉽게 문제를 재현 할 수 있는지 알려주십시오.

감사 드리며 잘 설명해 드리겠습니다.

+1

ORM/JPA 프레임 워크, 연결 풀링, 캐시 등을 사용하고 있습니까? – mrab

+3

질문은 본질적으로 "어떻게 대기 시간을 효과적으로 처리합니까?" 그것은 업계에서 열린 질문입니다. 거기에 슬램 덩크 분명히 올바른 해결책입니다. 개발자가 이러한 문제를 해결하는 데 도움이되는 언어와 프레임 워크에 임베드해야하는 추상화 집합을 결정하는 것은 매우 어렵습니다. 우리는 coroutines의 형태를 일급 언어 기능으로 만들어 C#과 VB에서 그렇게하려고 시도하고 있지만, 이것이 가능한 유일한 해결책은 아닙니다. –

+0

클라이언트가 데이터베이스보다 강력 할 수도 있고, 사용자 측에서 조정하지 않고 데이터를 처리 할 수있는 속도보다 더 빠르게 데이터를 제공 할 수도 없습니다. – Affe

답변

2

연결 풀링을 시도 했습니까? 기본적으로 몇 개의 연결 (예 : 5 개의 연결)을 항상 풀에서 열고 준비 할 수 있습니다. 필요할 때 풀에서 가져와 사용하고 풀로 되돌립니다. 그런 식으로 모든 연결 오버 헤드를 처리하지 않습니다. 이것은 멀티 스레드 응용 프로그램에도 좋은 아이디어입니다. JDBC 연결 풀링을위한 DBCP, 일반적인 객체 풀링을위한 공유 풀, 쓰레드 풀링을위한 ThreadPoolExecutor, 심지어 HTTP 연결의 "풀링"(풀링보다 더 계속적으로 재사용)에 대한 http 클라이언트를 공유 할 수도 있습니다.

또한 클라이언트가 실행 프로그램을 사용하여 데이터 지속이 완료 될 때까지 기다리지 않아도되는 것을 피할 수 있습니다. 예 :

public int inc() { 
    int current = getCurrent(); 
    current++; 
    executorService.execute(new Runnable() { 
     public void run() { 
      dataBase.save(current); 
     } 
    }); 
    return current; 
} 
+0

나는 비슷한 것을한다. 스레드를 포크하고 각 스레드가 연결을 공유하지만 시스템 (이 경우 큐)에 자체 채널을 만듭니다. 그런 다음 50 개의 항목을 미리 가져 와서 처리하려고 시도하지만 처리하는 것보다 데이터를 가져 오는 데 더 많은 시간이 걸리기 때문에 대기열은 항상 비어 있고 시스템은 데이터를 기다려야합니다. – Lostsoul

0

쓰레드를 살펴보고, 패키징을 줄이고 (쓰레기 제거가 적음) 코드를 수정하고, 대부분은 Java의 프로세스 스케줄링 알고리즘이나 스케줄링을 살펴 봅니다. 일반적으로 Java는 저수준 시스템 프로세스로 넘어가는 데 어려움을 겪고 있지만 Java로 계속 진행하려면 다른 프로세스에 대한 세마포 및 잠금을 구현해야합니다.

관련 문제