3

我有一个连接池可以从 servlet 访问 MySQL 数据库。我使用 JNDI 获取数据源,该 JNDI 在我的 META-INF/context.xml 文件中定义。

一切正常,但我必须将 MySQL 驱动程序 JAR 放在 Tomcat 的 /common/lib 文件夹中,而不是 webapp 的 WEB-INF/lib;否则 JNDI 将无法工作 (ClassNotFoundException: com.mysql.jdbc.Driver)。

有没有其他方法可以获取数据源,它允许我将 JAR 放在 WEB-INF/lib 中?我在 Internet 上找到的所有示例都使用 JNDI ......

(这是一个非常简单的应用程序,我真的不想为了解决我的问题而不必导入某些框架的 53 个 JAR :)

谢谢!

4

5 回答 5

4

虽然这些回复中的大多数都是关于池的,但我认为这不是你的问题吗?

我认为对您的问题最直接的回答是,只需导入并使用驱动程序提供的 DataSource 实现即可。您正在使用 MySQL 连接器/J?然后是MysqlDataSource

上面有设置用户名、密码等的方法。

如果您在 JNDI 中不需要它,那么您不必通过 Tomcat 在 JNDI 中配置它。当然,您可以将驱动程序 jar 保存在 WEB-INF/lib 中。实际上,如果您想围绕该数据源进行池化,只需使用 Commons DBCP 和 Pool。

下面是一个使用给定 DataSource制作自己的池化 DataSource 的示例。

于 2009-10-16T15:41:37.457 回答
1

您可以尝试 sun 已经建议的方法: 连接池

于 2009-10-16T09:50:39.890 回答
1

如果你不想使用 JNDI,那么你就不能使用 Tomcat 的连接池机制,你需要在你的应用程序中加入一个,这意味着在你的 WAR 文件中添加第三方库。一个或另一个,选择是你的。

如果您决定走第 3 方路线,我建议使用Apache Commons DBCP(这又需要Apache Commons Pool)。

于 2009-10-16T09:51:23.490 回答
1

简单的应用程序增长。框架最初可能看起来有点矫枉过正,但你很快就会发现你正在重新发明轮子并发展自己的框架。

考虑追随你的人......他们上网查找一种技术,找到它常用的,回到你的代码,瞧!你以不同的方式做到了。

Java EE 框架代码、JDBC 驱动程序,一切都应该在您的服务器环境中,无需将其包含到您的应用程序中。所以开销应该很小。当您开发更多应用程序时,这种方法确实会带来回报。

咬紧牙关,为未解决的问题保留创造力。

于 2009-10-16T09:57:35.393 回答
0

我绝对同意你的观点,即数据源应该远离 context.xml。如果您想外部化您的配置,您将不得不这样做。我们不久前经历了这个过程。这很容易。我不能给你代码,但我可以为你指出正确的方向,

  1. 您需要在自己的配置中定义 <Resource> 并找到解析它的方法。您可以使用 JAXP、Apache Digester。我很懒,所以我使用 Apache Commons Configuration。

  2. <Resource> 只是名称-值对。您需要将它们转换为属性。

  3. 您可以制作这样的数据源,

    数据源 ds = org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(prop);

这样做的副作用是您可以禁用 JNDI (useNaming="false") 以使服务器更轻一些。

于 2009-10-16T14:13:26.817 回答