public class CommonClass {
private static String msg;
static {
msg = "Hello World";
System.out.println("초기화블럭 실행됨 "+ msg);
}
public static String getMsg(){
return msg;
}
}
위와같은 클래스 초기화블럭은 동일 JVM 인스턴스 안에서 오직 한번만 실행된다. 즉, 위의 클래스가 다른 여러 JSP 에서 호출이 되더라도 클래스 초기화 블럭은 오직 한번만 실행된다는 것이다.
응용
한개의 웹사이트에서 오직 한번만 그 인스턴스가 생성되어야 할 필요가 있다면 위와같은 방법을 사용할 수 있겠다. 예를 들어, Oracle의 Connection Pool을 이용하기 위해서는 한개의 웹사이트에 한개의 OracleDataSource 객체만 존재해하 되는데, 이런 경우에 사용하면 좋을 것이다.
package test;
import java.sql.*;
import javax.sql.PooledConnection;
import oracle.jdbc.pool.OracleConnectionCacheManager;
import oracle.jdbc.pool.OracleConnectionPoolDataSource;
import oracle.jdbc.pool.OracleDataSource;
public class OracleDatasourceTest {
private static OracleDataSource ds;
static {
try{
ds = new OracleDataSource();
ds.setDriverType("thin");
ds.setServerName("localhost");
ds.setPortNumber(1521);
ds.setDatabaseName("orcl"); // sid
ds.setUser("scott");
ds.setPassword("tiger");
ds.setConnectionCachingEnabled(true);
ds.setConnectionCacheName("MyCache");
java.util.Properties sProperties = new java.util.Properties();
sProperties.setProperty("MinLimit", "1");
sProperties.setProperty("MaxLimit", "3");
sProperties.setProperty("ValidateConnection", "true"); // Validates connection before sending to client
ds.setConnectionCacheProperties(sProperties);
OracleConnectionCacheManager occm = OracleConnectionCacheManager.getConnectionCacheManagerInstance();
occm.createCache("MyCache", ds, sProperties);
}catch(Exception e){}
}// end of static block
public static OracleDataSource getDataSource(){
return ds;
}
public static void main(String[] args)throws Exception {
long start = System.currentTimeMillis();
for(int i=0;i<50;i++){
OracleDataSource ds = getDataSource();
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
String sql = "select empno, ename from emp where empno=7369";
ResultSet rs = stmt.executeQuery(sql);
int empno = 0;
String ename = null;
while(rs.next()){
empno = rs.getInt("EMPNO");
ename = rs.getString("ENAME");
}
rs.close();
stmt.close();
conn.close();
}
long end = System.currentTimeMillis();
System.out.println("경과시간:"+(end-start));
}
}