Я борюсь с проблемой конфигурации c3p0. Я отправил вопрос на прошлой неделе
Лучшая конфигурация c3p0
Ответ 1
Это конфигурация, которую я использую, которая минимизирует ресурсы. Конечно, вы захотите настроить приложение для использования необходимых ему ресурсов...
Ссылка: http://www.mchange.com/projects/c3p0/index.html
-
testConnectionOnCheckin
проверяет соединение, когда оно возвращается в пул.testConnectionOnCheckOut
, хотя будет обеспечивать активные соединения перед использованием, будет слишком дорогостоящим. -
idleConnectionTestPeriod
устанавливает ограничение на длительность простоя соединения до его тестирования. Без preferredTestQuery значение по умолчаниюDatabaseMetaData.getTables()
- это агностик базы данных, и хотя относительно дорогостоящий вызов, вероятно, подходит для относительно небольшой базы данных. Если вы параноик о производительности, используйте запрос, специфичный для вашей базы данных (т.е.preferredTestQuery="SELECT 1"
) -
maxIdleTimeExcessConnections
вернет connectionCount обратно доminPoolSize
после всплеска активности.
Ниже настройки конфигурации объединяются между 3-20. Простые соединения проверяются каждые 5 минут, чтобы поддерживать их. Из-за idleConnectionTestPeriod
, это будет поддерживать только количество минут в минутах. Если на 4-минутной отметке имеется более 3 соединений, они убивают эти соединения, освобождая ресурсы до минимума.
Использование maxIdleTimeExcessConnections
и idleConnectionTestPeriod
отменяет необходимость в maxIdleTime
<Context docBase="myapp" path="/myapp" reloadable="true">
<Resource description="My DB Datasource" name="jdbc/mydb"
auth="Container" factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
user="myuser" password="******"
minPoolSize="3"
maxPoolSize="20"
acquireIncrement="1"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost:3306/mydb"
testConnectionOnCheckin="true"
idleConnectionTestPeriod="300"
maxIdleTimeExcessConnections="240"
/>
</Context>
Ответ 2
Лучшей конфигурацией является настройка JPA для использования среды контейнера для получения DataSource.
Это позволяет контейнеру предоставлять пул соединений, а не настраивать его непосредственно в проект JPA.
Вы не указываете, с какой средой вы работаете. Я почти всегда использую c3p0 с автономными приложениями, такими как настольные или серверные приложения Java SE. Я также использую его с фреймворком Spring.
При использовании контейнера, такого как Servlet (Tomcat/Jetty) или Application Server (например, Glashfish или JBoss AS), они уже предоставляют реализацию пула соединений DataSource, которая обычно не является c3p0, но обеспечивает эквивалентную функцию.
Я никогда не пытался настраивать пул соединений внутри проекта JPA, потому что это означает редактирование конфигурации, чтобы настроить его для каждой среды, в которой он должен работать. Это головная боль, поэтому лучше, чтобы части JPA были предоставлены DataSource для использования во время самозагрузки.