заново изобретать колесо: пул соединений - PullRequest
1 голос
/ 06 сентября 2011

Первый вопрос здесь, поэтому, пожалуйста, оставьте меня со мной, если неясно.

В процессе обучения я нахожусь в процессе создания своего рода класса пула соединений jdbc для моего приложения java / jsf.Это просто чтобы поиграть.Я уверен, что есть намного более изощренные способы справиться с этим.

(конечно, я знаю, что есть много очень хороших пулов соединений, но переосмысление колеса для меня - увлекательный способ изучения: -))

@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);
            }
        }
    }
}

Я сделал класс управляемым компонентом с областью приложения, поэтому я знаю, что он будет создан только один раз при запуске приложения.

Мой реальный вопрос: как можноЯ называю метод заимствования и отдачи.Для метода loan () я нашел следующее:

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

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

Это прекрасно работает, однако я чувствую, что это должно / могло быть проще.По крайней мере, я получаю соединение, переданное обратно.

Для метода giveback () я должен передать переменную (соединение больше не использовать).Как я могу это сделать.

Любые советы / подсказки или указатели приветствуются,

(о ... это все для моего собственного использования, поэтому никакие реальные живые приложения не страдают от моей неспособности:-)) С наилучшими пожеланиями, Мартейн

1 Ответ

2 голосов
/ 06 сентября 2011

Помимо подхода к пулу соединений (или я бы напрасно потратил время на написание и подробные примеры: /), вы можете просто получить доступ к другим управляемым bean-компонентам из управляемого bean-компонента, введя их как @ManagedProperty.

@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управляемый боб, а также не должен быть разработан таким образом.Я в основном вводил этот ответ с широко открытой челюстью. Я рекомендую изучить некоторые существующие библиотеки пулов соединений с открытым исходным кодом, такие как BoneCP , если ваша единственная цель - учиться на примере / упражнении.

...