ÃÖ±Ù¹®¼¼öÁ¤ÀÏÀÚ: 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
================================================
|