The Jakarta Project
      The Tomcat Servlet/JSP Container

Links

Getting Started

Configuration

Administrators

Application Developers

Catalina Developers

Jasper Developers

JNDI Datasource HOW-TO

¸ñÂ÷ Table of Contents

¼Ò°³ Introduction
µ¥ÀÌŸº£À̽º Ä¿³Ø¼ÇÇ®(DBCP) ¼³Á¤ Database Connection Pool (DBCP) Configurations
Tyrex Ä¿³Ø¼Ç Ç® Tyrex Connection Pool
DBCP¸¦ »ç¿ëÇÏÁö ¾Ê´Â ¹æ¹ýµé Non DBCP Solutions
OCI Ŭ¶óÀÌ¾ðÆ®·Î Oracle8i ¿¬°á Oracle 8i with OCI client
ÀϹÝÀûÀ¸·Î ÀϾ ¼ö ÀÖ´Â ¹®Á¦ Common Problems

¼Ò°³ Introduction

JNDI Datasource ¼³Á¤Àº JNDI-Resources-HOWTO¿¡ »ó¼¼ÇÏ°Ô ³ª¿ÍÀÖÁö¸¸ tomcat-user¸ÞÀϸµ¸®½ºÆ®¿¡¼­ º¸¸é °¢°¢ÀÇ ¼³Á¤ÀÌ ´Ù¼Ò ±î´Ù·Ó´Ù°í ÇÕ´Ï´Ù.

¸¹ÀÌ ¾²ÀÌ´Â µ¥ÀÌŸº£À̽º¿¡ ´ëÇÏ¿© tomcat-user ¸ÞÀϸµ¸®½ºÆ®¿¡ ¿Ã·ÁÁø ¸î°³ÀÇ ¼³Á¤ ¿¹Á¦°¡ ¿©±â ÀÖ½À´Ï´Ù.

ÀÌµé °£´ÜÇÑ ¸Þ¸ðµéÀº mysql ¼³Á¤°ú tomcat-user¸ÞÀϸµ¸®½ºÆ®ÀÇ Çǵå¹é¿¡¼­ ³ª¿Â °ÍÀÓÀ» ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. »óȲ¿¡ µû¶ó ´Ù¸¨´Ï´Ù. ¸¸ÀÏ Á» ´õ ¸¹Àº »ç¶÷¿¡°Ô µµ¿òÀÌ µÉ ¸¸ÇÑ Å×½ºÆ®Çغ» ¼³Á¤ÀÌ Àְųª ¾î·°Ç ÀÌ ¼½¼Ç¿¡ ÁÁÀº ³»¿ëÀÌ µÉ ¸¸ÇÑ °ÍÀ̶ó¸é ¾Ë·ÁÁֽʽÿÀ.

µ¥ÀÌŸº£À̽º Ä¿³Ø¼ÇÇ®(DBCP) ¼³Á¤ Database Connection Pool (DBCP) Configurations

DBCP´Â JDBC 2.0À» Áö¿øÇÕ´Ï´Ù. JVM 1.4¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡¼­´Â DBCP´Â JDBC 3.0À» Áö¿øÇÒ °ÍÀÔ´Ï´Ù. JVM 1.4¿¡¼­ DBCP¿Í JDBC 3.0ÀÇ Æ¯Â¡À» »ç¿ëÇØº¸¾ÒÀ¸¸é ¾Ë·ÁÁֽʽÿÀ.

¼³Á¤¸Å°³º¯¼ö ¸ðµÎ¸¦ º¸·Á¸é DBCP Javadocs¿¡¼­ BasicDataSource Ŭ·¡½º¸¦ º¸½Ê½Ã¿À.

¼³Ä¡

DBCP´Â Jakarta-Commons µ¥ÀÌŸº£À̽º Ä¿³Ø¼Ç Ç®À» »ç¿ëÇϴµ¥ ±×°ÍÀº ¿©·¯°³ÀÇ Jakarta-Commons ÄÄÆ÷³ÍÆ®µé¿¡ ÀÇÁ¸ÇÕ´Ï´Ù.

  • Jakarta-Commons DBCP 1.0
  • Jakarta-Commons Collections 2.0
  • Jakarta-Commons Pool 1.0
ÀÌ jar ÆÄÀϵéÀº JDBC µå¶óÀ̹ö jar ÆÄÀϰú ÇÔ²² $CATALINA_HOME/common/lib¿¡ ¼³Ä¡ÇÏ¿©¾ß ÇÕ´Ï´Ù.
ÁÖÀÇ:½áµå ÆÄƼ µå¶óÀ̹ö´Â zip ÆÄÀÏÀÌ ¾Æ´Ñ jar ÆÄÀÏÀ̾î¾ß Çϸç TomcatÀº $CATALINA_HOME/common/lib/*.jar¸¸À» Ŭ·¡½ºÆÐ½º¿¡ Ãß°¡ÇÕ´Ï´Ù.
ÁÖÀÇ: ÀÌ jar ÆÄÀϵéÀ» WEB-INF/lib, $JAVA_HOME/jre/lib/ext³ª ´Ù¸¥ °÷¿¡ ¼³Ä¡ÇÏÁö ¸¶½Ê½Ã¿À. $CATALINA_HOME/common/lib ¿Ü¿¡ ´Ù¸¥ À§Ä¡¿¡ ¼³Ä¡ÇßÀ»¶§ ¹®Á¦°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù.

µ¥ÀÌŸº£À̽º Ä¿³Ø¼Ç Ç®ÀÌ »õ´Â °ÍÀ» ¸·´Â ¹æ¹ý

µ¥ÀÌŸº£À̽º Ä¿³Ø¼Ç Ç®Àº µ¥ÀÌŸº£½ºÀÇ Ä¿³Ø¼ÇµéÀÇ Ç®À» ¸¸µé°í °ü¸®ÇÕ´Ï´Ù. ÀÌ¹Ì ÀÖ´Â Ä¿³Ø¼ÇÀ» Àç»ýÇÏ¿© Àç»ç¿ëÇÏ´Â °ÍÀº »õ Ä¿³Ø¼ÇÀ» °¡Á®¿À´Â °Íº¸´Ù È¿À²ÀûÀÔ´Ï´Ù.

Ä¿³Ø¼Ç Ç®¸µ¿¡´Â ÇѰ¡Áö ¹®Á¦°¡ ÀÖ½À´Ï´Ù. À¥ ¾ÖÇø®ÄÉÀ̼ÇÀº ¸í½ÃÀûÀ¸·Î ResultSet, Statement, ConnectionÀ» ´Ý¾Æ¾ß ÇÕ´Ï´Ù. À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ À̵é ÀÚ¿øµéÀ» ´ÝÁö ¸øÇÏ°Ô µÇ¸é ´Ù½Ã Àç»ç¿ëÇÒ ¼ö°¡ ¾øÀ¸¸ç µ¥ÀÌŸº£À̽º Ä¿³Ø¼Ç Ç® "±¸¸Û"ÀÌ »ý±é´Ï´Ù. À̰ÍÀº °á±¹ À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ´õ ÀÌ»ó ¾µ ¼ö ÀÖ´Â µ¥ÀÌŸº£À̽º Ä¿³Ø¼ÇÀÌ ¾øÀ» ¶§ Ä¿³Ø¼Ç ¿¡·¯¸¦ ³»°Ô µÉ °ÍÀÔ´Ï´Ù.

ÀÌ¿¡ ´ëÇÑ ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù. Jakarta-Commons DBCP´Â ÀÌ·¸°Ô ¹ö·ÁÁø Ä¿³Ø¼ÇÀ» ÃßôÇÏ°í º¹±¸Çϵµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. º¹±¸ÇÒ »Ó¸¸ ¾Æ´Ï¶ó À̵é ÀÚ¿øµéÀ» ¿­°í¼­´Â ´ÝÁö ¾Ê¾Ò´ø Äڵ带 ã¾Æ ÃßÀû °á°ú¸¦ ¸¸µé¾î³»±âµµ ÇÕ´Ï´Ù.

¹ö·ÁÁø Ä¿³Ø¼ÇÀÌ Á¦°ÅµÇ°í Àç»ýµÇµµ·Ï DBCP DataSource¸¦ ¼³Á¤Çϱâ À§ÇØ DBCP DataSource ResourceÀÇ ResourceParams¿¡ ¾Æ·¡ ¸Å°³º¯¼ö¸¦ Ãß°¡ÇÏ¸é µË´Ï´Ù. :

            <parameter>
              <name>removeAbandoned</name>
              <value>true</value>
            </parameter>
»ç¿ëÇÒ ¼ö ÀÖ´Â Ä¿³Ø¼ÇÀÌ ºÎÁ·ÇØÁø´Ù¸é DBCP´Â ¹ö·ÁÁø Ä¿³Ø¼ÇÀ» ã¾Æ º¹±¸Çϰí Àç»ýÇÕ´Ï´Ù. µðÆúÆ®´Â false·Î µÇ¾î ÀÖ½À´Ï´Ù.

Ä¿³Ø¼ÇÀÌ ¹ö·ÁÁ³´Ù°í °£ÁֵDZâ Àü¿¡ »ç¿ëµÇÁö ¾ÊÀº ½Ã°£(ÃÊ)¸¦ ¼³Á¤Çϱâ À§ÇØ removeAbandonedTimeout¸¦ ¼³Á¤ÇϽʽÿÀ.

            <parameter>
              <name>removeAbandonedTimeout</name>
              <value>60</value>
            </parameter>
¹ö·ÁÁø Ä¿³Ø¼ÇÀ» Á¦°ÅÇϴµ¥ ±âº»ÀûÀ¸·Î Á¤ÇØÁø ŸÀӾƿô ½Ã°£Àº 300ÃÊÀÔ´Ï´Ù.

¸¸ÀÏ Ä¿³Ø¼Ç ÀÚ¿øÀ» ³¶ºñÇÑ ÄÚµå À§Ä¡ÀÇ ·Î±×¸¦ ³²±â·Á°í ÇÑ´Ù¸é logAbandoned ÆÐ·¯¹ÌÅ͸¦ true·Î ÇÒ ¼ö ÀÖ½À´Ï´Ù.

            <parameter>
              <name>logAbandoned</name>
              <value>true</value>
            </parameter>
±âº»Àº false·Î µÇ¾î ÀÖ½À´Ï´Ù.

MySQL DBCP »ç¿ë¿¹

0. ¼Ò°³

MySQL°ú mm.mysql JDBC µå¶óÀ̹ö°¡ Àß ¿¬µ¿µÈ´Ù°í º¸°íµÈ ¹öÀüÀº ´ÙÀ½°ú °°½À´Ï´Ù.

  • MySQL 3.23.47, MySQL 3.23.47 using InnoDB, MySQL 4.0.1alpha
  • mm.mysql 2.0.14 (JDBC Driver)
»õ·Î MySQL mm.mysql 3.0 driver¸¦ Å×½ºÆ®ÇØºÃ´Ù¸é ¾Ë·ÁÁֽñ⠹ٶø´Ï´Ù.

1. MySQL ¼³Á¤

´Þ¸®ÇÏ¸é ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼öµµ ÀÖÀ¸¹Ç·Î ÀÌ Áö½Ã¸¦ ¹Ýµå½Ã µû¸£½Ê½Ã¿À.

test À¯Àú, »õ µ¥ÀÌŸº£À̽º, Å×½ºÆ® Å×À̺í Çϳª¸¦ ¸¸µå½Ê½Ã¿À. mySQL À¯Àú´Â ÇÒ´çµÈ ÆÐ½º¿öµå°¡ ÀÖ¾î¾ßÇÕ´Ï´Ù. ºñ¾îÀÖ´Â ÆÐ½º¿öµå¸¦ °¡Áö°í¼­´Â µå¶óÀ̹ö°¡ ¿¬°á¿¡ ½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù.

mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost 
    ->   IDENTIFIED BY 'javadude' WITH GRANT OPTION;
mysql> create database javatest;
mysql> use javatest;
mysql> create table testdata (
    ->   id int not null auto_increment primary key,
    ->   foo varchar(25), 
    ->   bar int);
ÁÖÀÇ: À§ÀÇ À¯Àú´Â Å×½ºÆ®°¡ ³¡³ª¸é Á¦°ÅµÇ¾î¾ß ÇÕ´Ï´Ù.

´ÙÀ½À¸·Î testdata Å×ÀÌºí¿¡ Å×½ºÆ® µ¥ÀÌŸ¸¦ ³ÖÀ¸½Ê½Ã¿À.

mysql> insert into testdata values(null, 'hello', 12345);
Query OK, 1 row affected (0.00 sec)

mysql> select * from testdata;
+----+-------+-------+
| ID | FOO   | BAR   |
+----+-------+-------+
|  1 | hello | 12345 |
+----+-------+-------+
1 row in set (0.00 sec)

mysql>

2. server.xml ¼³Á¤

$CATALINA_HOME/conf/server.xml¿¡ ¸®¼Ò½º ¼±¾ðÀ» Ãß°¡ÇÏ¿© Tomcat¿¡¼­ÀÇ JNDI µ¥ÀÌŸ¼Ò½º¸¦ ¼³Á¤ÇϽʽÿÀ.

À̰ÍÀ» examples ÄÁÅØ½ºÆ®ÀÇ </Context>¿Í localhost Á¤ÀǸ¦ ´Ý´Â ű×ÀÎ </Host> »çÀÌ¿¡ Ãß°¡ÇϽʽÿÀ.

<Context path="/DBTest" docBase="DBTest"
        debug="5" reloadable="true" crossContext="true">

  <Logger className="org.apache.catalina.logger.FileLogger"
             prefix="localhost_DBTest_log." suffix=".txt"
             timestamp="true"/>

  <Resource name="jdbc/TestDB"
               auth="Container"
               type="javax.sql.DataSource"/>

  <ResourceParams name="jdbc/TestDB">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>

    <!-- Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to 0 for no limit.
         -->
    <parameter>
      <name>maxActive</name>
      <value>100</value>
    </parameter>

    <!-- Maximum number of idle dB connections to retain in pool.
         Set to 0 for no limit.
         -->
    <parameter>
      <name>maxIdle</name>
      <value>30</value>
    </parameter>

    <!-- Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->
    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>

    <!-- MySQL dB username and password for dB connections  -->
    <parameter>
     <name>username</name>
     <value>javauser</value>
    </parameter>
    <parameter>
     <name>password</name>
     <value>javadude</value>
    </parameter>

    <!-- Class name for mm.mysql JDBC driver -->
    <parameter>
       <name>driverClassName</name>
       <value>org.gjt.mm.mysql.Driver</value>
    </parameter>

    <!-- The JDBC connection url for connecting to your MySQL dB.
         The autoReconnect=true argument to the url makes sure that the
         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
         connection.  mysqld by default closes idle connections after 8 hours.
         -->
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost:3306/javatest?autoReconnect=true</value>
    </parameter>
  </ResourceParams>
</Context>

3. web.xml ¼³Á¤

ÀÌÁ¦ Å×½ºÆ® ¾ÖÇø®ÄÉÀ̼ǿ¡ ´ëÇÑ WEB-INF/web.xmlÀ» ¸¸µå½Ê½Ã¿À.

<?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

4. Å×½ºÆ® ÄÚµå

ÀÌÁ¦ ÀÌÈÄ¿¡ »ç¿ëÇÒ °£´ÜÇÑ test.jsp ÆÄÀÏÀ» ¸¸µå½Ê½Ã¿À.

<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>

  <%
    foo.DBTest tst = new foo.DBTest();
    tst.init();
  %>

  <h2>Results</h2>
    Foo <%= tst.getFoo() %><br/>
    Bar <%= tst.getBar() %>

  </body>
</html>

»õ·Î ¸¸µé¾îÁø µ¥ÀÌŸ¼Ò½º¿Í Ä¿³Ø¼ÇÇ®À» ½ÇÁ¦·Î »ç¿ëÇÒ Àڹ٠Ŭ·¡½º¸¦ ¸¸µå½Ê½Ã¿À. ÁÖÀÇ: ÀÌ ÄÚµå´Â ½Ç¹«¿¡¼­ ¾²ÀÏ ¸¸ÇÑ ÄÚµå´Â ¾Æ´Õ´Ï´Ù. ´ÜÁö Å×½ºÆ® ¸ñÀûÀ¸·Î¸¸ »ç¿ëµÇ´Â °ÍÀÔ´Ï´Ù. :-)

package foo;

import javax.naming.*;
import javax.sql.*;
import java.sql.*;

public class DBTest {

  String foo = "Not Connected";
  int bar = -1;
    
  public void init() {
    try{
      Context ctx = new InitialContext();
      if(ctx == null ) 
          throw new Exception("Boom - No Context");

      DataSource ds = 
            (DataSource)ctx.lookup(
               "java:comp/env/jdbc/TestDB");

      if (ds != null) {
        Connection conn = ds.getConnection();
              
        if(conn != null)  {
            foo = "Got Connection "+conn.toString();
            Statement stmt = conn.createStatement();
            ResultSet rst = 
                stmt.executeQuery(
                  "select id, foo, bar from testdata");
            if(rst.next()) {
               foo=rst.getString(2);
               bar=rst.getInt(3);
            }
            conn.close();
        }
      }
    }catch(Exception e) {
      e.printStackTrace();
    }
 }

 public String getFoo() { return foo; }
 public int getBar() { return bar;}
}

¸¶Áö¸·À¸·Î À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» $CATALINA_HOME/webapps¿¡ DBTest.war¶ó´Â À̸§ÀÇ war ÆÄÀÏÀ̳ª DBTest¶ó´Â ¼­ºê µð·ºÅ丮·Î ¹èÄ¡ÇϽʽÿÀ.

¹èÄ¡µÇ°í ³ª¸é ½ÇÁ¦·Î ½ÇÇàÀÌ µÇ´ÂÁö º¸±â À§ÇØ ºê¶ó¿ìÀú¿¡¼­ http://localhost:8080/DBTest/test.jsp¸¦ ¿­¾îº¸½Ê½Ã¿À.

¿À¶óŬ 8i

0. ¼Ò°³

±ÛÀ» ¾²´Â ÀÌ´Â ¿À¶óŬ DBA°¡ ¾Æ´Ï±â ¶§¹®¿¡ ÀÌ ¼½¼Ç¿¡ ´ëÇÑ ¾î¶² ºñÆòµµ °í¸¿°Ô ¿©±æ °ÍÀÔ´Ï´Ù. :-)

¿À¶óŬÀº ÀÏ»óÀûÀ¸·Î ¾Æ´Â °Í ¿Ü¿¡ mySQL ¼³Á¤°ú ±×´ÙÁö ´Ù¸£Áö ¾Ê½À´Ï´Ù. ¸ÕÀú ±âº»ÀûÀ¸·Î TomcatÀº $CATALINA_HOME/common/lib¿¡ ¼³Ä¡µÈ *.jar ÆÄÀϵ鸸À» ÀоîµéÀ̱⠶§¹®¿¡ classes111.zip ³ª classes12.zip ÆÄÀϵéÀº .jar È®ÀåÀÚ·Î À̸§ÀÌ ¹Ù²ð Çʿ䰡 ÀÖ½À´Ï´Ù. jar ÆÄÀÏÀº zip ÆÄÀϰú µ¿ÀÏÇϱ⠶§¹®¿¡, unzipÀ» ½ÇÇàÇÏ°í ´Ù½Ã jar·Î ¹­À» ÇÊ¿ä´Â ¾øÀ¸¸ç ´ÜÁö À̸§¸¸ ¹Ù²Ù¸é µË´Ï´Ù. ¶ÇÇÑ Tomcat 4.0ÀÇ ¸î¸î ¾ÕÀÇ ¹öÀüµéÀº JDK 1.4¿Í ÇÔ²² »ç¿ëµÇ¾úÀ» ¶§ classes12.zip ÆÄÀÏÀº ¾ÐÃàÀ» Ç®°í Ŭ·¡½º °èÃþ¿¡¼­ javax.sql.*¸¦ Á¦°ÅÇÏ°í ´Ù½Ã jar·Î ¹­Áö ¾ÊÀ¸¸é classes12.zip¸¦ ·ÎµåÇÏÁö ¸øÇÒ °ÍÀÔ´Ï´Ù.

1. server.xml ¼³Á¤

À§¿¡¼­ mysql ¼³Á¤°ú ¶È°°Àº ¹æ¹ýÀ¸·Î server.xml ÆÄÀÏ¿¡ µ¥ÀÌŸ¼Ò½º¸¦ Á¤ÀÇÇÏ¸é µË´Ï´Ù. ÇÑ ¿¹·Î mysid¶ó´Â sid¿¡ ÀÖ´Â myschema¶ó´Â ½ºÅ°¸¶¿¡ thin µå¶óÀ̹ö¸¦ »ç¿ëÇÏ¿© scott/tiger·Î ¿¬°áÇÏ´Â myoracleÀ̶ó´Â µ¥ÀÌŸ¼Ò½º¸¦ Á¤ÀÇÇØº¸°Ú½À´Ï´Ù. (ÁÖÀÇ: thin µå¶óÀ̹ö¸¦ »ç¿ëÇÒ ¶§ sid´Â tns À̸§°ú °°Àº °ÍÀÌ ¾Æ´Õ´Ï´Ù.)

OCI µå¶óÀ̹ö¸¦ »ç¿ëÇÏ·Á¸é URL ¹®ÀÚ¿­¿¡ thinÀ» oci·Î ¹Ù²Ù¾î ÁÖ¾î¾ß ÇÕ´Ï´Ù.

<Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource"/> 

<ResourceParams name="jdbc/myoracle">
  <parameter>
    <name>factory</name>
    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </parameter>
  <parameter>
    <name>driverClassName</name>
    <value>oracle.jdbc.driver.OracleDriver</value>
  </parameter>
  <parameter>
    <name>url</name>
    <value>jdbc:oracle:thin:myschema@127.0.0.1:1521:mysid</value>
  </parameter>
  <parameter>
    <name>username</name>
    <value>scott</value>
  </parameter>
  <parameter>
    <name>password</name>
    <value>tiger</value>
  </parameter>
  <parameter>
    <name>maxActive</name>
    <value>20</value>
  </parameter>
  <parameter>
    <name>maxIdle</name>
    <value>10</value>
  </parameter>
  <parameter>
    <name>maxWait</name>
    <value>-1</value>
  </parameter>
</ResourceParams>

2. web.xml ¼³Á¤

¾ÖÇø®ÄÉÀ̼ÇÀÇ web.xml ÆÄÀÏÀ» ¸¸µé¶§ ¹Ýµå½Ã DTD¿¡ Á¤ÀÇµÈ ¼ø¼­´ë·Î ¿¤¸®¸ÕÆ®¸¦ ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù.

<resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>jdbc/myoracle</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

3. ÄÚµå ¿¹Á¦

(ÇÊ¿äÇÑ DB ÀνºÅϽº¿Í Å×ÀÌºí µîÀ» ¸¸µé¾ú´Ù°í °¡Á¤Çϰí) Datasource Äڵ带 Á¶±Ý ¹Ù²Ù¾î¼­ À§ÀÇ ¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
//etc.
PostgreSQL

0. ¼Ò°³

PostgreSQL´Â ¿À¶óŬ°ú µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î ¼³Á¤ÀÌ µË´Ï´Ù. Â÷À̸¸À» ¿©±â¼­ ´Ù½Ã ¾ê±âÇϰڽÀ´Ï´Ù. ÀÌ ºÎºÐÀº ¾ÆÁ÷ Å×½ºÆ®ÇÏÁö´Â ¾Ê¾ÒÀ¸¸ç Çǵå¹éÀ» ÁÖ½Ã¸é °í¸¿°Ú½À´Ï´Ù.

1. server.xml ¼³Á¤

<Resource name="jdbc/postgres" auth="Container"
          type="javax.sql.DataSource"/> 

<ResourceParams name="jdbc/postgres">
  <parameter>
    <name>factory</name>
    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </parameter>
  <parameter>
    <name>driverClassName</name>
    <value>org.postgresql.Driver</value>
  </parameter>
  <parameter>
    <name>url</name>
    <value>jdbc:postgresql://127.0.0.1:5432/mydb</value>
  </parameter>
  <parameter>
    <name>username</name>
    <value>myuser</value>
  </parameter>
  <parameter>
    <name>password</name>
    <value>mypasswd</value>
  </parameter>
  <parameter>
    <name>maxActive</name>
    <value>20</value>
  </parameter>
  <parameter>
    <name>maxIdle</name>
    <value>10</value>
  </parameter>
  <parameter>
    <name>maxWait</name>
    <value>-1</value>
  </parameter>
</ResourceParams> 

2. web.xml ¼³Á¤

<resource-ref>
 <description>postgreSQL Datasource example</description>
 <res-ref-name>jdbc/mydb</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>
Tyrex Ä¿³Ø¼Ç Ç® Tyrex Connection Pool
¼Ò°³

Tomcat 4.1Àº Tyrex 1.0À» »ç¿ëÇÏ¿© Æ®·£Àè¼Ç °ü¸®¿Í ¸®¼Ò½º ¼³Á¤ Áö¿ø ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ´Â »ç¿ëÀÚ°¡ Ç¥ÁØ javax.transaction.UserTransaction»Ó ¾Æ´Ï¶ó JNDI ³×ÀÓ½ºÆäÀ̽º·ÎºÎÅ͵µ JTA/JCA ¸®¼Ò½º¸¦ ¾òÀ» ¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù..

ÇÊ¿äÇÑ jar ¼³Ä¡

À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÌ Tyrex¸¦ »ç¿ëÇϵµ·Ï Çϱâ À§Çؼ­ webapp¿Í TomcatÀº Tyrex jar¿Í Tyrex jar°¡ ÇÊ¿ä·Î ÇÏ´Â jar ÆÄÀϵ鿡 Á¢±ÙÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¾Æ·¡¿¡ ÇÊ¿äÇÑ jar ÆÄÀϵé°ú À̸¦ ±¸ÇÒ ¼ö ÀÖ´Â °÷ÀÇ ¸®½ºÆ®°¡ ÀÖ½À´Ï´Ù.

´ÙÀ½ jar ÆÄÀϵéÀº http://tyrex.exolab.org¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Â Tyrex ¹ÙÀ̳ʸ® ¹èÆ÷ÆÇ¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.

  • tyrex-1.0.jar
  • ots-jts_1.0.jar
  • jta_1.0.1.jar
  • xerces-J_1.4.0.jar
´ÙÀ½ µÎ jar ÆÄÀϵµ ¿ª½Ã ÇÊ¿äÇÕ´Ï´Ù.

ÀÌµé ¿©¼¸ °³ÀÇ jar ÆÄÀϵéÀº Tomcat°ú À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ÀÐÀ» ¼ö ÀÖµµ·Ï $TOMCAT_HOME/common/lib¿¡ ³Ö¾î¾ß ÇÕ´Ï´Ù.

Tyrex ¼³Á¤

Tyrex ¹®¼­(http://tyrex.exolab.org)´Â Tyrex¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾ÆÁÖ »ó¼¼ÇÏ°Ô ¼³¸íÀ» Çϰí ÀÖ½À´Ï´Ù. ÇÑ ¿¹·Î¼­ Tyrex µµ¸ÞÀÎ ¼³Á¤ XML ÆÄÀÏ¿¡ ¾²¿©Áø ¾Æ·¡ÀÇ Tyrex ¼³Á¤À» »ç¿ëÇØ º¼ °ÍÀÔ´Ï´Ù.

<domain>
  <name>myDomain</name>
  <resources>
    <dataSource>
      <name>myDatasource</name>
      <jar>/home/david/mm.mysql-2.0.14-bin.jar</jar>
      <class>org.gjt.mm.mysql.jdbc2.optional.MysqlXaDataSource</class>
      <config>
        <user>david</user>
        <password>secret</password>
        <serverName>localhost</serverName>
        <port>3306</port>
        <database>daviddb</database>
      </config>
    </dataSource>
  </resources>
</domain>

¸î °¡Áö À¯ÀÇ»çÇ×ÀÌ ÀÖ½À´Ï´Ù.

  • jar ÆÄÀÏÀÇ Àý´ë°æ·Î¸¦ ½á¾ß ÇÕ´Ï´Ù.(»ó´ë°æ·Î·Î´Â Tyrex´Â Çö µð·ºÅ丮¸¸À» ã´Âµ¥ ÀÌ´Â ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº ¾Æ´Ò °ÍÀÔ´Ï´Ù.) URLÀ» ½á³Ö¾îµµ µË´Ï´Ù.
  • config ¿¤¸®¸ÕÆ® ¾È¿¡ Æ÷ÇÔµÈ ¸ðµç ¿¤¸®¸ÕÆ®µéÀº Ç¥ÁØ ¼³Á¤ÀÚ ¸Þ¼Òµå(setter)¸¦ »ç¿ëÇÏ¿© datasource Ŭ·¡½º¿¡ ¸Å°³º¯¼ö·Î Àü´ÞµË´Ï´Ù.
  • http://tyrex.exolab.org/configuration.html¿¡¼­ Tyrex¸¦ ¼³Ä¡ÇÏ´Â ´õ ³ªÀº ¼³¸í»Ó ¾Æ´Ï¶ó ´õ ¸¹Àº ¼³Á¤ ¿É¼ÇÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ XML ¼³Á¤ ÆÄÀÏÀº TomcatÀÇ Å¬·¡½º·Î´õ°¡ getResource() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ãÀ» ¼ö ÀÖ´Â À§Ä¡¿¡ ÀÖÀ¸¸é µË´Ï´Ù. ÀÌ´Â À¥¾ÖÇø®ÄÉÀÌ¼Ç ¾Æ·¡ÀÇ WEB-INF/classes µð·ºÅ丮µµ ?IÂú´Ù´Â ¾ê±âÀÔ´Ï´Ù.

ÅèĹ ¼³Á¤

Tyrex XML ¼³Á¤ÆÄÀÏÀ» ¸¸µé¾ú´Ù¸é JNDI ³×ÀÓ½ºÆäÀ̽º¿¡ Tyrex ¸®¼Ò½º¸¦ µî·ÏÇÏ¿©¾ß ÇÕ´Ï´Ù. À̰ÍÀº TomcatÀÇ server.xml ÆÄÀÏ¿¡¼­ ÇÏ¸é µË´Ï´Ù. µÎ°¡Áö Áß¿äÇÑ ÆÐ·¯¹ÌÅͰ¡ ¾²¿©Á®¾ß Çϴµ¥ µµ¸ÞÀÎ ¼³Á¤ ÆÄÀÏ À̸§(tyrexDomainConfig)°ú »ç¿ëµÉ Tyrex µµ¸ÞÀÎ À̸§(tyrexDomainName)ÀÔ´Ï´Ù. ÀÌ´Â ´ÙÀ½°ú °°ÀÌ È¯°æ ¸Å°³º¯¼ö·Î¼­ ¼¼ÆÃÇÏ¸é µË´Ï´Ù.

<Environment name="tyrexDomainConfig" type="java.lang.String" value="domain-config.xml"/>
<Environment name="tyrexDomainName" type="java.lang.String" value="myDomain"/>

(À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ <Context> ¿¤¸®¸ÕÆ® ¾Æ·¡¿¡) ÀÌÁ¦ ¸®½º¼Ò¸¦ ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù.

<Resource name="my-datasource" auth="Container" type="tyrex.resource.Resource"/>
<ResourceParams name="my-datasource">
  <parameter>
    <name>name</name>
    <value>myDataSource</name>
  </parameter>
</ResourceParams>

¸î °¡Áö ÁöÀûÇÒ °ÍÀÌ ÀÖ½À´Ï´Ù.

  • ¸®½º¼ÒÀÇ typeÀº Tyrex¸¦ ¾î¶»°Ô ¼³Á¤ÇÏ¿´´ÂÁö¿Í »ó°ü¾øÀÌ tyrex.resource.ResourceÀ̾î¾ß ÇÕ´Ï´Ù.
  • ¿ÀÁ÷ ÇϳªÀÇ ResourceParam ÆÐ·¯¹ÌÅÍ name(Tyrex ¼³Á¤ ÆÄÀÏ¿¡ ¾²¿©Áø ¸®¼Ò½º À̸§)¸¸ÀÌ ÇÊ¿äÇÕ´Ï´Ù.
  • Tomcat/JNDI ¸®¼Ò½º¿Í Tyrex ¸®¼Ò½º °£ÀÇ Â÷À̸¦ ÁÖ¸ñÇϽʽÿÀ.(óÀ½ º¸¸é È¥µ¿ÀÌ µÉ °ÍÀÔ´Ï´Ù.)

¾ÖÇø®ÄÉÀÌ¼Ç ÀÛ¼º

Tyrex ¸®¼Ò½º¸¦ »ç¿ëÇÏ´Â °ÍÀº ÀÌÁ¦ »ó´ëÀûÀ¸·Î °£´ÜÇÒ °ÍÀÔ´Ï´Ù. µ¥ÀÌŸ¼Ò½º¸¦ ¾ò±â À§Çؼ­ ´ÜÁö JNDI¸¦ »ç¿ëÇϱ⸸ ÇϽʽÿÀ.

InitialContext initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/my-datasource");
Connection conn = ds.getConnection();
...and so on.

Tyrex´Â Ç¥ÁØ À§Ä¡¿¡¼­ÀÇ JNDI(java:comp/UserTransaction)¿¡¼­ ¾òÀ» ¼ö ÀÖ´Â javax.transaction.UserTransactionµµ Á¦°øÇϰí ÀÖ½À´Ï´Ù.

DBCP¸¦ »ç¿ëÇÏÁö ¾Ê´Â ¹æ¹ýµé Non DBCP Solutions

ÀÌ·± ¹æ¹ýµéÀº µ¥ÀÌŸº£À̽º¿¡ ¸Å¹ø Ä¿³Ø¼ÇÀ» ¿¬°áÇÏ¿© »ç¿ëÇÏ´Â °ÍÀ̰ųª(Å×½ºÆ® ¿Ü¿¡´Â ±ÇÀåÇÏÁö ¾Ê½À´Ï´Ù.) ´Ù¸¥ Ç®¸µ ±â¼úÀ» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.

OCI Ŭ¶óÀÌ¾ðÆ®·Î Oracle8i ¿¬°á Oracle 8i with OCI client
¼Ò°³

OCI Ŭ¶óÀÌ¾ðÆ®¸¦ »ç¿ëÇÏ¿© JNDI µ¥ÀÌŸ¼Ò½º¸¦ »ý¼ºÇÏ´Â °ÍÀ» ÀÚ¼¼È÷ ¼³¸íÇÏÁö´Â ¾ÊÀ¸¸ç À§ÀÇ Oracle and DBCP solution°ú °áÇÕµÉ ¼ö ÀÖ´Â ºÎºÐÀÔ´Ï´Ù.

OCI µå¶óÀ̹ö¸¦ »ç¿ëÇϱâ À§ÇÏ¿© ¸ÕÀú ¿À¶óŬ Ŭ¶óÀÌ¾ðÆ®°¡ ¼³Ä¡µÇ¾î¾ß ÇÕ´Ï´Ù. ¾¾µð¿¡¼­ Oracle8i(8.1.7)¸¦ ¼³Ä¡Çϰí otn.oracle.com¿¡¼­ Àû´çÇÑ JDBC/OCI µå¶óÀ̹ö(Oracle8i 8.1.7.1 JDBC/OCI Driver)¸¦ ´Ù¿î·ÎµåÇϽʽÿÀ..

Tomcat¿¡¼­ »ç¿ëÇϱâ À§Çؼ­ classes12.zip¸¦ classes12.jar·Î À̸§À» ¹Ù²Û ´ÙÀ½¿¡, $CATALINA_HOME/common/lib¿¡ º¹»ç¸¦ ÇϽʽÿÀ. »ç¿ëÇϰí ÀÖ´Â Tomcat°ú JDK ¹öÀü¿¡ µû¶ó¼­´Â javax.sql.* Ŭ·¡½º¸¦ »©¾ß ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

°áÇÕÇϱâ Putting it all together

$PATH³ª LD_LIBRARY_PATH¿¡ ocijdbc8.dll³ª .soÀÌ ÀÖ´ÂÁö($ORAHOME\bin¿¡ ÀÖ´Â ÆÄÀÏ) È®ÀÎÇϰí System.loadLibrary("ocijdbc8");¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¿© ³×ÀÌÆ¼ºê ¶óÀ̺귯¸®°¡ ·ÎµåµÇ´ÂÁöµµ È®ÀÎÇϽʽÿÀ.

ÀÌÁ¦ ´ÙÀ½ ¶óÀεéÀ» Æ÷ÇÔÇÑ °£´ÜÇÑ Å×½ºÆ® ¼­ºí¸´À̳ª jsp¸¦ ÀÛ¼ºÇϽʽÿÀ.

DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
conn =
DriverManager.getConnection("jdbc:oracle:oci8:@database","username","password");

¸ÕÀú UnsatisfiedLinkError°¡ ³ª¿À¸é ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ÀÖ´Ù´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.

  • JDBC Ŭ·¡½º ÆÄÀϰú ¿À¶óŬ Ŭ¶óÀÌ¾ðÆ® ¹öÀüÀÌ ¼­·Î ¸ÂÁö ¾Ê´Â °ÍÀÔ´Ï´Ù. ÀÌ´Â ÇÊ¿äÇÑ ¶óÀ̺귯¸® ÆÄÀÏÀ» ãÀ» ¼ö ¾ø´Ù´Â ¾ê±âÀÔ´Ï´Ù. ¿¹¸¦ µé¾î 8.1.5 ¿À¶óŬ Ŭ¶óÀÌ¾ðÆ® ¹öÀüÀ» °¡Áö°í¼­ 8.1.6 ¿À¶óŬ ¹öÀü¿¡ ÀÖ´Â classes12.zipÀ» »ç¿ëÇϰí ÀÖÀ» ¼öµµ ÀÖ´Â °ÍÀÔ´Ï´Ù. classesXXXs.zip ÆÄÀϰú ¿À¶óŬ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº ÀÏÄ¡ÇØ¾ß ÇÕ´Ï´Ù.
  • $PATH¿Í LD_LIBRARY_PATH ¹®Á¦
  • otn¿¡¼­ ´Ù¿î·ÎµåÇÑ µå¶óÀ̹ö´Â ÀνÄÇÏÁö ¾Ê°í $ORAHOME\jdbc\lib¿¡ ÀÖ´Â classes12.zip ÆÄÀÏÀÌ Àß ÀÛµ¿ÇÑ´Ù°í ¾Ë·ÁÁö°í ÀÖ½À´Ï´Ù.

´ÙÀ½À¸·Î ORA-06401 NETCMN: invalid driver designator ¿¡·¯¸¦ °æÇèÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

¿À¶óŬ ¹®¼­¿¡¼­´Â "·Î±×ÀÎ(¿¬°á) ¹®ÀÚ¿­ÀÌ À¯È¿ÇÏÁö ¾ÊÀº µå¶óÀ̹ö¸¦ ÁöÁ¤Çؼ­ »ý±â´Â ¿¡·¯ÀÌ¸ç ¹®ÀÚ¿­À» °íÃļ­ ´Ù½Ã ¿¬°áÀ» ½ÃµµÇ϶ó"°í µÇ¾î ÀÖ½À´Ï´Ù. µ¥ÀÌŸº£À̽º ¿¬°á ¹®ÀÚ¿­(host:port:SID ÇüÅÂ)À» ´ÙÀ½°ú °°ÀÌ ¹Ù²Ù½Ê½Ã¿À. (description=(address=(host=myhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))

TNSÀ̸§À» Á¤¸®ÇÏ´Â °ÍÀÌ Á¤¸»·Î ÇÊ¿äÇÑ °Í °°Áö´Â ¾Ê½À´Ï´Ù. ¹°·Ð Àú´Â ¿À¶óŬ DBA°¡ ¾Æ´Ï±â ¶§¹®¿¡ È®½ÇÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù.(¿ªÀÚÁÖ: ¹ÏÁö´Â ¸¶½Ê½Ã¿À.)

ÀϹÝÀûÀ¸·Î ÀϾ ¼ö ÀÖ´Â ¹®Á¦ Common Problems

µ¥ÀÌŸº£À̽º¸¦ »ç¿ëÇÏ´Â À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ °Þ°ÔµÇ´Â ÀϹÝÀûÀÎ ¹®Á¦¿Í À̸¦ ÇØ°áÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ÆÁµéÀ» ÀÌÁ¦ ¾ê±âÇϵµ·Ï ÇϰڽÀ´Ï´Ù.

°¡²û µ¥ÀÌŸº£À̽º ¿¬°áÀÌ µÇÁö ¾Ê´Â ¹®Á¦ Intermittent dB Connection Failures

TomcatÀº JVM³»¿¡¼­ ±¸µ¿ÇÕ´Ï´Ù. JVMÀº ÁÖ±âÀûÀ¸·Î ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾Ê´Â ÀÚ¹Ù °´Ã¼¸¦ Á¦°ÅÇϱâ À§ÇØ °¡ºñÁö Ä÷º¼Ç(GC)À» ½ÇÇàÇÕ´Ï´Ù. JVMÀÌ Tomcat³» ÄÚµåÀÇ GC¸¦ ½ÇÇàÇϸé TomcatÀº µ¿ÀÛÀ» ¸ØÃä´Ï´Ù. µ¥ÀÌŸº£À̽º ¿¬°á ÃÖ´ë½Ã°£ÀÌ °¡ºñÁö Ä÷º¼Ç ½Ã°£º¸´Ù ÀÛ´Ù¸é µ¥ÀÌŸº£À̽º ¿¬°á ¿¡·¯¸¦ º¸°Ô µÉ °ÍÀÔ´Ï´Ù.

Ä«ºñÁö ÄÝ·º¼ÇÀÌ ¾ó¸¶³ª ¿À·¡ °É¸®´ÂÁö¿¡ ´ëÇÑ µ¥ÀÌŸ¸¦ ¸ðÀ¸±â À§Çؼ­´Â TomcatÀÌ ½ÃÀÛµÉ ¶§ CATALINA_OPTS¿¡ -verbose:gc º¯¼ö¸¦ Ãß°¡ÇϽʽÿÀ. verbose gc ¿É¼ÇÀ̸é $CATALINA_BASE/logs/catalina.out ·Î±× ÆÄÀÏÀÌ °¡ºñÁö Ä÷º¼ÇÀÌ ¾ó¸¶³ª °É¸®´ÂÁö¸¦ Æ÷ÇÔÇÑ ¸ðµç µ¥ÀÌŸ¸¦ Æ÷ÇÔÇÒ °ÍÀÔ´Ï´Ù.

JVMÀÌ 99%·Î Àß Á¶Á¤µÇ¾úÀ» ¶§ GC´Â ÀÏÃÊ ÀÌÇϰ¡ °É¸± °ÍÀÔ´Ï´Ù. ±× ¿Ü¿¡µµ ¸î Ãʹۿ¡ °É¸®Áö ¾Ê½À´Ï´Ù. ¾ÆÁÖ µå¹°°Ô GC¿¡ 10ÃÊ ÀÌ»ó °É¸± ¼öµµ ÀÖ½À´Ï´Ù.

µ¥ÀÌŸº£À̽º ¿¬°á Ãʰú½Ã°£À» ¹Ýµå½Ã 10ÃÊ¿¡¼­ 15ÃÊ »çÀÌ·Î Á¤ÇϽʽÿÀ. DBCP¿¡¼­´Â maxWait ¸Å°³º¯¼ö¸¦ »ç¿ëÇÏ¿© ¼³Á¤ÇϽʽÿÀ.

ÀÓÀÇ ¿¬°á ´ÝÈû ¿À·ù Random Connection Closed Exceptions

À̰ÍÀº ÇÑ ¿äûÀÌ Ä¿³Ø¼ÇÇ®¿¡¼­ µðºñ ¿¬°áÀ» Çϳª °¡Á®¿Í¼­ ±×°ÍÀ» µÎ¹ø ´ÝÀ¸·Á°í ÇÒ¶§ ÀϾ ¼ö ÀÖ½À´Ï´Ù. Ä¿³Ø¼ÇÇ®À» »ç¿ëÇÒ ¶§´Â ¿¬°áÀ» ´ÝÀ¸¸é ´Ù¸¥ ¿äû¿¡¼­ Àç»ç¿ëÇϱâ À§ÇØ Ç®·Î µ¹¾Æ°¡´Â °ÍÀÌÁö Ä¿³Ø¼ÇÀ» ´Ý´Â °ÍÀÌ ¾Æ´Õ´Ï´Ù. ±×¸®°í TomcatÀº µ¿½ÃÀûÀÎ ¿äûµéÀ» ó¸®ÇÒ ´ÙÁß ½º·¹µå¸¦ »ç¿ëÇÕ´Ï´Ù. Tomcat¿¡¼­ ÀÌ·± ¿¡·¯°¡ ÀϾ ¼ö ÀÖ´Â ÀÏ·ÃÀÇ À̺¥Æ®ÀÇ ¿¹°¡ ÀÖ½À´Ï´Ù.

  ¾²·¹µå 1¿¡¼­ ½ÇÇàµÇ´Â ¿äû 1ÀÌ µðºñ ¿¬°áÀ» ¾ò½À´Ï´Ù.

  ¿äû 1ÀÌ µðºñ ¿¬°áÀ» ´Ý½À´Ï´Ù.

  JVMÀÌ ¾²·¹µå2·Î ½ÇÇà ½º·¹µå¸¦ ÀüȯÇÕ´Ï´Ù.

  ¾²·¹µå 2¿¡¼­ ½ÇÇàµÇ´Â ¿äû 2°¡ µðºñ ¿¬°á(¿äû 1ÀÌ ¸· ¹Ý³³ÇÑ °°Àº ¿¬°á)À» ¾ò½À´Ï´Ù.

  JVMÀº ½ÇÇà ¾²·¹µå¸¦ ½º·¹µå 1·Î ´Ù½Ã ÀüȯÇÕ´Ï´Ù.

  ¿äû 1Àº ¸¶Áö¸·¿¡ µðºñ ¿¬°áÀ» µÎ ¹ø ´Ý½À´Ï´Ù.

  JVMÀº ½ÇÇà ¾²·¹µå¸¦ ¶Ç ´Ù½Ã ¾²·¹µå 2·Î ÀüȯÇÕ´Ï´Ù.

  ¾²·¹µå 2ÀÇ ¿äû 2´Â µðºñ ¿¬°áÀ» »ç¿ëÇϰíÀÚ ÇÏÁö¸¸ ¿äû 1ÀÌ ÀÌ¹Ì ´Ý¾Ò±â ¶§¹®¿¡ ½ÇÆÐÇÏ°Ô µË´Ï´Ù.
ÀÌÁ¦ Ä¿³Ø¼Ç Ç®¿¡¼­ ¾òÀº µðºñ ¿¬°áÀ» »ç¿ëÇÏ´Â ÀûÀýÇÑ ÄÚµå ¿¹¸¦ º¸À̰ڽÀ´Ï´Ù.
  Connection conn = null;
  Statement stmt = null;  // Or PreparedStatement if needed
  ResultSet rs = null;
  try {
    conn = ... get connection from connection pool ...
    stmt = conn.createStatement("select ...");
    rs = stmt.executeQuery();
    ... iterate through the result set ...
    rs.close();
    rs = null;
    stmt.close();
    stmt = null;
    conn.close(); // Return to connection pool
    conn = null;  // Make sure we don't close it twice
  } catch (SQLException e) {
    ... deal with errors ...
  } finally {
    // Always make sure result sets and statements are closed,
    // and the connection is returned to the pool
    if (rs != null) {
      try { rs.close(); } catch (SQLException e) { ; }
      rs = null;
    }
    if (stmt != null) {
      try { stmt.close(); } catch (SQLException e) { ; }
      stmt = null;
    }
    if (conn != null) {
      try { conn.close(); } catch (SQLException e) { ; }
      conn = null;
    }
  }


Copyright © 1999-2002, Apache Software Foundation