2012-02-17 29 views
7

Từ các ví dụ bên dưới trong tài liệu sql. Nếu tôi sử dụng một trong những cách này để tạo một cá thể sql ở giữa một lớp dịch vụ grails, nó sẽ sử dụng kết nối grails pooling? Nó sẽ tham gia vào bất kỳ khả năng giao dịch nào? Tôi có cần tự đóng kết nối không? Hay nó sẽ tự động quay trở lại hồ bơi?Nếu tôi sử dụng lớp sql groovy trong grails, nó có sử dụng kết nối grails pooling không?

def db = [url:'jdbc:hsqldb:mem:testDB', user:'sa', password:'', driver:'org.hsqldb.jdbcDriver'] 
    def sql = Sql.newInstance(db.url, db.user, db.password, db.driver) 

hoặc nếu bạn có một kết nối hiện có (có lẽ từ một hồ bơi kết nối) hoặc một nguồn dữ liệu sử dụng một trong các nhà thầu:

def sql = new Sql(datasource) 

Bây giờ bạn có thể gọi sql, ví dụ để tạo ra một bảng:

sql.execute ''' 
     create table PROJECT (
      id integer not null, 
      name varchar(50), 
      url varchar(100), 
     ) 
''' 

Trả lời

7

Nếu bạn thực hiện:

Sql.newInstance(...) 

Bạn sẽ tạo ra một kết nối mới và bạn đang không sử dụng Connection Pool.

Nếu bạn muốn sử dụng hồ bơi kết nối, bạn có thể tạo một dịch vụ với lệnh sau đây:

grails create-service org.foo.MyService 

Sau đó, trong tập tin MyService.groovy của bạn, bạn có thể quản lý các giao dịch như sau:

import javax.annotation.PostConstruct 

class MyService { 
    def dataSource    // inject the datasource 
    static transactional = true // tell groovy that the service methods will be transactional 


    def doSomething() { 
     sql = new Sql(dataSource) 
     //rest of your code 
    } 
} 

Để biết thêm chi tiết bạn có thể đọc: http://grails.org/doc/2.0.x/guide/services.html

EDIT:

Để quản lý nhiều nguồn dữ liệu, bạn có thể thực hiện một trong các thao tác sau dựa trên phiên bản Grails của bạn.

Nếu bạn đang sử dụng một phiên bản Grails lớn hơn 1.1.1 (không 2.x), bạn có thể sử dụng các plugin sau:

http://grails.org/plugin/datasources 

Nếu bạn đang sử dụng Grails 2.x bạn có thể sử dụng ra khỏi sự hỗ trợ hộp:

http://grails.org/doc/2.0.0.RC1/guide/conf.html#multipleDatasources 
+0

Xin chào Ernesto, tôi nhận ra rằng tôi không thêm đủ thông tin vào câu hỏi mà tôi thực sự cần trả lời. Tôi có nhiều nguồn dữ liệu và tôi sẽ không biết cho đến khi tôi thấy dữ liệu trong thời gian chạy mà nguồn dữ liệu tôi sẽ sử dụng. Tôi tin rằng tôi không thể tiêm nhiều nguồn dữ liệu vào một dịch vụ. Vì vậy, câu hỏi lớn hơn là thực sự làm thế nào tôi có thể chọn cơ sở dữ liệu tôi muốn đi đến, sử dụng lớp Sql và cũng có được tự động tổng hợp. Và tôi có thể muốn làm điều này trong các lớp học ngoài các lớp dịch vụ. Tôi không cần quản lý giao dịch dịch vụ. – Andrew

1

Nếu bạn tạo đối tượng Sql như thế này tôi tin rằng nó sẽ sử dụng kết nối tổng hợp

class SomeSerive { 

    SessionFactory sessionFactory 

    def someMethod() { 
    Sql sql = new Sql(sessionFactory.currentSession.connection()) 
    } 
} 
Các vấn đề liên quan