2011-10-07 55 views
12

在JNDI级别或webapp级别连接池是否更有意义?例如,我可以创建在简单的javax.sql.DataSource正是如此:连接池或数据源?我应该把哪个放入JNDI?

<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> 

,然后配置池春正是如此:

<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 spring bean都是c3p0连接池数据源,但哪一个更好?我认为在JNDI中创建池是最有意义的,但缺点是必须将c3p0 lib推送到servlet容器级别,这可能会导致与现有servlet发生冲突(如果它们当前使用的是不同版本)。但是,将它放入JNDI意味着您的应用程序根本不必担心共享。你们都在想什么?

+0

做吧你喜欢的方式,如果可以的话。如果可能的话,最好把它放在一个地方。 – EJP

回答

23

你不需要池的数据源,从JNDI获得的,因为它已经汇集:)

物的容器经理池V.S.之间的唯一区别应用程序池是第一种情况,您可以使用标准接口(例如JBoss控制台)监视池上的工作负载。然后,如果需要,应用程序服务器的管理员管理增加池大小的决定。他也可能将应用程序切换到另一个数据库服务器(例如,计划从MySQL迁移到Oracle)。缺点是您需要稍微更多的努力为您的单元测试设置JNDI测试数据源(请参阅here)。

第二种情况是,您必须将DBCP或c3p0加上JDBC驱动程序与您的应用程序一起打包。在这种情况下,收集有关运行在Tomcat中的所有应用程序的所有池的统计信息并不那么容易。另外,不能一次对所有应用程序迁移到较新的JDBC驱动程序(从MySQL 4到MySQL 5)。即使您使用.property文件(因此更改该文件需要重新组合和重新部署项目),连接属性也会连接到您的应用程序。也许你并不需要所有这些,因为你只有应用程序,一个数据库并且没有管理开销。

关于这个主题更多主题:

+5

还有一些Tomcat JDBC Pool(http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html),应该将其考虑在内。 – rit

相关问题