重新发明轮子:连接池



作为一个学习经验,我正在为我的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和giveback方法。对于borrow()方法,我发现如下:

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

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

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

不考虑连接池方法(否则我会浪费时间写详细的示例:/),您可以通过将其他托管bean注入为@ManagedProperty来从托管bean内部访问其他托管bean。

@ManagedBean
@RequestScoped
public class ArbitraryBean {
    @ManagedProperty("pooltje")
    private Pooltje pooltje;
    // ... Add at least a setter for it.
}

这样你就可以在需要的时候在你的@PostConstruct或action方法中访问它:

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

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

相关内容

  • 没有找到相关文章

最新更新