Grails服务中的dataSource注入

时间:2011-02-17 14:42:10

标签: sql multithreading grails groovy datasource

我有一个应用程序范围的服务,而不是事务性的。

我有一个服务方法:

  1. 使用注入的dataSource创建存储过程调用[using Sql.call{...}]。执行并遍历结果集。

  2. 根据结果集,我将结果集细分为相同大小的块,并在多个线程中处理它们。

  3. 每个帖子都会尝试Sql sql = new Sql(dataSource)

  4. 此处发生死锁。

  5. 为什么? dataSource是否不返回可能的新连接或空闲连接?

3 个答案:

答案 0 :(得分:0)

尝试研究Gpars:这是一个时髦的parallalization框架。

答案 1 :(得分:0)

我遇到了完全相同的问题。经过几个小时的搜索,我找到了解决方案。

在Datasource.groovy配置文件中,您可以设置连接池到数据库的参数。

我已更改http://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.htmlminIdlemaxIdlemaxActive设置,以便我的配置文件看起来像这样:

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'
}

答案 2 :(得分:0)

当您不在事务中时,您必须释放GroovySQL从数据源中获取的连接。池没有连接,这就是它锁定的原因。

在事务内部TransactionAwareDataSourceProxy将负责共享连接,因此在这种情况下不需要从GroovySQL释放连接。有关详细信息,请参阅http://jira.grails.org/browse/GRAILS-5454

这是在Grails中使用GroovySQL的更好方法,因为OpenSessionInView(OSIV)拦截器将负责关闭连接,它将与Hibernate共享相同的数据库连接。此方法适用于两种情况:内部事务和外部事务。

Sql sql = new Sql(sessionFactory.currentSession.connection())