DATOR


토탈커맨더에서 현재 폴더 위치로 babun 쉘 바로 사용하기

토탈커맨더에서 현재 폴더 위치 기준으로 babun 쉘을 바로 띄우고 싶을 때 아래과 같이 설정하면 된다.


/bin/env CHERE_INVOKING=%P /bin/zsh.exe


babun2.png


babun 쉘에 대해서 궁금한 사람은 아래 링크를 참조하세요.

http://babun.github.io/

Leave Comments

댓글 쓰기 권한이 없습니다. 회원 가입후에 사용 가능합니다

Groovy를 이용해 멀티스레드로 SQL 실행시키기

Groovy SQL을 둘러봤으니 이번엔 Groovy SQL을 이용해서 만든 스크립트 예제를 하나 보겠습니다. 
아래 Groovy 스크립트는 많은 수의 BR검증SQL에 대해서 멀티스레드를 이용해서 동시에 여러개의 SQL을 실행시키게 만든 스크립트입니다. 데이터베이스의 성능이 받춰주는 만큼 스레드 갯수를 조절해서 실행시키면 SQL이 끝나기를 기다리는 시간을 많이 줄일 수 있습니다. 스레드 갯수는 적절히 조절할 필요가 있습니다. 짧은 코드지만 꽤 다양하게 활용이 가능한 스크립트입니다.

import java.sql.*
import groovy.sql.Sql
import java.util.concurrent.*

/**
 * BR 검증SQL을 일괄 실행시켜서 결과값을 확인하기 위한 클래스이다.
 * 
 * @author hkwee
 * @since  2012-05-03
 */
class ExecBRSql{
	def THREADS = 5
	
	def url = "jdbc:oracle:thin:@127.0.0.1:1521:ora10g"
	def userid = "scott"
	def passwd = "tiger"
	def driver = "oracle.jdbc.driver.OracleDriver"
	
	static void main(String[] args) {
		def execBrSql = new ExecBRSql()
		execBrSql.execute()
	}
	
	private void execute() {
		def sql = Sql.newInstance(url, userid, passwd, driver)
		
		def queue = new ArrayBlockingQueue<String>(1000);
		def pool = Executors.newFixedThreadPool(THREADS)
		
		def nDq = """
				select dq_no, dq_table, br_sql 
				  from n_dq 	
				 order by dq_no
					"""
		
		sql.eachRow(nDq) { row ->
			def sqlDto = new SqlDto()
			sqlDto.no = row.dq_no
			sqlDto.sql = row.br_sql
			
			queue << sqlDto
		}
		
		def item = null
		
		while (item = queue.take()) {
			pool.execute(new ExecuteStatement(item))
			
			if (queue.size() == 0)
				break
		}
		
		pool.shutdown();
	}
}

class ExecuteStatement implements Runnable {
	
	def sqlDto = null	
	def ExecuteStatement(sqlDto) {
		this.sqlDto = sqlDto
	}
	
	@Override
	public void run() {
	def url = "jdbc:oracle:thin:@127.0.0.1:1521:ora10g"
	def userid = "scott"
	def passwd = "tiger"
	def driver = "oracle.jdbc.driver.OracleDriver"

		def sql = Sql.newInstance(url, userid, passwd, driver)			
		def THREAD_NAME = Thread.currentThread().getName()			
		def insertQuery = """insert into temp_n_dq (dq_no, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10)
								values (?,?,?,?,?,?,?,?,?,?,?)"""										
		def vals = new Object[11]		
		try {
			println "[${THREAD_NAME}], ${sqlDto.no} - " + this.sqlDto.sql.replaceAll("\n", "")
			
			sql.query(sqlDto.sql) { rs ->
				vals = new Object[11]
				def meta = rs.metaData
				def isClean = true;
				vals[0] = sqlDto.no
				
				while(rs.next()){
					for (int i = 1; i <= (meta.columnCount > 10 ? 10 : meta.columnCount); i++) {
						vals[i] = rs.getString(i)
					}
					
					sql.executeUpdate(insertQuery, vals)
					isClean = false;
				}
				
				if (isClean) {
					vals[1] = "no data"
					sql.executeUpdate(insertQuery, vals)
				}
			}
		} catch (Exception e) {
			println "[${THREAD_NAME}], ${sqlDto.no} - error : ${e.message}"
			sql.executeUpdate(insertQuery, [sqlDto.no, e.message])
		} finally {
			sql.close()
			println "[${THREAD_NAME}], ${sqlDto.no} - finished .."
		}
	}
}

class SqlDto {
	def no
	def sql
}




Leave Comments

댓글 쓰기 권한이 없습니다. 회원 가입후에 사용 가능합니다

Groovy SQL을 이용한 데이터 핸들링 #3

이번에는 Groovy SQL의 DataSet에 대해서 알아보겠습니다.

DataSet은 단일 테이블 작업에 대한 작업을 간단히 처리할 수 있게 해주는 편리한 기능입니다.
GORM의 극히 일부 기능을 구현해 놓은 것 같은 느낌이 드는 기능이지만 간단히 사용하기에 편리합니다.
개인적으로는 Grails의 GORM을 그대로 Groovy에서 사용할 수 있었으면 하는 바램이 있지만
아직 공식적으로 GORM을 Groovy에서 그냥 사용할 수 있는 방법은 없습니다. 
(약간의 꼼수로 GORM을 Groovy에서 사용할 수는 있습니다.)

앞 강좌에서 사용하던 sql 객체를 가져와서 진행합니다. 

def sql = Sql.newInstance('oracle.jdbc.driver.OracleDrive', 'userid', 'passwd', 'jdbc:oracle:thin:@192.168.1.36:1521:ora11g')  

다음은 DataSet을 생성합니다.

 def emp = sql.dataSet('EMP') 

 여기서 생성한 emp 객체에 add를 하면 바로 레코드가 추가 됩니다.

 emp.add( name: '유재석', job : 'Gagman', birth : '19700101' ) 

// 복수개의 레코드를 생성할 때 
(0..100).each { i ->
 emp.add( name: i, job : "job${i}")
}
 이런 기능은 좋은데 아쉽게도 dataset에서 update / delete는 지원하지 않습니다.  
 조회할 때는 다음과 같습니다.  
emp.each {
  println it.name
} 
  간단히 emp 테이블에 있는 name 컬럼을 조회해서 출력했습니다.  
 조건을 줘야 할 필요가 있거나 할때는 findAll 이라는 메서드를 사용합니다.
def rows = emp.findAll {
  it.name = '유재석'
}
rows.each { 
  println it.name
} 

  다양한 조건이 필요할때는 

 def rows = emp.findAll { it.name = '유재석' && birth >= '19700101' } 
  rows.each {
    println it.name
  } 
 Groovy SQL에 대해서 간단히 소개를 했습니다. 기본적인 CRUD에 대해 알아봤으니
 다음엔 실제로 Groovy를 사용해서 데이터를 처리 하는 코드를 리뷰하도록 하겠습니다.


Leave Comments

댓글 쓰기 권한이 없습니다. 회원 가입후에 사용 가능합니다