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로 해버릴 수 있더라구요.
뭐 그냥 그렇다구요-_-;
'분류 전체보기'에 해당되는 글 547건
- 2008.04.24 [SpringFramework] 트랜젝션(Transaction) MySQL과 Oracle 적용 삽질 후기2
- 2008.04.24 [SpringFramework] 트랜젝션(Transaction) MySQL과 Oracle 적용 삽질 후기1
- 2008.04.23 [NDS에뮬] 닌텐도DS에뮬 DeSmuME 0.8 released! 반년만에 0.2업데이트?-_-; 4
- 2008.04.22 [Oracle] VARCHAR2타입에서 MAX함수를 이용해 최대값 뽑아보자-_-; 1
- 2008.04.22 [유틸리티] WINM을 버리고, NexusFile V로 갈아타다! 2
스프링에서 제공하는 트랜젝션을 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 여기에 계속-_-;
반년만에 업데이트가 되었네요 ^^
이것저것 돌려본 결과.....-_-;
안돌아가는 게임 엄청 많네요 ^^
3D게임은 거의 안돌아가거나 제대로 안돌아간다고 보시면 되구요.
슈퍼마리오 브라이더스를 돌리면 화면이 계속 깜빡이구요. 프레임이 10도 안나옵니다-_-;
하지만, 이 에뮬의 장점은 NO$GBA에서 지원하지 않는 기능들을 지원합니다.
로테이션(Rotation)을 지원해서 두뇌트레이닝 같은 게임을 돌려서 할 수 있어요.
윈도우 크기 조절도 가능하구요.
물론 NO$GBA에서도 유틸리티(NDS2xGL)을 이용하면 가능하죠 ^^
결론은 그냥 NO$GBA쓰자-_-; 입니다.
사이트에서 다운 받을 수 있습니다.
에뮬레이터 연구하시는 분들 오픈소스니 보세요 ^^
http://desmume.org/download/
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설계자를 막 욕합시다-_-;
그래서 찾아보니 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 이네요
영문 사이트가 나와서 만든사람이 외국사람인 줄 알았는데 우리나라 사람인 듯 하네요 ^^