환영합니다. Tomcat DataSource JNDI 예제 자습서에 오신 것을 환영합니다. 지난 자습서에서는 JDBC DataSource를 살펴보고 독립형 자바 애플리케이션에서 사용하는 방법을 배웠습니다.
Tomcat DataSource JNDI
DataSource의 실제 이점은 JNDI Context와 함께 사용할 때 나타납니다. 예를 들어 서블릿 컨테이너에 배포된 웹 애플리케이션에서 연결 풀을 사용하는 경우입니다. 인기 있는 대부분의 서블릿 컨테이너는 Resource 구성 및 JNDI 컨텍스트를 통해 DataSource에 대한 내장 지원을 제공합니다. 이는 몇 줄의 구성으로 DataSource 연결 풀을 생성하고 사용하는 데 도움이 됩니다. 이 자습서는 Tomcat DataSource JNDI 구성 예제를 제공하는 것을 목표로 합니다. Apache Tomcat은 JNDI 컨텍스트에서 DataSource를 구성하는 세 가지 방법을 제공합니다.
- 애플리케이션 context.xml – DataSource를 구성하는 가장 쉬운 방법입니다. 필요한 것은 META-INF 디렉토리에 context.xml 파일뿐입니다. 컨텍스트 파일에는 Resource 요소를 정의해야 하며 컨테이너가 로드하고 구성을 처리합니다. 이 방법은 간단하지만 몇 가지 단점이 있습니다;
- 컨텍스트 파일이 WAR 파일에 번들로 포함되어 있기 때문에 작은 구성 변경마다 새 WAR를 빌드하고 배포해야 합니다. 응용 프로그램이 분산 환경에서 작동하거나 응용 프로그램을 QA, IT, PROD 등과 같은 다른 테스트 환경에 배포해야 하는 경우 동일한 문제가 발생합니다.
- DataSource는 컨테이너에 의해 응용 프로그램 사용을 위해 생성되므로 전역적으로 사용할 수 없습니다. DataSource를 여러 응용 프로그램 간에 공유할 수 없습니다.
- 동일한 이름으로 정의된 전역 DataSource (server.xml)가 있는 경우 응용 프로그램 DataSource가 무시됩니다.
- 서버 context.xml – 서버에 여러 애플리케이션이 있고 이를 통해 DataSource를 공유하려면 서버 context.xml 파일에 정의할 수 있습니다. 이 파일은
apache-tomcat/conf
디렉터리에 있습니다. 서버 context.xml 파일의 범위는 애플리케이션입니다. 따라서 100개의 연결을 갖는 DataSource 연결 풀을 정의하고 20개의 애플리케이션이 있는 경우 각 애플리케이션마다 데이터 소스가 생성됩니다. 이로 인해 데이터베이스 서버 리소스를 모두 소모하고 애플리케이션 성능에 영향을 줄 수 있습니다. - server.xml 및 context.xml – 서버.xml의
GlobalNamingResources
요소에 정의하여 전역 수준에서 DataSource를 정의할 수 있습니다. 이 접근 방식을 사용하는 경우 서버에서 실행 중인 여러 애플리케이션 간에 공통 리소스 풀을 공유하려면 context.xml 파일에서 서버 또는 애플리케이션별로ResourceLink
를 정의해야 합니다. 리소스 링크에 대해 서버 수준의 context xml 파일에 정의할지 또는 애플리케이션 수준에 정의할지는 요구 사항에 따라 달라집니다.
자바 웹 애플리케이션에서의 Tomcat DataSource JNDI 예제로 이동해 보겠습니다. 테스트 데이터 설정에 대해서는 이전 기사인 JDBC DataSource 예제를 참조하십시오.
Tomcat DataSource JNDI 구성 예제 – server.xml
tomcat server.xml 파일에 아래 코드를 추가하세요. 코드는 GlobalNamingResources
요소에 추가되어야 합니다. 또한 데이터베이스 드라이버가 tomcat lib 디렉토리에 있는지 확인하십시오. 이 경우 mysql jdbc jar 파일은 tomcat lib에 있어야 합니다.
<Resource name="jdbc/MyDB"
global="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/UserDB"
username="pankaj"
password="pankaj123"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
여기서는 이름이 jdbc/MyDB
인 JNDI 컨텍스트를 생성합니다. 이는 DataSource의 유형입니다. url, username, password 및 driverClassName 속성으로 데이터베이스 구성을 전달합니다. 연결 풀링 속성은 maxActive, maxIdle 및 minIdle 속성으로 정의됩니다.
Tomcat DataSource JNDI 리소스 링크 구성 – context.xml
서버 context.xml 파일에 아래 코드를 추가하세요.
<ResourceLink name="jdbc/MyLocalDB"
global="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource" />
리소스 링크 이름이 글로벌 링크와 다르다는 점에 유의하세요. 이 이름을 Java 프로그램에서 DataSource를 가져오려면 사용해야 합니다.
Tomcat DataSource JNDI Example
이름이 JDBCDataSourceTomcat인 동적 웹 응용 프로그램을 만들고 아래 코드가 포함된 서블릿을 만듭니다.
package com.journaldev.jdbc.datasource;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
@WebServlet("/JDBCDataSourceExample")
public class JDBCDataSourceExample extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Context ctx = null;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
con = ds.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery("select empid, name from Employee");
PrintWriter out = response.getWriter();
response.setContentType("text/html");
out.print("Employee Details
");
out.print("");
out.print("Employee ID ");
out.print("Employee Name ");
while(rs.next())
{
out.print("");
out.print("" + rs.getInt("empid") + " ");
out.print("" + rs.getString("name") + " ");
out.print(" ");
}
out.print("
");
// DB 정보를 몇 가지 출력합시다
out.print("Database Details
");
out.print("Database Product: "+con.getMetaData().getDatabaseProductName()+"
");
out.print("Database Driver: "+con.getMetaData().getDriverName());
out.print("");
}catch(NamingException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
stmt.close();
con.close();
ctx.close();
} catch (SQLException e) {
System.out.println("Exception in closing DB resources");
} catch (NamingException e) {
System.out.println("Exception in closing Context");
}
}
}
}
주의할 점은 Servlet 3 기반의 어노테이션 구성을 사용하고 있으며 Tomcat 7 이상에서 작동합니다. 낮은 버전의 Tomcat을 사용하는 경우 서블릿 코드를 수정하여 WebServlet 어노테이션을 제거하고 web.xml 파일에 구성해야 합니다. 우리가 관심을 가지는 서블릿 코드의 일부는 다음과 같습니다;
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
이것은 애플리케이션에서 사용하기 위해 정의된 JNDI 리소스를 가져오는 방법입니다. 우리는 다음과 같이도 작성할 수 있었습니다;
ctx = new InitialContext();
Context initCtx = (Context) ctx.lookup("java:/comp/env");
DataSource ds = (DataSource) initCtx.lookup("jdbc/MyLocalDB");
I am also printing some database information to check which database we are connected. Now when you will run the application, you will see following output. Let’s see how easy it is to switch the database server because we are using Tomcat DataSource. All you need is to change the Database properties. So if we have to switch to Oracle database, my Resource configuration will look like below.
<Resource name="jdbc/MyDB"
global="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"
username="hr"
password="oracle"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
그리고 서버를 다시 시작하고 응용 프로그램을 실행하면 Oracle 데이터베이스에 연결되어 아래 결과를 생성할 것입니다. 이것으로 Tomcat DataSource JNDI 구성 예제 튜토리얼이 끝났습니다. 이와 유사한 방식으로 context.xml 파일에 리소스를 정의할 수도 있습니다.
Source:
https://www.digitalocean.com/community/tutorials/tomcat-datasource-jndi-example-java