SIÇÁ·ÎÁ§Æ® ½Ç¹«°æÇè¹ÙÅÁ Àü¹®ÀÚ¹Ù°³¹ßÀÚ°øµ¿Ã¼    
    WASÀü¹®±â¼ú/½Ã½ºÅÛÀå¾ÖÁø´Ü/¼º´ÉÀÌ·Ð/ÄÁ¼³ÆÃ
¾ÆÀ̵ð: 
ºñ¹Ð¹øÈ£: 
[ȸ¿ø°¡ÀÔ]
¡ß Java API Tips
--------------------
- Programming Tips
- JDC Tech Tips

- Servlet/JSP
- J2EE/EJB
- XML/SOAP/UDDI/WSDL
- Jakarta POI
- JDBC
- Mobile Java
- Applet,Swing,SWT
- CORBA
- RMI
- JavaMail
- HTML/HTC/css/js
- Web ÀϹÝ

- ¼­ºí·¿¿£Áø @
(JServ,Tomcat,JRun,..)
Áú¹®Àº [¹¯°í´äÇϱâ]¶õ¿¡¸¸ ¿Ã·ÁÁÖ¼¼¿ä









ÃÖ±Ù¿¡ Å͵æÇÑ »õ·Î¿î °ÍÀÌ ÀÖ³ª¿ä? ¸Ó¸® ¼Ó¿¡ ³Ö¾î µÎ¸é ±Ý¹æ Àؾî¹ö¸®ÁÒ? ÀÛÀº °ÍÀÌ¶óµµ ±¦ÂúÀ¸´Ï À̰÷¿¡ ¿Ã·Á³õ°í ³²µé°ú °øÀ¯ÇϽÃÁö¿ä.. ¿Ã¸±¸¸ÇÑ ¸Þ´º°¡ ¾ø´Ù±¸¿ä? ¸¸µé¾î µå¸±²²¿ä.


[ÃÖ±Ù ¿Ã¶ó¿Â ±Ûº¸±â] °Ë»ö¾î:
 JavaResource | API Tips | Open Source | APM | ApplicationServer | Unix/DB/JVM/Etc | Q&A/Help
¡ß Java Resources
--------------------
- °øÁö»çÇ×
- ÃÖ±Ù IT ¼Ò½Ä
- ¼¼¹Ì³ª¼Ò½Ä
- À̺¥Æ® & ÇÁ·Î¸ð¼Ç

- Ãßõ¹®¼­(2006)
- Ãßõ¹®¼­(2003-2005)
- Ãßõ¹®¼­(±¸)

- °ü·Ã »çÀÌÆ®

- ¹¯°í´äÇϱâ @
- ¹¯°í´äÇϱâ-BACKUP @
- ±â¼ú Åä·ÐÀå @
- ÀÏ¹Ý Åä·ÐÀå @
- »çȸ Åä·ÐÀå @


- ÇÁ·ÎÁ§Æ®½Ç¹«ÄÁ¼³ÆÃ@

- ±³À°/°­ÀÇ/°­ÁÂ
- ÇÁ·ÎÁ§Æ®/¼Ö·ç¼ÇÁ¦¾È
- ±¸Àζõ
- ±¸Á÷¶õ

- Àǰ߳ª´®ÅÍ/Àâ´ã

- ÀÚ¹Ù¼­ºñ½º³ÝÀº...
¡ß Java API Tips
--------------------
- Programming Tips
- JDC Tech Tips

- Servlet/JSP
- J2EE/EJB
- XML/SOAP/UDDI/WSDL
- Jakarta POI
- JDBC
- Mobile Java
- Applet,Swing,SWT
- CORBA
- RMI
- JavaMail
- HTML/HTC/css/js
- Web ÀϹÝ

- ¼­ºí·¿¿£Áø @
(JServ,Tomcat,JRun,..)
¡ß Open Source
----------------------
- Eclipse/Plugin
- Apache Struts
- JDF Framework
  - Download / API

- Open Source Q&A
* ¿ÀǼҽº °Ô½ÃÆÇ
  ½Åû¹Þ¾Æ¿ä.
¡ß APM
----------------------
- Performance Forum
- Jennifer
  - Consulting Doc.
  - »ç¿ëÈıâ/±â´ÉÃß°¡¿äû
  - Jennifer FAQ
  - Jennifer Q&A
  - Jennifer Download
- CA/Wily
- Mercury Topaz/J2EE Diag.
- Symantec i3
- Borland Optimizeit
- Compuware Vantage
¡ßApplicationServer
-------------------- 
- ¾îÇø®ÄÉÀ̼Ǽ­¹ö

- ATG Dynamo
- BEA WebLogic
- BolandEnterpriseServer
- Evermind Orion Server
- Fujitsu Interstage
- GemStone's GemStone/J
- HP Netaction
- IBM WebSphere
- IONA iPortal
- InfronTech WebTide
- Macromedia JRun
- Marc Fleury's JBoss
- Oracle 9iAS/OAS/OSDK
- Persistence PowerTier
- SilverStream eXtend
- Sun/Netscape iPlanet
- Sybase EAServer
- TmaxSoft JEUS

- ¼­ºí·¿¿£Áø
(JServ,Tomcat,Resin,..)

- eclipse/Plugin
- Other IDE Tools
¡ßUnix/DB/JVM/Etc
--------------
- Unix/Network
- Hacking/Cracking

- DataBase
- JDBC @

- JVM/JDK Issue
- ±âŸ ÀÚ·á½Ç
¡ß Q&A/Help
--------------------
- ¹¯°í´äÇϱâ
- ¹¯°í´äÇϱâ-BACKUP
- Åä·ÐÀå
- ÇÁ·ÎÁ§Æ®½Ç¹«ÄÁ¼³ÆÃ
- Framework Q&A @
- Jennifer Q&A @

- °Ô½ÃÆÇ »ç¿ë¹ý
- ÀÚ¹Ù¼­ºñ½º³ÝÀº... @
JDBC(Java Database Connectivity)
  [±Û¸ñ·Ï /½Ã°£¼ø] [´ä±Û¾²±â] [ÇÁ¸°Æ®]   
Á¦¸ñ : Connection/Statement ÃÖ´ë µ¿½Ã Open ¼ö
±Û¾´ÀÌ: ÀÌ¿ø¿µ(javaservice) 2000/10/23 16:43:22 Á¶È¸¼ö:37064 ÁÙ¼ö:309
ÃÖ±Ù¹®¼­¼öÁ¤ÀÏÀÚ: 2001.10.31


1. JDBC·Î µ¿½Ã¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Â java.sql.Connection ¼ö

E:\temp> type DbMaxConnTest.java
import java.util.*;
import java.sql.*;
public class DbMaxConnTest
{
    public static int MAX=10000;
    public static void main(String[] args) throws Exception {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Vector conns = new Vector();
        try {
            for(int i=0 ; i< MAX; i++) {
                Connection conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521:ORA8i", 
                    "scott", "tiger");
                conns.addElement(conn);
                System.out.println((i+1) + "-th connected");
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally {
            Enumeration enum = conns.elements();
            while(enum.hasMoreElements()){
                Connection conn = (Connection)enum.nextElement();
                try { conn.close();}catch(Exception e){}
            }
        }
    }
}

E:\temp>set classpath=.;c:\jdk1.1.8\lib\classes.zip;e:\downloads\jdbc\classe
s111_01.zip

E:\temp>javac DbMaxConnTest.java

E:\temp>java DbMaxConnTest
1-th connected
2-th connected
3-th connected
......
44-th connected
45-th connected
46-th connected
47-th connected
java.sql.SQLException: ORA-00020: maximum number of processes (59) exceeded

        at java.lang.Throwable.<init>(Throwable.java:74)
        at java.lang.Exception.<init>(Exception.java:38)
        at java.sql.SQLException.<init>(SQLException.java:36)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
        at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java)
        at oracle.jdbc.ttc7.O3log.receive1st(O3log.java)
        at oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java)
        at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java)
        at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.ja
va)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java)
        at java.sql.DriverManager.getConnection(Compiled Code)
        at java.sql.DriverManager.getConnection(DriverManager.java:119)
        at DbMaxConnTest.main(Compiled Code)



1.1 Oracle

Oracle ¿¡¼­ À§¿¡¼­ ó·³ ÃÖ´ë·Î µ¿½Ã¿¡ Open ÇÒ ¼ö ÀÖ´Â  java.sql.Connection ¼ö´Â
(ÀúÀÇ NT¿ë Personal Oracle 8.1.5 ÀÇ °æ¿ì) E:\Oracle\ADMIN\ORA8i\pfile\init.ora
¿¡¼­ ¾Æ·¡ÀÇ ÆÄ¶ó¸ÞÅ͸¦ ¼öÁ¤ÇÔÀ¸·Î½á °¡´ÉÇÕ´Ï´Ù.

.........
processes = 59  # INITIAL
# processes = 50   # SMALL
# processes = 100  # MEDIUM
# processes = 200  # LARGE
.........

ÀÌ ÆÄÀÏÀº Åë»ó init<SID>.ora ÆÄÀÏÀ̶ó´Â SID ±¸¼ºÆÄÀÏ¿¡¼­ ¼öÁ¤ÇÕ´Ï´Ù.

NOTE: ¿Ö Max°ªÀº 59 Àε¥, 47±îÁö¸¸ ¿¬°áµÇ´Â °ÍÀÎÁö´Â ÀúµÎ ¸ð¸£°Ú½À´Ï´Ù. ¼öÄ¡¸¦
      ¿Ã·Áµµ ²À 12°³¾¿ÀÇ Â÷À̰¡ »ý±â´Â ±º¿ä...
      ---------------------------------------
      Á¦¸ñ  Re: JSN:Connection/Statement ÃÖ´ë µ¿½Ã Open ¼ö  
      º¸³½³¯Â¥  Mon, 23 Oct 2000 20:56:55 KST  
      º¸³½ÀÌ  "CHOULGU KANG" <cgkang@lgeds.lg.co.kr>
      ¹Þ´ÂÀÌ  "javaservice@hanmail.net" <javaservice@hanmail.net>  

      INITÆÄÀÏ¿¡ Á¤ÀÇÇØ ³õÀº DB ÇÁ·Î¼¼½º¼ö¸¦ Àüü¸¦ »ç¿ëÇÒ ¼ö ¾ø´Â ÀÌÀ¯´Â ¿À¶óŬ
      ¹é±×¶ó¿îµå ÇÁ·Î¼¼½º µîÀÌ »ç¿ëÇÏ´Â ¼ö¶§¹®ÀÔ´Ï´Ù.
      ÁÁÀº ÇÏ·ç µÇ½Ã±æ ¹Ù¶ø´Ï´Ù. °­Ã¶±¸.
      ---------------------------------------

1.2 IBM UDB DB2

´ëºÎºÐÀÇ DB°¡ ÀÌ¿Í À¯»çÇÑ ÆÄ¶ó¸ÞÅ͸¦ Á¦°øÇÒ °ÍÀÔ´Ï´Ù.
¿¹¸¦ µé¾î IBM UDB DB2 ÀÇ °æ¿ì´Â ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÀÌ ¼öÄ¡¸¦ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù.

# su - db2inst1
# db2 get dbm cfg | grep MAXAGENTS
 ±âÁ¸ ¿¡ÀÌÀüÆ®ÀÇ ÃÖ´ë ¼ö  (MAXAGENTS) = 200
# db2 update dbm cfg using maxagents <number>

# db2 get db cfg for <database_name> | grep MAXAPPLS
 ½ÇÇà ÁßÀÎ ÇÁ·Î±×·¥ÀÇ ÃÖ´ë ¼ö (MAXAPPLS) = 100
# db2 update db cfg for <database_name> using maxappls <mumber>







2. ÇϳªÀÇ Connection ¿¡¼­ µ¿½Ã¿¡ »ý¼ºµÉ ¼ö ÀÖ´Â Statement ÀÇ ¼ö

E:\temp> type DbMaxStmtTest.java
import java.util.*;
import java.sql.*;
public class DbMaxStmtTest
{
    public static int MAX=10000;
    public static void main(String[] args) throws Exception {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection(
            "jdbc:oracle:thin:@localhost:1521:ORA8i", 
            "scott", "tiger");
        Vector stmts = new Vector();
        try {
            for(int i=0 ; i< MAX; i++) {
                Statement stmt = conn.createStatement();
                stmts.addElement(stmt);
                System.out.println((i+1) + "-th statement created");
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally {
            Enumeration enum = stmts.elements();
            while(enum.hasMoreElements()){
                Statement stmt = (Statement)enum.nextElement();
                try { stmt.close();}catch(Exception e){}
            }
            try { conn.close();}catch(Exception e){}
        }
    }
}

E:\temp> javac DbMaxStmtTest.java

E:\temp> java DbMaxStmtTest
1-th statement created
2-th statement created
3-th statement created
....
48-th statement created
49-th statement created
50-th statement created
java.sql.SQLException: ORA-01000: ÃÖ´ë ¿­±â Ä¿¼­ ¼ö¸¦ ÃʰúÇß½À´Ï´Ù
                  (maximum open cursors exceeded)

        at java.lang.Throwable.<init>(Throwable.java:74)
        at java.lang.Exception.<init>(Exception.java:38)
        at java.sql.SQLException.<init>(SQLException.java:36)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
        at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java)
        at oracle.jdbc.ttc7.Oopen.receive(Compiled Code)
        at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java)
        at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java)
        at oracle.jdbc.driver.OracleConnection.createStatement(OracleConnection.
java)
        at DbMaxStmtTest.main(Compiled Code)


2.1 Oracle

ÀÌ Ã³·³, ÇÑ java.sql.Connection ¿¡¼­ µ¿½Ã¿¡ »ý¼ºÇÒ ¼ö ÀÖ´Â statement ÀÇ ¼ö´Â
OracleÀÇ °æ¿ì Oracle SID ±¸¼ºÆÄÀÏ¿¡¼­ ¾Æ·¡ÀÇ ÆÄ¶ó¸ÞÅ͸¦ Ãß°¡·Î ³Ö¾îÁÜÀ¸·Î½á
º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.

.....
# OPEN_CURSORS=50  # Default
OPEN_CURSORS=100
.....


NOTE:
Error Message: "ORA-01000: maximum open cursors exceeded" 
The number of cursors one client can open at a time on a connection is limited 
(50 is the default value). You do need to explicitly close the statement, by 
using the method stmt.close() in order to close and freeup the cursors. 

If you dont close these cursors explicitly, you will get this error eventually.
Simply increasing the "OPEN_CURSORS" limit can help you avoid the problem for 
a while, but that just hides the problem, not solve it. It is your responsibilty
to explicitly close out cursors that you no longer need. 

NOTE: 2001.10.31
 Oracle ÀÇ °æ¿ì, ÇöÀç ¿­·ÁÁø ÃÑ StatementÀÇ °³¼ö¸¦ º¸´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.
 -------------------------------------------
 select sid, count(*) cnt from v$open_cursor
 where user_name = 'username' 
 group by sid 
 order by cnt desc
 -------------------------------------------
 (µµ¿òÁֽźÐ: Á¤Çå½Ä <vblove@buttle.co.kr>)


2.2 IBM UDB DB2

IBM UDB DB2 ÀÇ °æ¿ì´Â Oracle ÀÇ "open_cursors" ¿Í °°Àº °³³äÀÇ ÆÄ¶ó¸ÞÅͰ¡
¾ø½À´Ï´Ù. ½Ã½ºÅÛÀÇ ¸Þ¸ð¸®°¡ Çã¿ëÇÏ´Â ÇÑ ³¡±îÁö Á×À» ¶§ ±îÁö »ý¼º½ÃŰ´Â
񧨄...

¾Æ·¡¿Í °°Àº Å×½ºÆ®¿¡¼­ 1463 °³ÀÇ statement ¸¦ ¸¸µé´õ´Ï, ½Ã½ºÅÛÀÌ ¹÷¹÷´À·ÁÁö°í
±Þ±â¾ß ¿¡·¯¸¦ ³»°í ¸¶´Â ±º¿ä.....
½Ã½ºÅÛÀÇ ¸Þ¸ð¸®¿¡ µû¶ó °³¼öÁ¦ÇÑÀÌ ÀÖÀ» »ÓÀÎ µí ÇÕ´Ï´Ù.

E:\temp> type Db2MaxStmtTest.java
import java.util.*;
import java.sql.*;
public class Db2MaxStmtTest
{
    public static int MAX=10000;
    public static void main(String[] args) throws Exception {
        Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
        Connection conn = DriverManager.getConnection(
           "jdbc:db2:was", "db2admin", "db2admin");
        Vector stmts = new Vector();
        try {
            for(int i=0 ; i< MAX; i++) {
                Statement stmt = conn.createStatement();
                stmts.addElement(stmt);
                System.out.println((i+1) + "-th statement created");
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally {
            Enumeration enum = stmts.elements();
            while(enum.hasMoreElements()){
                Statement stmt = (Statement)enum.nextElement();
                try { stmt.close();}catch(Exception e){}
            }
            try { conn.close();}catch(Exception e){}
        }
    }
}

E:\temp> javac Db2MaxStmtTest.java

E:\temp> java Db2MaxStmtTest
1-th statement created
2-th statement created
3-th statement created
....
1461-th statement created
1462-th statement created
1463-th statement created
COM.ibm.db2.jdbc.DB2Exception: [IBM][JDBC µå¶óÀ̹ö] CLI0601E  À¯È¿ÇÏÁö ¾ÊÀº ¸í·É
¹® ÇÚµé ¶Ç´Â ¸í·É¹®ÀÌ ´ÝÇû½À´Ï´Ù. SQLSTATE=S1000
        at java.lang.Throwable.<init>(Throwable.java:74)
        at java.lang.Exception.<init>(Exception.java:38)
        at java.sql.SQLException.<init>(SQLException.java:36)
        at COM.ibm.db2.jdbc.DB2Exception.<init>(DB2Exception.java:93)
        at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(SQLExce
ptionGenerator.java:278)
        at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(SQLExce
ptionGenerator.java:187)
        at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.check_return_code(SQLExcep
tionGenerator.java:426)
        at COM.ibm.db2.jdbc.app.DB2Statement.<init>(Compiled Code)
        at COM.ibm.db2.jdbc.app.DB2Statement.<init>(Compiled Code)
        at COM.ibm.db2.jdbc.app.DB2Connection.createStatement(Compiled Code)
        at Db2MaxStmtTest.main(Compiled Code)


À§ ¿¡·¯¸¦ Ȥ º¸½Å Àû ÀÖ³ª¿ä? ¾û¶×ÇÑ ´Ù¸¥ ºÎºÐÀ» ÀǽÉÇÏÁö ¾ÊÀ¸¼Ì´ø°¡¿ä?
¸¸¾à, ¾îÇø®ÄÉÀÌ¼Ç ¼­¹ö ÇÁ·Î¼¼½º°¡ Á¡À¯Çϰí ÀÖ´Â ¸Þ¸ð¸®»çÀÌÁî°¡ °è¼ÓÀûÀ¸·Î
Áõ°¡Çϸ鼭, ±Þ±â¾ß À§¿Í °°Àº ¿¡·¯¸¦ ³»´Â °æ¿ì¸¦ º¸½Å Àû ÀÖ³ª¿ä?

DB2 ¿¡¼­´Â Oracle ó·³ "ORA-01000: maximum open cursors exceeded" ¶ó´Â
SQLException ¸Þ¼¼Áö°¡ ¾ø½À´Ï´Ù. ¶ÇÇÑ Á¦ÇÑÀÌ ¾ø±â ¶§¹®¿¡, ¹®Á¦¸¦ ¾ß±âÇÏ¿©
½Ã½ºÅÛÀÌ ´Ù¿îµÇ±â Àü±îÁø ¾Æ¹«µµ °ü½Éµµ °¡Á®ÁÖÁö ¾Ê°í, ¼³·É ¸Þ¸ð¸® ¹®Á¦·Î
ÀÎÇØ ´Ù¿îµÇ¸é ¾û¶×ÇÑ °÷À» ÀǽÉÇÏ°Ô µË´Ï´Ù.

ÀÌÁ¦ À§ÀÇ ¿¡·¯¸Þ¼¼Áö¸¦ ¸¸³ª¸é, java.sql.Statement ¸¦ ¹Ýµå½Ã finally Àý¿¡¼­ ²À
close() Çϼ¼¿ä....


PS: ÀÌ ±ÛÀ» ÀÐÀ¸¸é¼­ "±×·¡¼­ ±×°Ô ¾î·´Ù±¸.. ½ÃÅ«µÕ..." ÇÏ°í °è½Å´Ù¸é,
    ¾ÆÁ÷ ¾Æ·¡±ÛÀ» ޵¶ÇÏÁö ¾ÊÀ¸½Å°Ô ºÐ¸íÇÕ´Ï´Ù.
    "¼­ºí·¿ + JDBC ¿¬µ¿½Ã ÄÚµù °í·Á»çÇ× -Á¦1ź-"
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968185187
    

-------------------------------------------------------  
  º» ¹®¼­´Â ÀÚÀ¯·Ó°Ô ¹èÆ÷/º¹»ç ÇÒ ¼ö ÀÖÀ¸³ª ¹Ýµå½Ã
  ÀÌ ¹®¼­ÀÇ ÀúÀÚ¿¡ ´ëÇÑ ¾ð±ÞÀ» »èÁ¦ÇÏ½Ã¸é ¾ÈµË´Ï´Ù
================================================
  ÀÚ¹Ù¼­ºñ½º³Ý ÀÌ¿ø¿µ
  E-mail: javaservice@hanmail.net
  PCS:019-310-7324
================================================
  [±Û¸ñ·Ï /½Ã°£¼ø] [´ä±Û¾²±â] [ÇÁ¸°Æ®]