통상적으로 JNDI는 Was를 통해 쓰이는 경우가 대부분이다. 결론적으로 Web Application 에서 쓰인다고 봐야한다.

Tomcat 같은경우에는 JNDI Name 앞에 "java:/comp/env/"를 명시해주어야 하기떄문에 서버정보만 있으면 동적으로 처리가 가능하다.

그런데 고맙게도 서버정보는  ServletContext 객체안에 getServerInfo() 메소드를 통하여 얻어올수가 있다. 


1. 객체 생성

String serverInfo = request.getSession().getServletContext().getServerInfo();
JNDIConnection jndiConnection = new JNDIConnection(serverInfo);
Connection connection = jndiConnection.create("jndiName");


JNDIConnection 클래스의 생성자 쪽에 HttpServletRequest 객체를 넘겨줄수도 있다.

하지만 좋지가 않은 방법이다 Connection을 하는 쪽이 일반 JavaProject일 수도 있기때문이다.

일반 JavaProject일 경우 서블릿 jar들을 해당 프로젝트에 추가를 시켜줘야 하기때문이다.


2. 전체소스

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.sql.DataSource;


public class JNDIConnection {
	private String serverInfo;
	private Connection connection;
	
	public JNDIConnection(String serverInfo) {
		this.serverInfo = serverInfo;
	}
	
	public Connection create(String jndiName) {
		try {
			InitialContext initialContext = new InitialContext();
			DataSource dataSource = null;
			if (serverInfo.startsWith("Apache")) {
				dataSource = (DataSource) initialContext.lookup("java:/comp/env/" + jndiName);
			} else {
				dataSource = (DataSource) initialContext.lookup(jndiName);
			}
			connection = dataSource.getConnection();
		} catch (Exception e) {
			/*
			 * NamingException, SQLException catch
			 */
			e.printStackTrace();
		} 
		return connection;
	}
}


Writing...

'JAVA Platform > JAVA' 카테고리의 다른 글

[JAVA] - Swing size, preferredSize 차이점  (0) 2015.03.31
[JAVA] - File 실행하기  (0) 2015.03.22
[JAVA] - DBMS JDBC Connection  (0) 2015.02.13
[JAVA] - Properties File 읽기  (0) 2015.01.25
[JAVA] - Swing JScrollPane 스크롤  (0) 2015.01.21
블로그 이미지

행복그리고..

,

각각의 DBMS 마다 JDBC Connection URL 형식이 달라서 정리를 하였습니다.



Host : localhost

Port Number : 8080

Database Name : connectionTest


- Oracle

ClassName : oracle.jdbc.driver.OracleDriver

URL : jdbc:oracle:thin:@localhost:8080:connectionTest


- MySQL

ClassName : com.mysql.jdbc.Driver

URL : jdbc:mysql://localhost:8080/connectionTest


- SQL_Server (2005, 2008, 2012)

ClassName : com.microsoft.sqlserver.jdbc.SQLServerDriver

URL : jdbc:sqlserver:localhost:8080;databaseName=connectionTest


- SQL_Server 2000

ClassName : com.microsoft.jdbc.sqlserver.SQLServerDriver

URL : jdbc:microsoft.sqlserver:localhost:8080;databaseName=connectionTest


- Tibero

ClassName : com.tmax.tibero.jdbc.TbDriver

URL : jdbc:tibero:thin:@localhost:8080:connectionTest


- Sybase

ClassName : com.sybase.jdbc2.jdbc.SybDriver

URL : jdbc:Sybase:Tds:localhost:8080/connectionTest

'JAVA Platform > JAVA' 카테고리의 다른 글

[JAVA] - File 실행하기  (0) 2015.03.22
[JAVA] - JNDI Database Connection  (0) 2015.03.19
[JAVA] - Properties File 읽기  (0) 2015.01.25
[JAVA] - Swing JScrollPane 스크롤  (0) 2015.01.21
[JAVA] - File 최종 수정일 알기  (0) 2014.11.15
블로그 이미지

행복그리고..

,
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesFileReader {
	public static Properties readProperties(String propertiesFilePath) {
		Properties properties = new Properties();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(propertiesFilePath); 
			if (fis != null) {
				properties.load(fis);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
			} catch (IOException e) { 
				e.printStackTrace();
			}
		}
		return properties;
	}  
}


블로그 이미지

행복그리고..

,

마우스 스크롤 현재값 알아오기

@Override
public void adjustmentValueChanged(AdjustmentEvent event) {
	System.out.println("adjustmentValueChanged");
	JScrollBar vertical = scrollPane.getVerticalScrollBar();
	int currentValue = event.getValue();
	int maxValue = vertical.getMaximum() - vertical.getHeight();
	int minValue = vertical.getMinimum();
}


마우스 스크롤 방향 알기

@Override
public void mouseWheelMoved(MouseWheelEvent event) {
	int notches = event.getWheelRotation();
	if (notches < 0) {
		System.out.println("mouseWheelMoved Up");
	} else {
		System.out.println("mouseWheelMoved Down");
	}
}


마우스 스크롤 증가 설정하기

JScrollPane verticalScrollPane = new JScrollPane();
verticalScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
verticalScrollPane.getVerticalScrollBar().setUnitIncrement(16);

setUnitIncrement 값을 16으로 설정했을때 스크롤의 값은 16씩 증가됩니다.

블로그 이미지

행복그리고..

,
File file = new File("C:\\Program Files\\Java");
System.out.println(new java.util.Date(file.lastModified()));
file = new File("C:\\Program Files\\Java\\jdk1.8.0_20\\src.zip");
System.out.println(new java.util.Date(file.lastModified()));
블로그 이미지

행복그리고..

,

지정한 시간이 되면 지정되어 있는 폴더안의 파일들을 지우는 스케쥴러를 구현해 보도록 하겠습니다. 


package Scheduler;

import java.io.File;

class FileCleaner {
	public static void deleteFolder(String path) {
		File folder = new File(path);
		if (folder.isDirectory()) {
			File[] files = folder.listFiles();
			for (File file : files) {
				if (file.isDirectory()) {
					FileCleaner.deleteFolder(file.getPath());
				}
				file.delete();
			}
		} 
	}
}

FileCleaner 클래스의 deleteFolder 메소드는 해당 폴더를 지우는 작업을 합니다. 폴더일경우 다시 자기자신을 호출하여 파일들을 지웁니다. 해당경로의 폴더를 다 지울때까지 재귀적인 메소드 호출은 계속됩니다.

package Scheduler;

import java.util.TimerTask;

class FileDeleteScheduler extends TimerTask {
	private String folderPath;
		
	public void setFolderPath(String folderPath) {
		this.folderPath = folderPath;
	}
	
	public void run() {
		FileCleaner.deleteFolder(folderPath);
	}
}

FileDeleteScheduler는 해당시간이 되면 폴더안의 파일들을 삭제하는 작업을 수행합니다. 

package Scheduler;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

class Scheduler {
	private Timer timer;
	private FileDeleteScheduler fileDeleteScheduler;
	
	public Scheduler() {
		timer = new Timer();
		fileDeleteScheduler = new FileDeleteScheduler();
	}
	
	public void start() {
		fileDeleteScheduler.setFolderPath("C:\\Test");;
		
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.AM_PM, Calendar.AM);
		cal.set(Calendar.HOUR, 5);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		
		timer.scheduleAtFixedRate(fileDeleteScheduler, cal.getTime(), 1000 * 60 * 60 * 24 * 2);
	}
}

새벽 5시를 기점으로 작업이 진행되고 이틀간격으로 해당 위치의 폴더안의 파일들을 삭제하는 스케쥴러가 되겠습니다.

'JAVA Platform > JAVA' 카테고리의 다른 글

[JAVA] - Swing JScrollPane 스크롤  (0) 2015.01.21
[JAVA] - File 최종 수정일 알기  (0) 2014.11.15
[JAVA] - 배열 복사 방법  (0) 2014.11.02
[JAVA] - SQLite Connection  (0) 2014.09.21
[JAVA] - 파일(File) 무조건 생성하기  (0) 2014.09.19
블로그 이미지

행복그리고..

,
public class ArrayCopyTest {
	
	public static void main(String[] args) {

		int[] arr = {1, 2, 3, 4, 5};
		
		int[] arrClone = arr.clone();
		arrClone[0] = 6;
		System.out.println("arrClone");
		printArray(arrClone);
		
		int[] arrCopy = new int[arr.length];
		System.arraycopy(arr, 0, arrCopy, 0, arr.length);
		arrCopy[1] = 6;
		System.out.println("arrCopy");
		printArray(arrCopy);
	}
	
	public static void printArray(int[] arr) {
		System.out.println(java.util.Arrays.toString(arr));
	}
}

 

블로그 이미지

행복그리고..

,
블로그 이미지

행복그리고..

,
import java.io.File;

class FileLibrary {
	public static void makeFile(String path) {
		File file = new File(path);
		if (file.exists() == false) {
			new File(file.getParentFile().getPath()).mkdirs();
			try {
				file.createNewFile();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

블로그 이미지

행복그리고..

,

StringBuffer 클래스는 스레드에 안전하게 설계되어 있으므로, 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제가 되지 않는다. 하지만 StringBuilder는 단일 스레드에서의 안전성만을 보장한다. 그렇기 때문에 여러 개의 스레드에서 하나의 StringBuilder 객체를 처리하면 문제가 발생한다.


CharSequence는 인터페이스이다. 

이 인터페이스를 구현한 클래스로는 CharBuffer, String, StringBuffer, StringBuilder가 있으며 

StringBuffer나 StringBuilder로 생성한 객체를 전달할 때 사용된다.


두 클래스에는 아래 표와 같이 4개의 생성자가 있다. 필요에 따라서 생성자를 선택해 사용하기 바란다.



생성자

 StringBuffer(), StringBuilder()

아무 값도 없는 객체를 생성한다. 기본용량은 16개의 char이다. 

 StringBuffer, StringBuilder

(CharSequence seq)

CharSequence를 매개변수로 받아 그 seq 값을 갖는 객체를 생성 

 StringBuffer, StringBuilder

(capacity)

 capacity에 지정한 만큼의 용량을 갖는 객체를 생성한다.

 StringBuffer, StringBuilder

(String str)

str의 값을 갖는 객체를 생성한다. 


public class Test {
	public static void check(CharSequence cs) {
		StringBuffer sb = new StringBuffer(cs);
		System.out.println("sb.length() : " + sb.length());
	}
	
	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		sb.append("Test");
		check(sb);
	}
}

String의 길이는 정상적으로 처리된다. StringBuffer나 StringBuilder로 값을 만든 후 굳이 toString을 수행하여 필요 없는 객체를 만들어서 넘겨주기 보다는 CharSequence로 받아서 처리하는 것이 메모리 효율에 더 좋다.


[ 출저 ] - 자바 성능 튜닝 이야기 Page 45 - 49


블로그 이미지

행복그리고..

,