我有一个应用程序范围的服务,而不是事务性的。
我有一个服务方法:
使用注入的dataSource创建存储过程调用[using Sql.call{...}
]。执行并遍历结果集。
根据结果集,我将结果集细分为相同大小的块,并在多个线程中处理它们。
每个帖子都会尝试Sql sql = new Sql(dataSource)
此处发生死锁。
为什么? dataSource是否不返回可能的新连接或空闲连接?
答案 0 :(得分:0)
尝试研究Gpars:这是一个时髦的parallalization框架。
答案 1 :(得分:0)
我遇到了完全相同的问题。经过几个小时的搜索,我找到了解决方案。
在Datasource.groovy配置文件中,您可以设置连接池到数据库的参数。
我已更改http://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html的minIdle
,maxIdle
和maxActive
设置,以便我的配置文件看起来像这样:
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())