【问题标题】:reinventing the wheel : connection pool重新发明轮子:连接池
【发布时间】:2011-09-05 20:24:00
【问题描述】:

作为学习经验,我正在为我的 java/jsf 应用程序创建某种 jdbc 连接池类。就是玩玩而已。我确信有更复杂的方法来处理这个问题。

@ManagedBean(name = "pooltje", eager = true)
@ApplicationScoped
public class pooltje {

    private Integer max_connecties = 10;
    private connectie[] pool = new connectie[max_connecties];

    public pooltje() {
        for (Integer teller = 0; teller < max_connecties; teller++) {
            pool[teller] = new connectie();
        }
    }

    public Synchronzed Connection borrow() {
        Connection ret_con = null;
        while (ret_con == null) {
            for (Integer t = 0; t < max_connecties; t++) {
                if (pool[t].getUsed() == Boolean.FALSE && ret_con == null) {
                    ret_con = pool[t].getConn();
                    pool[t].setUsed(Boolean.TRUE);
                }
            }
        }
        return ret_con;
    }

    public synchronized void giveback(Connection terug) {
        for (Integer t = 0; t < max_connecties; t++) {
            if (pool[t].getConn() == terug) {
                pool[t].setUsed(Boolean.FALSE);
            }
        }
    }
}

我将这个类设为一个具有应用程序范围的托管 bean,所以我知道它只会在应用程序启动时被实例化一次。

我的实际问题是,我如何调用借用和交还方法。 对于 borrow() 方法,我发现以下内容:

FacesContext fc2 = FacesContext.getCurrentInstance();
Application app = fc2.getApplication();

Connection conn = (Connection) app.evaluateExpressionGet(fc2, "#{pooltje.borrow()}", Connection.class);

这很好用,但我觉得它应该/可以更容易。至少我确实得到了一个传回的连接。

对于 giveback() 方法,我必须传递一个变量(不再使用连接)。我怎样才能做到这一点?

【问题讨论】:

  • 然后不谈论 PHP 风格...阅读一些 Java Naming Conventions。重申 Arjan,在您的代码中混合各种人类语言绝对不清楚,对其他人有帮助或自我记录(例如,为了在 Stack Overflow 上获得帮助!)。全程使用英语。不要使用荷兰街头谈话。
  • @Arjan Tijms 和 BalusC 坦克指出了这一点。但是,我的项目设置必须有一些更根本的问题。 BalusC 提出的建议对我不起作用。好吧,那是另一天的事情。无论如何....感谢您的努力。
  • 您需要更清楚到底是什么不起作用。如果可以,共享整个异常和堆栈跟踪。他们讲述了很多关于问题的原因。也许您正试图在 bean 的构造函数中访问它,这确实行不通?
  • @BalusC。当然,我知道如果我不提供信息,您将无法帮助我。但是....您的评论和来自 Arjan Thijms 的评论说服我以更有条理的方式去做。发布我将不再使用的东西的堆栈跟踪对我来说似乎有点奇怪:-)。所以......仍在重新发明轮子。对于连接池,我将尝试设置诸如boneCP 之类的东西。 (哦....而且我的名字已经被咬了。这是很多混乱的根源)

标签: java jsf web-applications connection-pooling


【解决方案1】:

除了连接池方法(否则我会完全浪费时间编写详细示例:/),您可以通过将它们注入为 @ManagedProperty 来从托管 bean 中访问其他托管 bean。

@ManagedBean
@RequestScoped
public class ArbitraryBean {

    @ManagedProperty("pooltje")
    private Pooltje pooltje;

    // ... Add at least a setter for it.
}

这样您就可以在您的@PostConstruct 或操作方法中随时访问它:

public void doSomething() {
    Connection connection = pooltje.borrow();
    // ...
}

但实际上,连接池不应该是 JSF 托管的 bean,也不应该这样设计。我基本上一直张开下巴就输入了这个答案。如果您的唯一目的是通过示例/练习来学习,我建议您探索一些现有的开源连接池库,例如BoneCP

【讨论】:

  • 感谢您的回复(即使是震惊和敬畏)。我现在正在尝试这些建议。我将毫无疑问地探索 BoneCP 项目。事实上,我正在通过示例/练习来学习。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2012-09-01
  • 1970-01-01
  • 2015-11-07
  • 2012-02-29
相关资源
最近更新 更多