어느 날 서버의 웹페이지가 열리지 않아 아래와 같은 오류가 자주 보고되었습니다.
2007-3-18 1:08:26 org.apache.tomcat.util.threads.ThreadPool logFull
심각: 모든 스레드(150)가 현재 사용 중이며 대기 중입니다. maxThreads(150)를 늘리거나 서블릿 상태를 확인하세요.
제가 옳다고 생각하는 답변은 다음과 같습니다.
1. 귀하의 리소스 중 일부가 릴리스되지 않았으며 백로그로 인해 중단된 것 같습니다.
2. 커넥션 풀 문제
3. 서버측 요청에 응답하는 스레드의 처리 시간이 길어서 발생하는 문제입니다
.
당시 웹사이트를 이용하는 사람은 2명뿐이었기 때문에 150개의 동시 스레드가 온라인에 올라오는 것은 불가능했습니다. 따라서 데이터베이스 문제가 아니어야 합니다.
오류 메시지로 판단하면 연결 풀을 부당하게 사용했거나 연결 풀이 전혀 설정되지 않았기 때문에 발생하는 것으로 보입니다. 데이터베이스와 연결되는 부분은 다음과 같이 Spring의 데이터소스인 JDBC를 이용하여 연결된다.
<콩>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- MySQL용 드라이버-->
<property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8</value></property>
<property name="username"><value>테스트</value></property>
<property name="password"><value>테스트</value></property>
</beans>
문제는 이러한 연결 관리를 담당하는 Spring의 DriverManagerDataSource에서 발생해야 합니다.
다음은 DriverManagerDataSource에 대한 설명이다.
Spring Framework의 DriverManagerDataSource
javax.sql 인터페이스 DataSource
다음을 통해 일반 기존 JDBC 드라이버를 구성하는 SmartDataSource 구현
Bean 속성을 사용하고 매번 새로운 연결을 반환합니다.
J2EE 컨테이너 외부의 테스트 또는 독립형 환경에 유용합니다.
각각의 ApplicationContext에서 DataSource 빈으로 사용하거나
간단한 JNDI 환경에서는 Connection.close() 호출이 간단하게 수행됩니다.
연결을 닫으면 모든 DataSource 인식 지속성 코드가 작동해야 합니다.
J2EE 컨테이너에서는 다음에서 제공하는 JNDI DataSource를 사용하는 것이 좋습니다.
이러한 DataSource는 DataSource 빈으로 내보낼 수 있습니다.
원활한 전환을 위해 JndiObjectFactoryBean을 통한 ApplicationContext
이 클래스와 같은 로컬 DataSource 빈이
J2EE 컨테이너 외부에 "실제" 연결 풀이 필요한 경우 고려하십시오
.
Apache의 Jakarta Commons DBCP는 전체 연결 풀입니다.
이 클래스와 동일한 기본 속성과 특정 설정을 지원하는 Bean입니다.
단지 변경만으로 이 클래스의 인스턴스를 대체하여 사용할 수 있습니다.
Bean 정의의 클래스 이름
"org.apache.commons.dbcp.BasicDataSource"
------------------------- --------- ----------
많은 자카르타 프로젝트는 관계형 데이터베이스와의 상호 작용을 지원합니다.
각 사용자에 대한 새로운 연결은 시간이 많이 걸릴 수 있습니다(종종 여러 번 연결해야 함).
초 단위), 다음과 같은 데이터베이스 트랜잭션을 수행하기 위해
밀리초 정도 소요됩니다.
동시 사용자 수를 늘릴 수 있는 공개적으로 호스팅되는 인터넷 애플리케이션
따라서 개발자는 종종 개방형 "풀"을 공유하기를 원합니다.
모든 애플리케이션의 현재 사용자 간의 연결입니다.
실제로 특정 시간에 요청을 수행하는 것은 일반적으로 매우 작습니다.
총 활성 사용자 수의 비율이며 요청 처리 중에는
데이터베이스 연결이 필요한 유일한 시간은 애플리케이션 자체입니다.
DBMS에 로그인하고 모든 사용자 계정 문제를 내부적으로 처리합니다.
이미 사용 가능한 여러 데이터베이스 연결 풀이 있습니다.
자카르타 제품 및 다른 곳에서 이 Commons 패키지는 다음과 같은 기회를 제공합니다.
효율적인 생성 및 유지에 필요한 노력을 조정합니다.
ASF 라이센스에 따른 기능이 풍부한 패키지
commons-dbcp 패키지는 commons-pool 패키지의 코드를 사용하여 다음을 제공합니다
.응용 프로그램은 commons-dbcp 구성 요소를 직접 또는 기존
구성 요소를 통해 사용할 수 있습니다.
컨테이너/지원 프레임워크의 인터페이스(예: Tomcat)
서블릿 컨테이너는 DBCP 데이터 소스를 JNDI 데이터 소스로 제공합니다(Java.
Apache Mail Enterprise Server)는 DBCP를 Avalon 프레임워크 A에 통합했습니다.
Avalon 스타일 데이터 소스는 DBCP 구현을 래핑하여 생성됩니다.
DBCP의 풀링 로직과 Avalon의 엑스칼리버 코드에서 발견되는 구성은 다음과 같습니다.
신뢰할 수 있는 통합 DataSource를 생성하는 데 필요한 것
설명을 읽은 후 연결을 설정할 때 DriverManagerDataSource가 연결이 있는 한 새 연결을 생성하고 연결 풀이 전혀 없다는 사실을 알게 되었습니다. 다음 오픈소스 커넥션 풀로 전환하는 것이 좋을 것 같습니다.
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<속성 이름="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<속성 이름="url">
<값>jdbc:hsqldb:hsql://localhost:9001</값>
</property>
<속성 이름="사용자 이름">
<value>사</value>
</property>
<속성 이름="비밀번호">
<값></값>
</property>
</bean>
테스트가 통과되고 문제가 제거됩니다. 답변을 찾을 수 있는 검색 엔진이 없으면 문제가 그렇게 빨리 해결되지 않습니다.