Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JNDI-JDBC - как вернуть коннект? 
:(
    Опции темы
Се ля ви
Дата 27.8.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Сначала устанавливал всегда прямые соединения с базой из веб-приложения, но из-за более чем "желательной" работы метода finalize в своё время поимел кучу проблем с незакрытыми коннеутами к базе, по-этому знакомый посоветовал получать коннекты к базе через пул соединений с помощью JNDI.

Я написал такой код:
Код

interface Operation {
        Object doIt(Statement stmt) throws NamingException, SQLException;
    }

    //Выполнение метода, заложенного в передаваемый объект, реализующий интерфейс Operation, через пул соединений с базой данных.
    private Object executeOperation(Operation obj) throws NamingException, SQLException {

        Statement stmt;
        Object result = null;

        Context namingContext;
        DataSource ds;
        Connection aConnection;

        namingContext = new InitialContext();

        ds = (DataSource) namingContext.lookup(jndiDSName); // NamingException if CPool does not exists

        aConnection = ds.getConnection(); // SQLException if Connection is not created

        try {

            stmt = aConnection.createStatement(); // SQLException if Statement is not created

            try {

                result = obj.doIt(stmt); //SQLException

            } finally {

                stmt.close(); //SQLException if Statement is not closed

            }

        } finally {

            aConnection.close(); //SQLException if Connection is not closed
        }


        return result;
    }


Т.е. для каждой операции/группы операций с базой ищется коннект, передаётся методу, который "это делает" и потом конект закрывается и выходит за область видимости переменная, которая за него отвечает - значит, он должен стать добычей сборщика мусора, который и должен освободить конекшн для другого процесса.
Но коннекты, блин, копятся... Не пойму - почему. smile


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Се ля ви
Дата 27.8.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Отбой тревоги. Я сам контекст забыл закрыть.

Вот правильный код защищённого доступа к JDBC через JNDI:
Код


interface Operation {
        Object doIt(Statement stmt) throws NamingException, SQLException;
    }

    //Выполнение метода, заложенного в передаваемый объект, реализующий интерфейс Operation, через пул соединений с базой данных.
    private Object executeOperation(Operation obj) throws NamingException, SQLException {

        Statement stmt;
        Object result = null;

        Context namingContext;
        DataSource ds;
        Connection aConnection;

        namingContext = new InitialContext();

        try {

            ds = (DataSource) namingContext.lookup(jndiDSName); // NamingException if CPool does not exists

            aConnection = ds.getConnection(); // SQLException if Connection is not created

            try {

                stmt = aConnection.createStatement(); // SQLException if Statement is not created

                try {

                    result = obj.doIt(stmt); //SQLException

                } finally {

                    stmt.close(); //SQLException if Statement is not closed

                }

            } finally {

                aConnection.close(); ///SQLException if Connection is not closed
            }

        } finally {

            namingContext.close(); // NamingException
        }

        return result;
    }



Обращение к нему, соответственно, может быть таким:
Код

    // Выдать номер по id
    public int getNumberByID(final int Id) throws NamingException, SQLException {

        return
            (
                (Integer)
                    executeOperation(
                        new Operation() {

                            public Object doIt(Statement stmt) throws NamingException, SQLException {

                                ResultSet rs =
                                    stmt.executeQuery(
                                        "select num " +
                                        "from tbl1 " +
                                        "where id = " + Id
                                );

                                if (!rs.next())
                                    throw new SQLException("This number does not exists");

                                return new Integer(rs.getString(1))
                            }
                        }
                    )
            )
                .intValue();
    }


P.S. А прямые коннекты к базе - это, IMHO, для небольших программулек...

Это сообщение отредактировал(а) Се ля ви - 27.8.2005, 20:03


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
DEMO_VERSION
Дата 18.10.2005, 12:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











No eto znachit chto y menya dolzhen but' zapyshen server?? Dolzhno but EJB???

Kakoe znacenie jndiDSName???
ds = (DataSource) namingContext.lookup(jndiDSName);


Posmotrite primer ispolzovaniya Proxool
http://proxool.sourceforge.net/quickStart.html

Znachit li eto cho esli ya zahocy vupolnit kakojto SQL i mne nado bydet polycit Statement ili PreparedStatement mne nado bydet pisat vnytri fynkcui :
Код

Connection connection = null;
 2.try {
 4.  try {
 5.    connection = DriverManager.getConnection("proxool.example");
 6.  } catch (SQLException e) {
 7.    LOG.error("Problem getting connection", e);
 8.  }

a potom yzhe zakruvat i Statement i Connection?????

PS: y menya pokamis ne Web programa a prostaya konsolnaya.


  Вверх
Се ля ви
Дата 21.10.2005, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Цитата(DEMO_VERSION @ 18.10.2005, 12:19)
eto znachit chto y menya dolzhen but' zapyshen server??

Обычно - да. По крайней мере, в моём варианте было так. Либо самописный какой-нить Пул...

Цитата(DEMO_VERSION @ 18.10.2005, 12:19)
Dolzhno but EJB???

EJB тут абсолютно ни при чём.

Цитата(DEMO_VERSION @ 18.10.2005, 12:19)
Kakoe znacenie jndiDSName???

У меня это константа, определяется при настройках твоего пула, ты её сам задаёшь, а потом сюда прописываешь smile

А вообще, почитайте сначала про JNDI, например - вот эту статью. ;)


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0732 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.