重新发明轮子:连接池

时间:2011-09-05 20:24:00

标签: java jsf web-applications connection-pooling

这里的第一个问题如果不清楚的话,请跟我一起。

作为一种学习经验,我正在为我的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(),我必须传递一个变量(连接不再使用)。我怎样才能做到这一点。

欢迎任何提示/技巧或指示,

(哦....这完全取决于我自己的用法,所以没有真正的现场应用程序因我的无能而受到影响:-)) 最好的祝福, 马亭

1 个答案:

答案 0 :(得分:2)

除了连接池方法(或者我会完全浪费时间进行写作以及详细的示例:/),您可以通过将它们注入@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,如果你的唯一目的是通过example / exercise来学习。