2012-05-15 36 views
5

Tôi không thể tìm ra cách chỉ định mức cách ly giao dịch mặc định trong ứng dụng Grails. Xin hãy giúp đỡ và chỉ ra sai lầm của tôi ở đâu. Sau đây là các chi tiết.Cách chỉ định mức cách ly giao dịch mặc định trong Grails

Grails: 1.3.7

Cơ sở dữ liệu: SQL Server 2008.

DataSource.groovy:

dataSource { 
    ... 
    driverClassName = "net.sourceforge.jtds.jdbc.Driver" 
    dialect = org.hibernate.dialect.SQLServerDialect 
    defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 
} 

hibernate { 
    ... 
    connection.isolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 
} 

Sau đó, tôi đang điều hướng thông qua việc áp dụng và thực hiện các truy vấn sau cùng thời gian:

SELECT session_id, host_name, program_name, login_name, status, transaction_isolation_level 
FROM sys.dm_exec_sessions 
WHERE host_name IS NOT NULL AND login_name = 'cm' 
ORDER BY host_name, program_name 

trả về:

session_id host_name program_name login_name status transaction_isolation_level 
61   ANDREYK-WS jTDS   cm   running 2 

2 có nghĩa là READ_COMMITTED. Tôi hy vọng sẽ thấy 1, tức là READ_UNCOMMITTED.

Nếu tôi chỉ định rõ ràng: @Transactional (cô lập = Isolation.READ_UNCOMMITTED)

Truy vấn trên trả về 1 như mong đợi. Tuy nhiên, tôi không muốn phân bổ tất cả các dịch vụ trong ứng dụng của mình. Tôi đang thiếu gì?

Trả lời

6

này cần phải được đặt dưới các thuộc tính thuộc tính của datasource configuration tức

dataSource { 
  ... 
  driverClassName = "net.sourceforge.jtds.jdbc.Driver". 
  dialect = org.hibernate.dialect.SQLServerDialect 
    properties { 
      defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED. 
    } 
} 
+0

Cảm ơn câu trả lời. Đã thử điều đó. Ứng dụng không khởi động được. Lỗi trong nhật ký: org.springframework.beans.NotWritablePropertyException: Thuộc tính không hợp lệ 'defaultTransactionIsolation' của lớp bean [org.springframework.jdbc.datasource.DriverManagerDataSource]: Thuộc tính Bean 'defaultTransactionIsolation' không thể ghi hoặc có phương thức setter không hợp lệ. Liệu kiểu tham số của bộ setter có khớp với kiểu trả về của getter không? Không thành công với cùng một ngoại lệ nếu tôi nhập 1 thay vì java.sql.Connection.TRANSACTION_READ_UNCOMMITTED hoặc cố gắng khởi tạo các thuộc tính khác. –

+0

Tôi đã thử điều này bằng cách sử dụng một nguồn dữ liệu oracle và có lỗi này: 'Không thể tạo PoolableConnectionFactory (READ_COMMITTED và SERIALIZABLE là các mức giao dịch hợp lệ duy nhất)'. Vì vậy, có vẻ như cài đặt đó có thể phụ thuộc vào nguồn dữ liệu. Có một thuộc tính 'readOnly' cho cấu hình nguồn dữ liệu, tôi đề nghị bạn sử dụng nó thay vào đó. – krock

+1

Andrey, bạn cần thêm "pooled = true" vào dataSource để khắc phục sự cố của mình. –

4

Tôi có một chút của một sự thay đổi về điều này như tôi đã nhiều DS

Ở phía trên của datasources bạn định nghĩa một bản đồ chia sẻ tài sản (điều chỉnh này để môi trường của bạn):

def defaultConnectionProperties = [ 
    maxActive: 50, 
    maxIdle: 25, 
    minIdle: 5, 
    initialSize: 5, 
    minEvictableIdleTimeMillis: 60000, 
    timeBetweenEvictionRunsMillis: 60000, 
    maxWait: 10000, 
    defaultTransactionIsolation: java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 
] 

Sau đó, mỗi DS là một cái gì đó như:

dataSource { 
    pooled = true 
    driverClassName = "net.sourceforge.jtds.jdbc.Driver" 
// driverClassName = "com.p6spy.engine.spy.P6SpyDriver" // use this driver to enable p6spy logging 
    //readOnly = "true" 
    properties = defaultConnectionProperties 
} 

Khởi động lại ứng dụng Grails của bạn.

Điều lạ là tôi thấy transaction_isolation_level ban đầu = 2, nhưng khi tôi thực sự đánh DB kết nối đặc tính dường như được thiết lập và nó flicks đến một 1.

Ngoài ra bạn có thể kiểm tra: grailsApplication.config và tìm kiếm các nguồn dữ liệu và xác nhận các cài đặt ở đó

Các vấn đề liên quan