Во время анализа производительности моего проекта я обнаружил несколько проблем, указывающих на пул соединений. Каждый запрос запускает следующий код для использования пула соединений фабрики сеансов:
def sql = new Sql(sessionFactory.getCurrentSession().connection())
def resultList = sql.rows(sqlQuery,parameters)
Самый первый запрос фабрики сеансов в каждом потоке обычно занимает от 200 до 300 миллисекунд, тогда как последующие запросы (даже идентичные запросы) занимают 50-80 миллисекунд.
Я переключился на HikariCP просто для сравнения, и время выполнения сократилось вдвое, прежде всего потому, что не было задержки при начальном подключении внутри каждого потока. Что может привести к тому, что первое соединение в каждом потоке займет так много времени в диспетчере пула соединений Grails по умолчанию (пул соединений commons-dbcp в соответствии с этот сайт)?
Источник данных:
dataSource {
pooled = true
logSql = true
loggingSql = true//change this to true to get hibernate logging in your console
dialect="org.hibernate.dialect.DB2Dialect"
driverClassName = "com.ibm.db2.jcc.DB2Driver"
username = "notReal"
password = "notReal"
url = 'NOTREAL'
pooled = true
readOnly = true
properties {
initialSize = 4
minIdle = 1
maxIdle = 8
maxActive = 100
maxWait = 2000
maxAge = 60000
minEvictableIdleTimeMillis=30000
timeBetweenEvictionRunsMillis=30000
abandonWhenPercentageFull = 50
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
validationInterval=500
}
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory'
}
Версия Грааля:
Groovy/Grails Tool Suite
Version: 3.6.2.RELEASE
Platform: Eclipse Kepler SR2 (4.3.2)