【问题标题】:Where should I create my ConnectionPool in a JSF application?我应该在 JSF 应用程序中的哪里创建我的 ConnectionPool?
【发布时间】:2016-04-18 07:51:13
【问题描述】:

我是 JSF/Facelets 的新手,我正在创建一个对(无 SQL)数据库执行常规 CRUD 操作的应用程序。数据库有一个 API 允许创建一个连接池,然后我的操作可以从这个对象获取和释放连接。我想这个池必须在部署时为整个应用程序创建一次,共享(作为静态?)并在应用程序被销毁后关闭。我的方法正确吗?这样做的最佳做法是什么?我不知道应该将代码放在哪里以及应该如何调用它。

使用我的旧 SQL 数据库,我曾经在 context.xml 资源中配置“testOnBorrow”和“validationQuery”,因此我不必以编程方式创建显式池。

我找到了两个很棒的教程(herehere),但我无法从中找出创建池的代码应该放在哪里。

注意:我知道这可能只是一个 Servlet 问题,但我将其标记为 JSF,因为我不知道在 JSF 中是否有办法做到这一点(比如一个应用程序范围的 bean)。 谢谢。


编辑

鉴于我找不到带有DataSource 的 JAR 用于通过 context.xml 加载数据库的事实,也许我的问题应该更具体:部署 JSF 应用程序时,我可以在哪里运行一次代码当 JSF 应用程序被销毁时,我可以在哪里运行代码?

【问题讨论】:

  • 只要你的连接池是线程安全的,我会选择@Singleton bean。
  • 您使用的是标准 Java EE 堆栈还是基于自定义 Tomcat 的堆栈?答案取决于此。 DAO 文章假定自定义基于 Tomcat 的堆栈。但是您标记了问题 [java-ee],这增加了一些歧义。无论如何,假设Tomcat,这有帮助吗? stackoverflow.com/q/2299469
  • 我认为它有帮助,谢谢。我正在使用 TomEE。所以我需要做的就是创建一个创建 ConnectionPool 对象的类,用 @Resource("jdbc/some_name") 标记它,然后从 context.xml 中创建链接“
  • driverClassName代表JDBC驱动的驱动类名。这正是您在纯 Java 应用程序中的 Class#forName() 调用中使用的值。例如。 com.mysql.jdbc.Driver 如果您已经安装了 MySQL JDBC 驱动程序。回到服务器,假设您使用的是 TomEE,请考虑转向 JPA/EJB。它可以将所有 JDBC 样板简化为单行。
  • 感谢您的建议。我认为我的(NoSQL)数据库没有 JPA 实现。它也有很多 JAR,所以不确定我能找到 jdbc 驱动程序(我认为 JDBC 是面向关系数据库的)。现在我对如何创建池完全感到困惑,但我正在阅读 Tomcat jndi 文档,看看是否能找到一些亮点。我的第一个疑问是如何在 context.xml 中配置资源。我知道如何为 MySQL 做,但不适合这个数据库

标签: jsf servlets jakarta-ee


【解决方案1】:

您可以实现一个 weblistner(即 ServletContextListener)。并且可以使用 contextInitialized , contextDestroyed 方法来创建和销毁您的连接池

示例:

@WebListener
public class ContextWebListner implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // initialize connection pool.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Destroy connection pool.
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多