http://mudchobo.tomeii.com/tt/257 에 이어서-_-;

오라클에서 해보겠습니다.
아 우선 오라클용 jdbc가 필요해요!
ojdbc6.jar 등의 jbdc ^^

걍 오라클용 dataSource로 바꿔주면 돼요-_-;

applicationContext.xml
[code]
<!-- oracle용 -->
 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="oracle.jdbc.driver.OracleDriver"
  p:url="jdbc:oracle:thin:@localhost:1521:XE"
  p:username="dbid" p:password="dbpw" />

<bean id="insertDataOracle" class="com.mudchobo.TestInsertOracle"
  p:sqlMapClient-ref="sqlMapClient"/>
[/code]
아까 그 TestInsert 인터페이스입니다.
TestInsert.java
[code]
package com.mudchobo;

import org.springframework.transaction.annotation.Transactional;

public interface TestInsert {

 @Transactional(readOnly=true, rollbackFor={Throwable.class})
 public void insertData() throws Throwable;
 
}
[/code]
저기 선언된 bean인 TestInsertOracle을 구현해봅시다.
TestInsertOracle.java
[code]
package com.mudchobo;

import java.io.IOException;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class TestInsertOracle extends SqlMapClientDaoSupport implements
  TestInsert {

 @Override
 public void insertData() throws Throwable {
   getSqlMapClientTemplate().insert("insertData");
   System.out.println("oracle에 insert성공");
   throw new IOException();
 }
}
[/code]
MySQL처럼 IOException을 임의로 발생시킵니다.
main부분을 봅시다.
TestTransaction.java
[code]
package com.mudchobo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestTransaction {

 public static void main(String[] args) {
  String[] configLocation = {"applicationContext.xml"};
  ApplicationContext context =
   new ClassPathXmlApplicationContext(configLocation);
 
  TestInsert testInsertOracle =
   (TestInsert) context.getBean("insertDataOracle");
 
  try {
   testInsertOracle.insertData();
  } catch (Throwable e) {
   System.out.println("예외발생");
  }
 }
}
[/code]
오라클에서는 readOnly로 걸어 놨는데도 불구하고 insert가 됩니다.
그리고 예외를 발생시켰기 때문에 rollbackfor 값을 Throwable로 줬기때문에 IOException이 발생했을 때 롤백하게 됩니다. 잘보면 롤백이 되어있습니다.

오라클에서 set transaction read only 라고 쿼리를 날리면 transaction을 read only로 해버릴 수 있더라구요.
뭐 그냥 그렇다구요-_-;

 
Posted by 머드초보
,
 

스프링에서 제공하는 트랜젝션을 MySQL과 Oracle에다가 적용을 해봤습니다.
제가 잘 이해를 못하는 건지 모르겠는데, Oracle에서는 ReadOnly가 안먹혀요-_-;
MySQL에서는 먹히는데....-_-; Oracle에서는 자체적으로 transaction에서 ReadOnly를 설정하는게 있더군요.
또 Oracle은 트랜젝션기반이라고 하더라구요. 암튼, 참 어렵습니다-_-;
우선 삽질한 코드입니다.
MySQL로 해보았습니다.

필요한 lib입니다.
spring.jar - 스프링할껀데 필요하겠죠?-_-;
commons-logging.jar - 스프링하려면 이눔이 있어야 돼요-_-; 위에 있는 lib와 종속돼요-_-;
ibatis-2.3.0.677.jar - ibatis로 할껍니다. 이게 db연동을 쉽게 해주니까요-_-;
mysql-connector-java-5.1.5-bin.jar - mysql connector가 필요하겠죠!

프로젝트를 만듭시다. TestTransaction이라는 프로젝트를 만듭시다.
최상위 src폴더에다가 applicationContext.xml파일을 만듭시다.

applicationContext.xml
[code]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <tx:annotation-driven />
 
 <!-- MySQL용 -->
 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="com.mysql.jdbc.Driver"
  p:url="jdbc:mysql://db주소"
  p:username="dbid" p:password="dbpw" />
 
   <!--  Transaction manager for iBATIS Daos -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
  p:dataSource-ref="dataSource" />
 
 <!-- SqlMap setup for iBATIS Database Layer -->
 <bean id="sqlMapClient"
  class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
  p:dataSource-ref="dataSource"
  p:configLocation="classpath:SqlMapConfig.xml" />
 
<bean id="insertDataMysql" class="com.mudchobo.TestInsertMysql"
  p:sqlMapClient-ref="sqlMapClient"/>
</beans>
[/code]
TestInsert라는 interface를 작성해봅시다.
TestInsert.java
[code]
package com.mudchobo;

import org.springframework.transaction.annotation.Transactional;

public interface TestInsert {

 @Transactional(readOnly=true, rollbackFor={Throwable.class})
 public void insertData() throws Throwable;
}
[/code]
인터페이스에다가 트랜젝션을 걸어도 되더라구요-_-; 구현되는 모든놈이 저 옵션으로 트랜젝션이 먹히는 듯 합니다. 근데 별로 안좋은 방법인듯한데-_-; 그냥 메소드에 거는게.....-_-; 보면 readOnly옵션에다가 Throwable예외가 발생하면 롤백합니다.

구현해봅시다.
TestInsertMysql.java
[code]
package com.mudchobo;

import java.io.IOException;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class TestInsertMysql extends SqlMapClientDaoSupport implements
  TestInsert {

 @Override
 public void insertData() throws Throwable {
   getSqlMapClientTemplate().insert("insertData");
   System.out.println("mysql에 insert성공");
   throw new IOException();
 }
}
[/code]
insert를 시키고, 강제로 IOException을 발생시켰습니다.

ibatis xml부분을 봅시다.
SqlMapConfig.xml
[code]
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
 <sqlMap resource="Insert.xml" />
</sqlMapConfig>
[/code]
Insert.xml
[code]
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Sqlmap">
    <insert id="insertData">
     insert into TESTDATA (DATA) values ('MUDCHOBO')
    </insert>
</sqlMap>
[/code]
보시면 단순 insert를 하고 있습니다-_-;

main부분입니다.
TestTransaction.java
[code]
package com.mudchobo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestTransaction {
 public static void main(String[] args) throws Throwable{
  String[] configLocation = {"applicationContext.xml"};
  ApplicationContext context =
   new ClassPathXmlApplicationContext(configLocation);
 
  TestInsert testInsertMysql =
   (TestInsert) context.getBean("insertData");
  try {
   testInsertMysql.insertData();
  } catch (Throwable e) {
   System.out.println("예외발생");
  }
}
[/code]
이걸 실행하면 트랜젝션이 readOnly이기 때문에 insert하려고 하면 에러가 나버리겠죠.
Connection is read-only. Queries leading to data modification are not allowed; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
요런 에러를 보실 수 있습니다.

Oracle은 다음 장에서-_-;
http://mudchobo.tomeii.com/tt/258 여기에 계속-_-;

 
Posted by 머드초보
,
 

반년만에 업데이트가 되었네요 ^^
이것저것 돌려본 결과.....-_-;

안돌아가는 게임 엄청 많네요 ^^
3D게임은 거의 안돌아가거나 제대로 안돌아간다고 보시면 되구요.

슈퍼마리오 브라이더스를 돌리면 화면이 계속 깜빡이구요. 프레임이 10도 안나옵니다-_-;

하지만, 이 에뮬의 장점은 NO$GBA에서 지원하지 않는 기능들을 지원합니다.
로테이션(Rotation)을 지원해서 두뇌트레이닝 같은 게임을 돌려서 할 수 있어요.
윈도우 크기 조절도 가능하구요.
물론 NO$GBA에서도 유틸리티(NDS2xGL)을 이용하면 가능하죠 ^^

결론은 그냥 NO$GBA쓰자-_-; 입니다.

사이트에서 다운 받을 수 있습니다.
에뮬레이터 연구하시는 분들 오픈소스니 보세요 ^^

http://desmume.org/download/

 
Posted by 머드초보
,
 
사실 VARCHAR2타입에서 최대값을 뽑는거 자체가 바보같은 짓이지만-_-;
VARCHAR2타입은 말그대로 CHAR타입입니다. 그래서 문자열만 들어가야합니다.
근데, 이건뭐 설계를 다 VARCHAR으로 때려박아서 SEQ부분을 VARCHAR로 해놨더군요.
그래서 시퀀스하게 숫자를 관리하겠다고 얘기를 하더군요.

SEQ칼럼이 999가 최대값이면 INSERT할 때마다 1씩 증가해서 다음에 인서트를 할 때 1000가 되게 하라-_-;
이건 Number타입으로 AutoIncrement로 할 수 있고, Number타입이면 그냥 max함수써서 하면되는데-_-;

어쨌든, VARCHAR타입을 숫자로 바꿔줘야합니다.
TO_NUMBER라는 함수가 있습니다.

"ID",CHARNUMBER,GROUPID
2,10000,1
1,9999,1
3,10001,1
요런 데이터가 있다고 칩시다.
그럼,
select max(to_number(charnumber)) from chartonumber group by groupid
요렇게 때려주시면, MAX값을 추출합니다.

저게 보니까 ASCII 순서대로 하는건지는 잘 모르겠지만, 'MUDCHOBO'라는 문자를 넣어버리면, 쿼리가 안날려집니다-_-; ORA-01722: 수치가 부적합합니다 라는 에러가 뜨네요.

자.....이제 DB설계자를 막 욕합시다-_-;

 
Posted by 머드초보
,
 
최모군이 사용하던 WINM같은 것을 우연히 보게 되었습니다.
그래서 찾아보니 NexusFile이라는 것이더군요.
설치를 해보니 최근까지 업데이트가 되는 걸 보니 계속 만들어지고 있었던 것 같습니다.
예전 DOS용 MDIR용 스킨을 그대로 사용하고, 기능도 있을 껀 다있네요.
(최모군-_-; 이렇게 좋은걸 혼자만 알고 있다니-_-;)

어쨌든, 초딩 때부터 사용해온 M을 버리게 되었습니다-_-; 근데 뭐 저 놈도 뭐 M계열인 듯 하네요 ^^
죽어도 탐색기는 익숙해지지가 않아요-_-;( 빌게이츠가 탐이라는 놈을 욕하려고 만든.....탐 색기....-_-;)

넥서스파일에서는 화면이 듀얼로 구성이 되어있군요. WINM에서도 되긴 됐던 것 같은데...-_-; 어쨌든 듀얼로 사용하니 굉장히 좋군요. 여기있는 파일을 다른 쪽에 복사를 하려면, WINM에서는 폴더 트리로 들어가서 디렉토리 찾아가면서 하고 그랬는데, 그렇게 하면 안좋은 점이 디렉토리가 스캔이 안되어 있으면 스캔을 다시 해야해서-_-;

WINM에서는 Ctrl + X(잘라내기) 한다음에 Ctrl + V(붙여넣기)가 안먹히는데, 이건 되는군요 ^^
NexusFile에서 좀 불편한게 있다면, 컨트롤+E누르면 압축이 풀리는데......아.....-_-; 지금 해보니까 폴더 선택하는게 있군요 ㅠㅠ F를 누르면 폴더 선택하는거 나오네 ^^ 오....찾아보니 Alt + Q를 누르면 자동으로 경로도 만들어서 압축을 풀어주네요 ㅠㅠ 완전 좋네 ㅠ 난 그동안 왜 좋은 걸 몰랐지-_-;

불편한 점 또한가지가....듀얼모니터를 사용하면 마지막으로 종료한 모니터를 기억하지 못합니다.
오른쪽 모니터에 데려다 놓고 종료한다음에 다시 실행하면, 왼쪽 모니터에 여전히 나오네요 ^^

어쨌든, 강추 유틸리티입니다 ^^
자료 링크입니다.

http://www.xiles.net/index.html?page=programs
오른쪽에 보면 Download가 있습니다. 최신버전이 지금은 NexusFile V Beta7 이네요
영문 사이트가 나와서 만든사람이 외국사람인 줄 알았는데 우리나라 사람인 듯 하네요 ^^
 
Posted by 머드초보
,