gpt4 book ai didi

hibernate - 为什么同时使用 C3PO 和 JNDI 会产生问题?

转载 作者:行者123 更新时间:2023-12-04 08:22:30 25 4
gpt4 key购买 nike

我正在运行一个在 Tomcat 8 服务器上使用 Hibernate 的应用程序。我想使用与 Hibernate 不同的连接池,因为它们很明显它不适合在生产环境中使用。

此外,他们提到:

For use inside an application server, you should almost always configure Hibernate to obtain connections from an application server javax.sql.Datasource registered in JNDI.



所以看来我需要做两件事:
  • 配置 Hibernate 以使用第三方连接池 -- Hibernate 推荐 C3PO
  • 配置 Hibernate 以从 javax.sql.Datasource 获取连接在 JNDI 中注册的对象

  • 我一直在研究如何进行这些更改,我遇到了 this所以问题。发帖人已经在使用 C3PO,并询问如何通过 JNDI Datasource 连接到他们的数据库。目的。但是,他们遇到了问题,因为他们在按照回答者的步骤使用 JNDI 数据源时已经在使用 C3PO。发帖人在已接受答案的评论部分中说:

    yeah right, I've been doing sth really silly in there using both c3p0 and JNDI. I removed all the c3p0 configurations and it's working fine now.



    Hibernate 建议使用第三方连接池,即 C3PO,并使用 JNDI 数据源来接收连接,然而,这似乎给这个用户带来了问题;他们甚至谈论同时使用它们,好像这是一个明显的错误。

    所以我不能同时使用它们,还是应该像 Hibernate 推荐的那样?我要做的就是将 Hibernate 的默认连接池替换为用于生产环境的池,并将 Hibernate 配置为从 javax.sql.Datasource 获取连接。按照他们的建议,在 JNDI 中注册的对象。

    最佳答案

    我会尝试清理困惑。

    我认为它始于令人惊讶的简单 DataSource 接口(interface):https://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html

    The DataSource interface is implemented by a driver vendor. There are three types of implementations:

    1. Basic implementation -- produces a standard Connection object
    2. Connection pooling implementation -- produces a Connection object that will automatically participate in connection pooling. This implementation works with a middle-tier connection pooling manager.
    3. Distributed transaction implementation -- produces a Connection object that may be used for distributed transactions and almost always participates in connection pooling. This implementation works with a middle-tier transaction manager and almost always with a connection pooling manager.


    Hibernate 需要一个 DataSource 才能使用,并建议它使用连接池。

    C3PO 包装现有的 DataSource 并对其应用连接池,并创建一个类型 2 的新 DataSource。C3PO 假定它获得的 DataSource 是类型 1,但不能确定。

    在其他应用服务器中,如果您声明一个在 JNDI 中注册的数据源,它几乎总是使用容器中已经存在的连接池。对于 Tomcat 8,它在内部使用 C3PO。

    所以在 Hibernate 中实现连接池有两种方法:要么创建一个类型 1 的数据源并在代码中将其嵌入到连接池中,要么在容器中声明你的数据源(带有连接池),然后从 JNDI 将其注入(inject)到 hibernate 中。

    如果您同时这样做,就像您的情况一样,应用程序中的 C3PO 从 JNDI 获取数据源,该数据源本身就是由 tomcat 管理的 C3PO 数据源。当应用程序尝试获取连接时,应用程序 C3PO 将调用容器 C3PO,该容器将创建实际连接,但连接将在两个连接池中进行池化。当 hibernate 释放连接时,应用程序 C3PO 将保留它以供重用,但其他连接池也会继续等待连接被释放。

    根据配置,底层连接池可能会在某个超时后终止连接。

    因此在彼此之上配置两个连接池是危险的并且完全没有必要。

    回答赏金问题:在生产环境中,在生产容器中声明数据源并通过 JNDI 将其连接到 Hibernate,而无需在 Hibernate 中配置任何额外的连接池。

    关于hibernate - 为什么同时使用 C3PO 和 JNDI 会产生问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39028035/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com