gpt4 book ai didi

java - 连接池还是数据源?我应该把哪个放在 JNDI 中?

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:47 25 4
gpt4 key购买 nike

必须在 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 库推送到 servlet 容器级别,如果它们当前使用不同的版本,这可能会导致与现有 servlet 发生冲突。然而,将它放在 JNDI 中意味着您的应用程序根本不必担心池化。大家怎么看?

最佳答案

您不需要合并从 JNDI 获得的数据源,因为它已经合并了:)

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

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

有关此主题的更多主题:

关于java - 连接池还是数据源?我应该把哪个放在 JNDI 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com