Tomcat

반응형

오류 내용

Several ports (8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. 
The server may already be running in another process, or a system process may be using the port. 
To start this server you will need to stop the other process or change the port number(s).

 

주요 원인


원인 01 : 톰캣이 실행하려고 할 때 이를 무시하고, 다시 Run (톰캣 재시작)을 눌렀을 때

자세한 원인 : 톰캣을 실행 하려고 준비 중이었는데 무시하고 바로 또 Run를 할 경우 포트가 제대로 꺼지지 않았기 때문에 오류가 뜬다.
원래는 톰캣 실행이 다 끝나고 또 실행하면 겹치지않고 기존에 톰캣이 종료되고 새 프로세스를 가진 톰캣이 시작되는 게 정상이다.

 

원인 02 : 또 다른 프로그램이 8080 or 8009 등 톰캣에 필요한 포트를 점유하고 있기 때문입니다.

 

원인 03 : 이클립스(혹은 다른 IDE) 프로그램 강제종료 후 톰캣 재실행했을 때 좀비 프로세스가 남아있는 경우.

 

 

해결 (윈도우(Windows GUI))


GUI (Graphical User Interface)로 해당 프로세스 끄기

 

작업 관리자 창 실행

0.Windows 키 + R → 실행창에 taskmgr

javaw.exe 프로세스 종료
1. 작업 관리자 세부 정보 javaw.exe 작업 끝내기(강제 종료)


해결 (윈도우(Windows CLI))


CLI (Command Line Interface)로 해당 프로세스 끄기

명령 프롬프트 실행
0.Windows 키 + R 실행창에 cmd 

포트 찾기 명령어


특정 포트가 열려 있는지 확인
1.netstat -na | findstr 8009 

열려 있는 포트의 PID 확인
2.netstat -nao | findstr 8009

PID(Process IDentifier) 찾기 
3.tasklist |findstr "PID"

 

PID 프로세스 종료 (죽이기)
4.taskkill /f /pid "PID"

★ 참고 : "PID" 부분에 PID를 적으시고 명령어를 실행하면 됩니다. PID는 계속 변경됩니다.


해결 (리눅스(linux))


리눅스 (linux) 해당 프로세스 끄기


열려있는 포트 확인
1.netstat -tnlp

 

특정 포트(8080) 상태 확인
2.netstat -nap | grep 8080

 

특정 포트(8080) 종료
3.fuser -k -n tcp 8080


※ 주의 : 리눅스는 윈도우랑 다르게 PID가 아닌 port로 명령어를 실행합니다.

반응형
  1. 늅이 2021.06.07 15:17

    좋은 정보 정리 감사합니다.
    정보 얻어 갑니다

    이런 포스팅은 정말 도움이 많이 되네요

  2. 호식이 2021.08.20 09:35

    해결이 되었어요 짱!

반응형

JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는

데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API다. 

출처 : 위키백과

 

JNDI는 DB Connection을 WAS에서 제어하면서 서버에서 하나의 커넥션 풀을 가진다.

(중요하니까 본명 조 폰트)

 

이 글에서 설명하는 JNDI 예시 환경

JNDI를 설정하기전에 체크

1.자기 환경의 WAS
2.자기 환경의 JDBC 방식
3.자기 환경의 Spring framework 버전 혹은 MVC / Boot

WAS : tomcat 8.5

Spring framework MVC Project : 5.0.3

jdbc 방식 : dbcp

DB : MariaDB 10.2

 

JNDI (Java Naming and Directory Interface) 사용 이유


1. 여러 프로젝트에서 하나의 datasource를 공유해서 사용할 때
2. 실제 프로젝트는 WAS에 올라가 운영되는데
개발/소스를 잘 모르는 운영자가 이해하기 쉽게 하기 위함

3.WAS의 교체에도 신속한 대응이 가능하다.

 

 

 

1.Spring 프로젝트 내부 설정


1-1.root-context.xml 상단 내용 추가 ( jee를 쓰기 위함 )

<xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee 
                    http://www.springframework.org/schema/jee/spring-jee.xsd">

 

1-1.root-context.xml 하단 내용 추가

 

기존 JDBC 방식 (변경 전)

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mariadb.jdbc.Driver" />
      <property name="url" value="jdbc:mariadb//localhost:3306/databaseName" />
      <property name="username" value="dkanro" />
      <property name="password" value="dkanro1" />
</bean>

JDNI 방식 (변경 후)

<jee:jndi-lookup id="dbDataSource"
 jndi-name="jdbc/projectName"
 expected-type="javax.sql.DataSource" />

jndi-name : 자기가 설정하고 싶은 별칭 (하지만 이 이름이 설정 페이지와 동일해야 된다.)

 

1-2.web.xml

<resource-ref>
<description>jndiprojectName</description>
	<res-ref-name>jdbc/projectName</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
</resource-ref>

2.Tomcat 설정

$CATALINA_HOME == 톰캣이 위치한 경로

2-1.server.xml 설정하기

 

$CATALINA_HOME/conf/server.xml 내용 추가

<GlobalNamingResources>
  <Resource auth="Container" driverClassName="org.mariadb.jdbc.Driver" 
  factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" 
  name="jdbc/projectName"  
  type="javax.sql.DataSource" 
  url="jdbc:mariadb://172.10.0.10:3306/databaseName" 
  username="dkanro1" password="dkanro1"/> 
</GlobalNamingResources>

 

톰캣 안에 <GlobalNamingResources> </GlobalNamingResources> 태그는 원래 존재합니다.

직접 만드는 것이 아닙니다.

안에 내용 <Resource ~~..>만 기술하는 것입니다. 

 

 

2-2.context.xml 설정하기

 

$CATALINA_HOME/conf/context.xml 내용 추가

<Context>
   <ResourceLink name="jdbc/projectName" global="jdbc/projectName" type="javax.sql.DataSource"/>
</Context>

 

2-3.mariaDB JDBC.jar 드라이버 파일 추가

 

$CATALINA_HOME/lib 폴더에 mariadb-java-client-1.5.9.jar 파일 추가 ( 버전은 꼭 1.5.9가 아니어도 됩니다. )

mariadb-java-client-1.5.9.jar

3.Tomcat 서비스 재시작

systemctl restart tomcat (서비스 이름은 다 다릅니다.)

 

 


추가 참고사항


※ 자주 뜨는 오류 

원인 : mariadb-java-client-1.5.9.jar 파일이 $CATALINA_HOME/lib 폴더에 존재하지 않는 경우.

해결 : mariadb-java-client-1.5.9.jar를 다운받아 $CATALINA_HOME/lib에 넣은 후 서비스 재시작

The web application [] registered the JDBC driver [org.mariadb.jdbc.Driver] 
but failed to unregister it when the web application was stopped. To prevent a memory leak, 
the JDBC Driver has been forcibly unregistered.

 

※ mariadb-java-client-1.5.9.jar 드라이버 다운로드 주소

https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/1.5.9

링크 들어가셔서 상단 Files에 jar 버튼 누르시면 다운로드됩니다.

 

※ DB가 다를 경우

driverClass와 url을 변경하시면 됩니다.

//예시 Oracle일 경우
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@172.10.0.10:1521:SID"

※ JDBC 방식이 다를 경우

이 부분을 원하는 JDBC 방식 문법에 맞게 변경하면 됩니다.

<Resource auth="Container" driverClassName="org.mariadb.jdbc.Driver" 
  factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" 
  name="jdbc/projectName"  
  type="javax.sql.DataSource" 
  url="jdbc:mariadb://172.10.0.10:3306/databaseName" 
  username="dkanro1" password="dkanro1"/> 

 

반응형
  1. 낭인 2021.08.30 17:31

    기존 JDBC방식이 아니라 DBCP방식이 아닐까요?
    JDBC는 자바에서 DB접속을 위한 API로 알고 있습니다.

+ Recent posts