Имеет ли смысл иметь пул соединений на уровне JNDI или на уровне веб-приложения? Например, я мог бы просто создать на 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" />
Уход этой весной:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" />
В обоих случаях пружинный компонент myDataSource был бы источником данных пула соединений c3p0, но какой из них лучше? Я думаю, что использование пула в JNDI имеет больше смысла, но недостатком этого является то, что вы должны переместить свою библиотеку c3p0 на уровень контейнера сервлета, что может вызвать конфликты с существующими сервлетами, если они в настоящее время используют другую версию. Тем не менее, включение его в JNDI означает, что вашим приложениям вообще не нужно беспокоиться о пуле. Что вы думаете?