【问题标题】:How to pass around JDBC connection without using Spring/JPA/Hibernate如何在不使用 Spring/JPA/Hibernate 的情况下传递 JDBC 连接
【发布时间】:2010-12-09 16:38:38
【问题描述】:

我们有一个 Java J2EE 应用程序,它为每个数据库行插入/更新使用单独的 Web 服务调用。事实证明这太慢了。他们让我“快速”修复它。我计划将所有 Web 服务调用转换为纯 JDBC。为此,我需要从池中获取 JDBC 连接,然后在多种不同的方法中使用它。我需要在多个 DAO 中使用相同的 JDBC 连接将它们全部串在一起形成一个数据库事务。我可以显式地将 JDBC 连接传递给每个需要它的 DAO,但这需要我更改大量方法签名以及大量单元测试(这与“快速”部分背道而驰)。

我正在尝试想出一个好方法,将 JDBC 连接放在某个地方,然后在需要它的方法中获取它,而不必在任何地方显式地传递它。我们不能在这个项目上使用 Spring、JPA 或 Hibernate,因为支持团队不支持这些技术。我可以将 JDBC 连接放入 EJB,但我不确定它的可靠性如何。我可以创建一个自定义 Singleton 来管理每个用户(会话?)的数据库连接,但我必须小心线程安全。如果有人以前尝试过这样做,我将不胜感激。

【问题讨论】:

    标签: java jdbc jakarta-ee database-connection


    【解决方案1】:

    您可以使用 ThreadLocal。让入口点设置它而不是 DAO

    class ConnectionUtil {
        public static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>();
    }
    
    public Return method(Args arg) {
        ConnectionUtil.connection.set(newConnection());
        try {
            ...
        } finally {
            ConnectionUtil.connection.remove();
        }
    }
    

    很丑,但这似乎是你老板想要的。

    【讨论】:

    • 这对我们来说可能非常有效。这样做有什么重大的性能问题吗?
    • ThreadLocal 已成为 Sun 一段时间以来改进性能的目标。与 DB 操作相比,这将是一个舍入误差。
    【解决方案2】:

    使用Apache Commons DBCP。它是 Apache 的 Connection Pool 项目,也是许多引擎内部使用的项目。

    【讨论】:

    • 我了解 Apache Commons DBCP 有助于维护连接池,但我需要每个单独的 DAO 插入/更新/删除方法来获取相同的连接。 DBCP 可以帮助解决这个问题吗?某处有例子吗?我尝试了几次谷歌搜索,都没有找到任何东西。
    【解决方案3】:

    我们以前做过(大约 5 年前在 IBM WebSphere 上)。 我们编写了一个自己的池并将 jdbc-connections 存储在带有 sessionID 的哈希表中。唯一的缺陷是在 sessionend 上关闭连接并将其返回到池中(我们使用 sessionlistener 来完成)。如果一个用户会话仅连接到一个 jdbc-connection,则继承线程安全。所以单例方法确实有效。 我们的性能提升非常糟糕。

    【讨论】:

      【解决方案4】:

      此外,我为 DAO 所做的不是在方法签名中传递连接,而是在构造函数中传递。然后我持有最初创建负责关闭它的连接的对象。

      【讨论】:

        猜你喜欢
        • 2019-10-22
        • 2017-07-02
        • 2018-08-28
        • 2017-08-05
        • 1970-01-01
        • 2022-07-01
        • 2011-11-10
        • 2019-07-22
        • 2023-04-08
        相关资源
        最近更新 更多