2013-02-21 3 views
1

JDBC를 사용하여 DB에 일부 데이터를 저장하기 위해 일반 Java 클래스를 호출하는 Grails 서비스 메서드가 있습니다. 다음으로, grails 서비스 메소드는 또한 같은 DB에 기록한다. 이것은 모두 동일한 트랜잭션에서 발생해야합니다.선언 JDBC 트랜잭션 (Grails 서비스)을 순수 JDBC 코드로 전파

def dataSource 

def myServiceMethod() { 
    MyJDBCClass jdbcClass = new MyJDBCClass(dataSource.getConnection()) 
    jdbcClass.savePerson(new PersonDto("Bob")) 

    Person p = Person.findByFirstName("Bob") 
    p.firstName = "John" 
    if (p.firstName == "John") { 
     throw new RuntimeException("Test rollback of Bob") 
    } 
    p.save() 
} 

myServiceMethod 현재 기본 전파 형식을 사용하고 있습니다 : PROPAGATION_REQUIRED를 (이 서비스 방법이기 때문에).

MyJDBCClass는 순수한 Java/JDBC이며 Spring의 트랜잭션 관리에 대한 의존성을 원하지 않는 별도의 JAR 파일에 있습니다. 나는 어떻게 진행해야할지 모르겠습니다.

감사합니다.

+0

MyJDBCClass에서 어떻게 연결을 사용합니까? –

+0

귀하의 의견에 대한 답변으로 Q가 업데이트되었습니다. 나는 내 질문에 대답했을지 모른다. 내가 연결을 통과하고 jdbcClass.savePerson이 커밋, 롤백 또는 어떤 방식 으로든 연결을 변경하지 않는 한 정상적으로 작동한다고 생각합니다. 이 방법이 올바른지 확인하기 만하면됩니다. – nogridbag

+0

예,'dataSource.getConnection()'은 GORM 메소드에서 사용하는 서비스 메소드와 동일한 연결입니다. –

답변

0

주석에서 언급 한 것처럼 dataSource.getConnection()을 사용하면 동적 GORM 방법에서 사용하는 연결이 동일합니다. 발생 (당신이

sql = new Sql(dataSource) 

그것은 당신의 SQL 명령은 서로 다른 연결을 사용하는 것이 가능처럼 선언하면

sql = new Sql(dataSource.getConnection()) 

:

또한 이것이 groovy.sql.Sql 인스턴스를 선언하는 올바른 방법이라는 점에 유의하는 것이 좋다 오라클 데이터베이스에서 나와 함께).

또 다른 가능성은 groovy sql의 모든 실행이 동일한 연결을 사용하도록 cacheConnection 클로저를 사용하는 것입니다.