作为一种学习经验,我正在为我的 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/