* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
Window7, 2012 Server R2 64bit | |
NHibernate for Cubrid | |
.NET, Asp.NET, C# |
* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 | 재현 가능한 Source와 SQL |
관련 테이블(인덱스, 키정보 포함) 정보 | CUBRID 홈 디렉토리 아래 log 디렉토리 압축 |
-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
1. .NET 4.5 에서의 NHibernate 문제점
- 이후 처리가 불가능하여 이후 어떤점이 문제가 발생할 지 알 수 없으나 .NET 4.0 에서 정상 작동하던 코드가 4.5 에서는 오류를 발생 시킵니다.
- 샘플 Code : session.QueryOver<CODE_INOUT>().Where(t=>t.C_GRP_CD == "AUTHTYPE").List().ToList();
- 오류 메시지
could not execute query
[ SELECT this_.c_grp_cd as c1_0_0_, this_.c_comn_cd as c2_0_0_, this_.c_comn_cd_nm as c3_0_0_ FROM tb_code this_ WHERE this_.c_grp_cd = ? ]
Name:cp0 - Value:AUTHTYPE
[SQL: SELECT this_.c_grp_cd as c1_0_0_, this_.c_comn_cd as c2_0_0_, this_.c_comn_cd_nm as c3_0_0_ FROM tb_code this_ WHERE this_.c_grp_cd = ?]
- 내용 : query 로 변경 중 cp0 에 해당하는 변수를 c_grp_cd 의 조건과 매칭시켜야 하는데 해당 처리중 오류가 발생했다고 보입니다.
2. .NET 4.0 에서 Nhibernate + TransactionScope 의 동시 처리 문제점
- Nhibernate ISession 개체의 Flush() 메소드와 System.Transactions.TransactionScope 를 동시에 사용했을 경우 발생하는 문제점 입니다.
- 샘플 Code:
using (var scope = new TransactionScope())
{
ISession session = ..............................;
List<AA> test = session.QueryOver<AA>().Where(t => t.C_GRP_CD == "AUTHTYPE").List().ToList();
foreach (AA dto in test)
{
dto.C_OPT_1 = "OK_" + dto.C_OPT_1;
}
session.Flush();
throw new Exception("test");
scope.Complete();
}
- 위와 같은 코드에서, Oracle / MSSQL 과 같이 분산 트랜잭션이 지원되는(MSDTC 또는 OracleMTS)DB 에서는
session.Flush() 메소드가 실행되어도, 이후 scope.Complete() 를 실행하지 못하였기 때문에 DB 의 변경작업이
실패 합니다.
허나, 큐브리드 Hibernate 모듈을 사용하여 CUBRID DB 에 접속 했을 경우, session.Flush() 가 존재하지 않는다면
scope.Complete() 를 실행여부에 따라 트랜잭션이 정상 처리 됩니다
이 때, session.Flush() 가 먼저 실행 되었다면 scope.Complete() 의 실행 여부와 관계 없이 DB 변경 작업이 수행되고
이후 scope.Complete() 를 실행하지 못하고 오류가 발생 하더라도 DB Rollback 은 수행 되지 않습니다.
즉, session.Flush() 가 먼저 실행되면 TransactionScope 를 무시한다고 볼 수 있겠습니다.
코드에서 scope.Complete() 실행시에 오류를 발생시키지는 않지만
분산트랜잭션을 지원한다고 하는 CUBRID DB 와 TransactionScope 를 사용했을 때 예상 되는 동작이 아니게 되며
이에 대해 개발 코드의 변경이 필요 하게 되었습니다.
위 두가지 문제점 에 대한 처리 방안을 문의 드립니다.
그럼 수고 하시고 빠른 답변 부탁 드립니다..
안녕하세요. 큐브리드를 이용해주셔서 감사 합니다.
1. .NET Framework 4.0/4.5 호환성 문제 테스트 결과 문제 없는 것으로 확인 되었습니다.
아래와 같이 Nhibernate를 사용해서 demo DB의 Athlete테이블을 검색하는 경우
.NET 4.0/4.5 모두 정상 동작을 확인하였습니다.
CUBRID 9.3.6.0002 및 ADO.Net 드라이버는 9.3.0.0001을 사용했습니다.
using (var session = sessionFactory.OpenSession())
{
List<Athlete> athlete = session.QueryOver<Athlete>().Where(t => t.nation_code == "LTU").List().ToList();
Console.WriteLine(
string.Format("|{0}|{1}|{2}|{3}|{4}|",
AlignCenter(athlete[0].code.ToString(), 5),
AlignCenter(athlete[0].name, 30),
AlignCenter(athlete[0].gender, 5),
AlignCenter(athlete[0].nation_code, 5),
AlignCenter(athlete[0].athlete_event, 20))
);
}
따라서, 사용하신 소스 및 환경에 문제가 있을 수 있으니 재확인 필요 하실 것 같습니다.
2. ADO.Net 드라이버는 XA 지원하지 않습니다.