Недавно мы перешли на сборщик мусора CMS на нашем сервере (XX:+UseConcMarkSweepGC
), который отлично работал в тестах.Когда мы пошли в производство, первые несколько часов все было в порядке, но затем мы внезапно начали видеть ужас:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection,
pool error Timeout waiting for idle object
Мы видели эти сообщения, когда база данных физически не работала или сильно загружена, нона этот раз это было не так.Поэтому я начал задаваться вопросом, может ли недавнее изменение ГК быть виновником.
Чего я не понимаю, так это почему мы не видели этого раньше.Изменится ли изменение GC на concurrent-mark-sweep что-то (возможно, финализаторы), что может вызвать проблемы с этой конфигурацией?
Мои context.xml
параметры выглядят примерно так:
<Resource name="jdbc/DB" auth="Container" type="javax.sql.DataSource"
maxActive="64" maxIdle="60" maxWait="10000"
defaultAutoCommit="false"
Я прочитал эту ссылку и начал задаваться вопросом, были ли это невероятно наивные параметры.Насколько я понимаю, свыше 60 соединений мы начнем открывать и закрывать соединения, не возвращая их в пул.Но я до сих пор не понимаю, есть ли связь между этим и нашим изменением GC.
Мы используем Tomcat 6.0.29 с MySQL 5.1.45 (разъем JDBC 5.1.12).