如何在没有 JNDI 数据源的情况下使用 JDBC 连接池?(在 Apache Tomcat 中)

如何在没有 JNDI 数据源的情况下使用 JDBC 连接池?(在 Apache Tomcat 中)

我有一台 Apache Tomcat 7 服务器。我有一个相当复杂的 Java Servlet 应用程序在其上运行,每次 POST 都需要一些 MySQL 查询。因此我需要一个 MySQL 数据库连接来执行查询。目前我使用以下 Java 代码来创建数据源:

//db is for example: jdbc:mysql://127.0.0.1:3306/databasename
DataSource ds = new DataSource(initPoolProperties(db, user, pass));

private PoolProperties initPoolProperties(String db, String user, String pass)
{
    PoolProperties defaultPoolProperties = new PoolProperties();
    defaultPoolProperties.setUrl(db);
    defaultPoolProperties.setUsername(user);
    defaultPoolProperties.setPassword(pass);
    defaultPoolProperties.setDriverClassName("com.mysql.jdbc.Driver");
    // And a long list of properties here ...

    return defaultPoolProperties;
}

在我的整个分层 Java Servlet 应用程序中,我仅为每个 POST 的数据库连接创建一个数据源(通过 HTML 表单浏览网站)。此后,我使用几次ds.getConnection()来获取执行某些 MySQL 查询所需的连接。

似乎每个人都在使用 JNDI DataSource。这意味着他们在应用程序的 context.xml 中定义一个标签,然后使用 JNDI 查找来获取 DataSource,并像我一样使用连接。

问题是我在这里是否真的在做同样的事情。我使用的连接是否汇集并在多个访问者/客户端之间共享?因为我的在线网站应用程序将被大量使用,并且某些页面包含相当繁重的 SQL 查询。我不想冒险让一个人等待超过 0.01 秒的时间来加载页面。

我在这个网站上读到了我这样做的方式(如上图所示的小型简化代码示例):http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html向下滚动一点,您将找到 Good ol' Java 部分,我认为它与使用 相同,但我不确定。我如何确保我的应用程序使用连接池并在客户端之间共享这些连接池?

PS 我更喜欢使用 PoolProperties,而不是将某些内容放入 context.xml 中,因为我使用在配置数据库中定义的多个数据库。所选数据库取决于用户。因此,与将大量代码放入 context.xml 中相比,我可以通过这种方式更轻松地在 MySQL 管理程序中维护数据库。

答案1

如果您想要使用池而不使用 Tomcat 7 提供的内置功能,您必须自己管理它(不推荐)或引入第三方库(如 c3p0),不再推荐 DBCP:看这里

我认为,我会在 context.xml 中定义所有可能的数据源(以从 Tomcat 7 JDBC 池中受益),并且我将在服务层中实现逻辑,以根据您的上下文选择必须使用哪个数据源。Spring 框架可以为定义此类服务和 DAO 提供很大帮助。

相关内容