Java - DBCP与JNDI有何区别?

4

我是个初学者,已经创建了几个简单的Java Swing应用程序。我能够使用apache commons DBCP创建连接池并访问数据源。

最近,我开始创建基于Java的网络应用程序,使用JSP和Servlet。我学会了使用JNDI访问数据源。我更新XML文件,使用InitialContext()和lookup("java:comp/env")就可以了!我正在使用Apache Tomcat作为我的Servlet/JSP容器。

1. 但是连接池是在哪里创建的?

2. 如果是,那么这是否意味着JNDI在内部使用DBCP?

当我需要为Swing应用程序创建DBCP时,我必须首先创建一个GenericObjectPool实例,然后创建一个连接工厂对象和一个PoolableConnectionFactory对象来创建将用于获取连接的数据源。

3个回答

4

JNDI是一种将对象从系统的一部分传递到另一部分(在技术术语中跨类加载器)的机制。这对于在Java运行时中找到的类和接口(如String或DataSource)非常有用。

这意味着在您的情况下,JNDI只是一种传输机制,您需要在其他地方定义实际的连接池。大多数Web容器都有一种定义系统范围连接池的机制,然后使用JNDI让您可以访问它。


@Thorbjørn....为Web应用程序定义DBCP与为Swing应用程序定义是否相同? - user547453
@Thorbjørn...."...在其他地方定义"可能意味着它是一个Java类文件或XML文件? - user547453
1
在Tomcat中定义连接池的方法是在Tomcat XML配置文件中配置<Resource ...。请参阅http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html获取说明。 - Thorbjørn Ravn Andersen
1
此外,您可能希望直接在Web应用程序中管理池,而不是在Tomcat中进行管理。只需按照连接池提供程序文档中描述的方式配置数据源即可。 - skuntsel
谢谢Thorbjørn和skuntsel! - user547453
1
此外,请确保理解Thorbjørn在容器管理的情况下关于系统范围连接池的评论。这意味着所有部署在其上的应用程序将共享一个连接池。 - skuntsel

3

@Paul...但我仍然需要定义连接池吗?Apache Tomcat不会自动创建它吗? - user547453

3
JNDI是通过查找来定位远程资源的机制。它与连接池库没有任何相似之处。这些库,包括c3p0、DBCP和BoneCP,允许你创建数据源,并具备汇集连接和/或语句的能力。如果这个数据源在你的应用程序内部使用,你不需要使用JNDI;如果它位于一个远程系统上(例如Tomcat中),你需要使用JNDI来访问数据源。
顺便说一下,为什么你选择使用老派的Servlet/JSP组合?使用JSP的继承者facelets是JSF 2.x中首选的视图技术,这是一个更好的想法。
另一个建议是将数据源的管理转移到一个知名框架中。一个方向可能是使用ORM,例如Hibernate,来管理你的数据源(该数据源是以连接池为目的创建的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接