java - 重新发明轮子 : connection pool

标签 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() 方法,我必须传递一个变量(不再使用的连接)。我怎样才能做到这一点?

最佳答案

撇开连接池方法不谈(否则我会完全浪费时间写一篇连同详细示例的文章 :/),您可以通过将其他托管 bean 作为 @ManagedProperty 注入(inject)来从托管 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 ,如果您的唯一目的是通过示例/练习来学习。

关于java - 重新发明轮子 : connection pool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7312453/

相关文章:

javascript - JSF 属性标记中的值

asp.net - 如何在 ASP.NET 中处理长时间运行的数据库查询

java - Spring security 在 PreAuthorize 中使用 hasPermission,仅使用一个参数

java - Java中2D游戏的路径查找

java - java.lang.NoSuchMethodError : com. sun.jna.Native.register(Ljava/lang/String;)V 的原因

java - 在另一个 java web 项目中包含 WAR 文件

java - 没有 EJB 的 Web 应用程序的 WAR vs EAR?

java - Android Java - ThreadPoolExecutor$AbortPolicy

jquery - 在弹出的JSF中显示错误消息

java - Primefaces 5 <p :ajaxExceptionHandler/> java. lang.Exception 处理