문제

약 15 가지 방법으로 구성된 Java 프로그램이 있습니다. 그리고 이러한 방법은 프로그램을 발사하는 동안 매우 자주 호출됩니다. 현재 모든 방법에서 새로운 연결을 만들고 그들에 대한 명령문을 호출하고 있습니다 (데이터베이스는 네트워크의 다른 컴퓨터에서 설정됩니다).

내가 알고 싶은 것은 다음과 같습니다. 기본 메소드에서 하나의 연결 만 생성하고 연결 객체가 필요한 모든 메소드에 인수로 전달해야합니다. 모든 방법에서 연결을 매우 자주 닫습니다.

현재 디자인과 함께 리소스를 매우 효율적으로 사용하지 않는 것으로 생각되며,이 프로그램이 미래에 많이 성장할 수 있다는 점을 고려할 때 개선의 범위가 많이 있습니다.

도움이 되었습니까?

해결책

예, 매번 새로운 연결을 만들기보다는 연결을 재사용하는 것을 고려해야합니다. 일반적인 절차는 다음과 같습니다.

  • 데이터베이스가 현명하게 처리 할 수있는 동시 연결 수에 대해 약간의 추측을하십시오 (예 : 데이터베이스 시스템에서 CPU 당 2 또는 3으로 시작하여 너무 적거나 너무 많다는 것을 알 때까지 디스크가 어떻게 의존하는지에 따라 다를 수 있습니다. -쿼리는 쿼리입니다)
  • a 수영장 이 많은 연결 중 : 본질적으로 각 방법의 시작 부분에서 "다음 무료 연결"을 요청한 다음 각 방법의 끝에서 풀로 "전달"할 수있는 클래스.
  • getFreeConnect () 메소드를 사용할 수있는 경우 무료 연결을 반환해야합니다. 다른 경우 (1) 새 제품을 만들거나 허용하기로 결정한 최대 연결 수까지 또는 최대 값이 이미 생성 된 경우 , 하나가 자유 로워지기를 기다립니다
  • 연결을 관리하기 위해 세마포어 클래스를 추천합니다. 실제로 내 웹 사이트에 짧은 기사가 있습니다. 세마포어로 리소스 풀 관리 예를 들어 당신이 당신의 목적에 적응할 수 있다고 생각합니다.

몇 가지 실질적인 고려 사항 :

  • 최적의 성능을 얻으려면 조심해야합니다 실제로 쿼리를 실행하는 데 사용하지 않는 동안 연결을 "호그"하지 마십시오.. 수영장에서 한 번 연결 한 다음 다양한 방법으로 전달하면 실수 로이 작업을 수행하지 않아야합니다.
  • 연결을 수영장으로 반환하는 것을 잊지 마십시오! (시도/드디어 여기에 친구입니다 ...)
  • 많은 시스템에서, 당신 '영원히'연결을 열 수 없습니다.: O/S는 최대 시간이 지나면 닫힙니다. 따라서 '풀에 연결 반환'방법에서는 생각해야합니다. 오랫동안 주변에 있었던 '은퇴'연결 (예 : 래퍼 객체 이와 같은 메트릭을 저장하는 데 사용할 수있는 실제 JDBC 연결 객체 주변.
  • 준비된 진술을 사용하는 것을 고려할 수 있습니다.
  • 시간이 지남에 따라 아마 필요할 것입니다 연결 풀 크기를 조정하십시오

다른 팁

연결을 통과하거나 더 나은 것이지만 jakarta 데이터베이스 연결 풀링과 같은 것을 사용할 수 있습니다.http://commons.apache.org/dbcp/

연결 풀을 사용해야합니다.

그렇게하면 연결을 요청하고 마무리 할 때 해제하고 수영장으로 반환 할 수 있습니다.

다른 스레드가 새로운 연결을 원하고 해당 스레드가 사용 중이면 새로운 스레드가 생성 될 수 있습니다. 다른 스레드가 연결을 사용하지 않으면 동일하게 재사용 할 수 있습니다.

이렇게하면 앱을 어떻게 든 관계없이 (모든 연결을 전달하지 않음) 앱을 남겨두고 여전히 리소스를 올바르게 사용할 수 있습니다.

불행히도 첫 번째 클래스 ConnectionPools는 독립형 애플리케이션 (응용 프로그램 서버의 기본값)에서 사용하기 쉽지 않습니다 (예 : SPING) 또는 좋은 프레임 워크 (예 : 최대 절전 모드)를 사용하면 사용할 수 있습니다.

그들은 스크래치에서 하나를 코딩하기가 어렵지 않습니다.

:)

이 Google 검색 하나를 사용하는 방법에 대한 자세한 내용을 찾는 데 도움이됩니다.

훑어보세요

많은 JDBC 드라이버가 연결 풀링을 수행 하므로이 경우 추가 풀링을 수행하는 이점이 거의 없습니다. JDBC 드라이버의 문서를 확인하는 것이 좋습니다.

연결 풀에 대한 또 다른 접근 방식은 다음과 같습니다

  • 동기화 된 액세스로 모든 데이터베이스 액세스에 대해 하나의 연결이 있어야합니다. 이것은 동시성을 허용하지 않지만 매우 간단합니다.
  • 연결을 ThreadLocal 변수에 저장하십시오 (InitialValue ()를 재정의하십시오. 소량의 고정 된 스레드가있는 경우 잘 작동합니다.

그렇지 않으면 연결 풀을 사용하는 것이 좋습니다.

응용 프로그램이 단일 스레드 인 또는 단일 스레드에서 모든 데이터베이스 작업을 수행하는 경우 단일 연결을 사용해도 괜찮습니다. 다른 이유에 대해 여러 연결이 필요하지 않다고 가정하면 가장 간단한 구현이 될 것입니다.

드라이버에 따라 스레드 간의 연결을 공유하는 것이 가능할 수도 있습니다. 드라이버가 스레드 안전성에 대해 거짓말을하지 않는다고 믿는다면 괜찮을 것입니다. 자세한 내용은 드라이버 문서를 참조하십시오.

일반적으로 "연결"아래의 객체는 여러 스레드에서 안전하게 사용할 수 없으므로 일반적으로 스레드간에 결과 세트, 명세서 객체 등을 공유하는 것이 좋지 않습니다. 최선의 정책은이를 생성 한 동일한 스레드에서 사용하는 것입니다. 해당 객체가 일반적으로 너무 오래 유지되지 않기 때문에 일반적으로 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top