4

我是一个新手,我已经创建了一些 simlpe Java Swing 应用程序。我能够使用 apache commons DBCP 创建连接池并访问数据源。

我最近开始使用 JSP 和 Servlet 创建基于 Java Web 的应用程序。我已经学会了使用 JNDI 来访问数据源。我更新 XML 文件并使用 InitialContext() 和 lookup("java:comp/env") 就是这样!!!!我使用 Apache Tomcat 作为我的 Servlet/JSP 容器。

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

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

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

4

3 回答 3

4

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

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

于 2013-02-22T20:28:50.973 回答
3

Tomcat为JNDI 数据源使用Apache DBCPApache Pool的自定义实现。这些库位于单个 JAR 中,位于.$CATALINA_HOME/lib/tomcat-dbcp.jar

主包是org.apache.tomcat.dbcp为了避免与Apache Commons中的常规包冲突。

于 2013-02-22T20:28:07.740 回答
3

JNDI 是一种通过查找定位远程资源的机制。它与连接池库没有任何共同之处。这些库(其中 c3p0、DBCP 和 BoneCP 最为著名)允许您创建具有池连接和/或语句能力的数据源。如果在您的应用程序中使用此数据源,则不需要使用 JNDI,如果它位于远程系统上(例如,在 Tomcat 中),则需要使用 JNDI 来访问数据源。

作为旁注,您为什么选择使用老式的 Servlet/JSP 组合?使用 JSP 后继者 facelets 是一个更好的主意,它是 JSF 2.x 中的首选视图技术。

另一个评论是将您的数据源的管理转移到一个众所周知的框架。一个方向可能是使用 ORM,例如 Hibernate,来管理您的数据源(在创建时考虑到连接池)。

于 2013-02-22T21:05:15.737 回答