2013-02-21 32 views
1

我有一個Grails服務方法,它調用一個普通的Java類來使用JDBC將一些數據保存到數據庫。接下來,grails服務方法也寫入相同的數據庫。這應該全部發生在同一個事務中。將聲明式spring事務(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,它位於單獨的JAR文件中,理想情況下我們不希望對spring的事務管理有任何依賴。我不確定如何繼續。

謝謝!

+0

如何獲取MyJDBCClass中使用的連接? – 2013-02-22 14:41:50

+0

更新了Q以迴應您的評論。我相信我可能會回答我自己的問題。只要我通過連接並且jdbcClass.savePerson不以任何方式提交,回滾或更改連接,我相信它可以正常工作。我只是想確保這是正確的方法。 – nogridbag 2013-02-22 15:49:56

+0

是的,'dataSource.getConnection()'將與GORM方法所使用的服務方法的連接相同。 – 2013-02-22 16:07:24

回答

0

正如評論中指出的那樣,使用dataSource.getConnection(),您可以使用動態GORM方法使用的相同連接。

而且這是很好的注意,這是聲明groovy.sql.Sql實例的正確方法:

sql = new Sql(dataSource.getConnection()) 

如果聲明像

sql = new Sql(dataSource) 

它可能是你的SQL命令使用不同的連接(發生與我在Oracle數據庫中)。

另一種可能性是使用cacheConnection閉包,以確保groovy sql的所有執行都將使用相同的連接。