Luc*_*cas 13 java tomcat jndi datasource connection-pooling
在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>
Run Code Online (Sandbox Code Playgroud)
然后在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>
Run Code Online (Sandbox Code Playgroud)
或者,我可以直接在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" />
Run Code Online (Sandbox Code Playgroud)
离开这个春天:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" />
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,myDataSource spring bean都是一个c3p0连接池数据源,但哪一个更好?我认为在JNDI中使用池是最有意义的,但缺点是你必须将c3p0 lib推送到servlet容器级别,这可能会导致与现有servlet冲突,如果它们当前使用不同的版本.但是,将它放在JNDI中意味着您的应用程序根本不必担心池化.你们都在想什么?
dma*_*a_k 24
您不需要池化从JNDI获取的数据源,因为它已经合并了:)
拥有容器管理器池与应用程序池之间的唯一区别在于,在第一种情况下,您可以使用标准接口(例如JBoss控制台)监视池上的工作负载.然后,应用程序服务器的管理员管理有关增加池大小的决定(如有必要).他还可以将应用程序切换到另一个数据库服务器(例如,计划从MySQL迁移到Oracle).缺点是您需要稍微努力为单元测试设置JNDI测试数据源(参见此处).
在第二种情况下,是的,您必须将DBCP或c3p0以及JDBC驱动程序与您的应用程序一起打包.在这种情况下,收集有关Tomcat中运行的所有应用程序的所有池的统计信息并不容易.此外,无法一次性为所有应用程序迁移到较新的JDBC驱动程序(MySQL 4到MySQL 5).并且连接属性连接到您的应用程序,即使您使用.property文件(因此更改它需要重新组装和重新部署项目).也许您不需要所有这些,因为您只有应用程序,一个数据库并且没有管理开销.
关于这个主题的更多主题:
| 归档时间: |
|
| 查看次数: |
26373 次 |
| 最近记录: |