'framework/ibatis'에 해당되는 글 3건

  1. 2014.10.24 [Mybtis] - log interceptor
  2. 2010.07.06 [ibatis] - 오류
  3. 2010.06.25 [ibatis] - resultMap 초기화 문제 1


MybatisLogInterceptor.java

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Properties;


import org.apache.commons.beanutils.PropertyUtils;

import org.apache.ibatis.executor.statement.StatementHandler;

import org.apache.ibatis.mapping.BoundSql;

import org.apache.ibatis.mapping.ParameterMapping;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

import org.apache.ibatis.session.ResultHandler;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


@Intercepts({

@Signature(type=StatementHandler.class, method="update", args={Statement.class}),

@Signature(type=StatementHandler.class, method="query", args={Statement.class, ResultHandler.class})

})

public class MybatisLogInterceptor implements Interceptor {


private static final Logger logger = LoggerFactory.getLogger("mybatis.log");

@Override

public Object intercept(Invocation invocation) throws Throwable {

StatementHandler handler = (StatementHandler)invocation.getTarget();

BoundSql boundSql = handler.getBoundSql();

        

List<Object> columnValues = getColumnValues(handler, boundSql);

String sql = getSql(boundSql.getSql(), getTypes(columnValues));

         

        logger.info("=====================================================================");

        logger.info("sql : \n{}", sql);

        logger.info("=====================================================================");

return invocation.proceed(); // 쿼리 실행

}

@Override

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}

@Override

public void setProperties(Properties properties) {

}

private List<Object> getColumnValues(StatementHandler handler, BoundSql boundSql) {

List<Object> columnValues = new ArrayList<Object>();

Object parameter = handler.getParameterHandler().getParameterObject();

List<ParameterMapping> parameterMappingList = boundSql.getParameterMappings();

for(int i = 0;i<parameterMappingList.size();i++) {

try {

if(PropertyUtils.isReadable(parameter, parameterMappingList.get(i).getProperty())) {

Object column = PropertyUtils.getProperty(parameter, parameterMappingList.get(i).getProperty());

columnValues.add(column);

} else {

if(parameter instanceof Map) {

columnValues.add( ((Map<?, ?>) parameter).get(parameterMappingList.get(i).getProperty()) );

} else {

columnValues.add(parameter);

}

}

} catch (Exception e) {

e.printStackTrace();

}

return columnValues;

}

private Object[] getTypes(List<Object> columnValues) {

Object[] object = new Object[columnValues.size()];

for(int i = 0; i < columnValues.size(); i++) {

    object[i] = columnValues.get(i);

   }

   return object;

}    

private String getSql(String sqlStr, Object[] items) {

int seq = 0;

  StringBuffer buf = new StringBuffer();

  int i;

  while ((i = sqlStr.indexOf("?")) >= 0) {

  if(seq == items.length) break; 

 

  buf.append(sqlStr.substring(0, i));

  if (items[seq] instanceof String) {

  buf.append("'" + items[seq] + "'");

  } else if (items[seq] instanceof Integer) {

  buf.append(items[seq]);

  } else if (items[seq] instanceof Long) {

  buf.append(items[seq]);

  } else if (items[seq] == null) {

  buf.append("null");

  } else {

  buf.append(items[seq]);

  }

  sqlStr = sqlStr.substring(i + "?".length());

  seq++;

  }

  buf.append(sqlStr);

  return buf.toString();

  }

}


spring.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >

        <property name="configLocation" value="classpath:/sqlmap/config/mybatis-config.xml"/>

        <property name="dataSource" ref="dataSource"/>

        <property name="plugins">

            <array>

                <bean class="xxx.xxx.interceptor.MybatisLogInterceptor"/>

            </array>

        </property>

</bean>


'framework > ibatis' 카테고리의 다른 글

[ibatis] - 오류  (0) 2010.07.06
[ibatis] - resultMap 초기화 문제  (1) 2010.06.25
Posted by 짱가쟁이
Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169869568)(ERR=12519)(ERROR_STACK=(ERROR=(CODE=12519)(EMFI=4)))

갑자기 위와 같은 오류가 발생되더라.. 뭐 특이한 점을 발견하지 못했었는데.. 커넥션을 사용하지 못한다고 하는거 보니께.. 아마 커넥션을 무쟈게 열고 닫고 하다가 일시적으로 못가져온듯 싶더라.

자.. 그러면 어떻게 해결하느냐?? maxIdle 보다 maxActive가더 크니께.. 풀에서 계속 커넥션을 생성하고 닫고 하는 문제가 발생된듯 싶음..

ora.maxActive=10
ora.maxIdle = 10

위와 같은 동일한 개수를 맞춰주니께.. 같은 문제는 발생되지 않음.

'framework > ibatis' 카테고리의 다른 글

[Mybtis] - log interceptor  (0) 2014.10.24
[ibatis] - resultMap 초기화 문제  (1) 2010.06.25
Posted by 짱가쟁이
<select id="select_excute" parameterClass="cxf.demo.dao.excute.req.TableSelectVo" resultClass="xml">
    $sql$
</select>

위 설정을 보면 select sql 문을 직접 받아서 실행한 결과를 XML로 받는 sample이다.
위 예제 처음에 한번은 제대로 동작하지만.. 쿼리를 수정해서 보내면.. 이전 ResultMap 을 물고 있는 관계로 자꾸 column을 찾을 수가 없다고 나온다. 뭐.. 내부적으로 성능을 위해서 caching을 하는거 같은데.. 중요한건 요넘 어떻게 해야 하는지 도통 찾을수가 없다.
spring SqlMapClientFactoryBean을 봐도 없고.. ibatis SqlMapClient 을 봐도 답이 안보이고.. 구글링을 해도 실력이 부족하지 않보이더라..
포기할까 하다.. "http://ibatis.apache.org/dtd/sql-map-2.dtd" 요넘을 한번 보자라는 생각이 들었다. ㅋㅋ
<!ELEMENT statement (#PCDATA | include | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST statement
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
resultMap CDATA #IMPLIED
resultClass CDATA #IMPLIED
cacheModel CDATA #IMPLIED
resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED
fetchSize CDATA #IMPLIED
xmlResultName CDATA #IMPLIED
remapResults (true|false) #IMPLIED
timeout CDATA #IMPLIED

remapResults <- 요넘 대충 봐도.. result map 로딩하는거 설정하는 놈 같아 보여서 찍었는데... 제대로 찍었다. 학교댕길때 찍을때는 그렇게 안맞더니.. 쩌ㅃ~
<select id="select_excute"  parameterClass="cxf.demo.dao.excute.req.TableSelectVo" resultClass="xml" remapResults="true">
        $sql$
</select>


빨간색 넘으로 테스트 해보면 제대로 돌아간다. 까먹지 말고.. 난중에 필히 적용하자.. 쩌ㅃ~

'framework > ibatis' 카테고리의 다른 글

[Mybtis] - log interceptor  (0) 2014.10.24
[ibatis] - 오류  (0) 2010.07.06
Posted by 짱가쟁이
이전버튼 1 이전버튼