Имеет ли смысл иметь пул соединений на уровне JNDI или на уровне webapp? Например, я мог бы просто создать javax.sql.DataSource:
<Context antiJARLocking="true">
<Resource name="jdbc/myDataSource"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/myDataSource" user="user" password="password" />
</Context>
а затем настройте пул в Spring следующим образом:
<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources"
factory-method="pooledDataSource">
<constructor-arg>
<jee:jndi-lookup jndi-name="java:comp/env/jdbc/myDataSource" />
</constructor-arg>
</bean>
Или я мог бы настроить пул непосредственно в JNDI:
<Resource name="jdbc/myDataSource"
auth="Container"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
driverClassName="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost/myDataSource"
user="user" password="password"
minPoolSize="3"
maxPoolSize="15"
maxIdleTime="5000"
idleConnectionTestPeriod="300"
acquireIncrement="3" />
Оставляя это spring:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" />
В обоих случаях myDataSource Spring bean будет источником данных с пулом c3p0, но какой из них лучше? Я думаю, что наличие пула в JNDI имеет наибольший смысл, но недостатком является то, что вы должны подтолкнуть ваш c3p0 lib к уровню контейнера сервлета, который может вызвать конфликты с существующими сервлетами, если они в настоящее время используют другую версию. Однако, вставляя его в JNDI, ваши приложения не должны беспокоиться об объединении вообще. Что вы думаете?