внедрение источника данных в сервис Grails - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть служба с областью применения, а не транзакционная.

У меня есть метод обслуживания, который:

  1. использует введенный источник данных для создания вызова хранимой процедуры [с использованием Sql.call{...}]. Выполняет и просматривает набор результатов.

  2. На основе набора результатов я подразделяю наборы результатов на куски одинакового размера и обрабатываю их в нескольких потоках.

  3. Каждый поток пытается сделать Sql sql = new Sql(dataSource)

  4. Здесь возникает тупик.

Почему это? Разве источник данных не возвращает возможно новое или простое соединение?

Ответы [ 3 ]

0 голосов
/ 11 апреля 2013

У меня точно такая же проблема. После нескольких часов поиска я нашел решение.

В вашем конфигурационном файле Datasource.groovy вы можете установить параметры для пула соединений с базой данных.

Я изменил настройки minIdle, maxIdle и maxActive http://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html, чтобы мой конфигурационный файл выглядел примерно так:

dataSource {
  url = "jdbc:mysql://127.0.0.1/sipsy_dev?autoReconnect=true&zeroDateTimeBehavior=convertToNull"
  driverClassName = "com.mysql.jdbc.Driver"
  username = "sipsy_dev"
  password = "sipsy_dev"
  pooled = true
  properties {
    minEvictableIdleTimeMillis=1800000
    timeBetweenEvictionRunsMillis=1800000
    numTestsPerEvictionRun=3
    testOnBorrow=true
    testWhileIdle=true
    testOnReturn=true
    minIdle=100
    maxIdle=250
    maxActive=500
    validationQuery="SELECT 1"
  }
  dialect = 'org.hibernate.dialect.MySQL5InnoDBDialect'
}
0 голосов
/ 11 апреля 2013

Когда вы не участвуете в транзакции, вы должны освободить соединение, которое GroovySQL получает из источника данных.В пуле заканчиваются соединения, и поэтому он блокируется.

Внутри транзакции TransactionAwareDataSourceProxy позаботится о совместном использовании соединения, и поэтому в этом случае освобождение соединения от GroovySQL не требуется.Подробнее см. http://jira.grails.org/browse/GRAILS-5454.

Это лучший способ использовать GroovySQL в Grails, поскольку перехватчик OpenSessionInView (OSIV) позаботится о закрытии соединения и будет использовать то же соединение с базой данных, что и Hibernate.,Этот метод работает в обоих случаях: внутри транзакций и вне транзакций.

Sql sql = new Sql(sessionFactory.currentSession.connection())
0 голосов
/ 17 февраля 2011

Попробуйте заглянуть в Gpars: это отличная структура параллализации.

...