Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Oracle Connection Pool


Автор: RuslanY 2.6.2011, 15:08
здравствуйте!я в этом деле совсем новый,поэтому не судите строго.
я создал Connection Pool,но что то я сделал не правильно.
Код

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Locale;

import javax.sql.PooledConnection;

import exeptions.HRDBException;
import exeptions.HRException;

import oracle.jdbc.pool.OracleConnectionPoolDataSource;

public class ConnectionPool {
    private static PooledConnection pc;
    private static ConnectionPool instance = null;

    private ConnectionPool(String user, String password) throws HRException {
        OracleConnectionPoolDataSource ds;
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Locale.setDefault(Locale.ENGLISH);
            ds = new OracleConnectionPoolDataSource();
            ds.setURL(url);
            ds.setUser(user);
            ds.setPassword(password);
            pc = ds.getPooledConnection();
        } catch (Exception e) {
            e.printStackTrace();
            throw new HRException("User or Password is wrong,or DB communication problem.");
        }

    }

    public static Connection getConnection(String user, String password)throws HRException {
        if (instance == null) {
            instance = new ConnectionPool(user, password);
        }
        try {
            return pc.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();//TODO must be removed
            throw new HRDBException();
        }
    }
}


подскажите пожалуйста как реализовать этот Connection Pool.

Автор: RuslanY 2.6.2011, 23:50
я его переделал,теперь на много лучше,но все равно не уверен,что все правильно,хотя... первичное поверхностное тестирование прошел.
вот код,кто нибудь подскажите пожалуйста,правильно я его сделал или нет?
Код


import java.sql.Connection;
import java.sql.SQLException;
import java.util.Locale;

import oracle.jdbc.pool.OracleConnectionPoolDataSource;
import exeptions.HRDBException;
import exeptions.HRException;

public class ConnectionPool {
    private static ConnectionPool instance = null;
    private static OracleConnectionPoolDataSource ds=null;

    private ConnectionPool() throws HRException {
        
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Locale.setDefault(Locale.ENGLISH);
            ds = new OracleConnectionPoolDataSource();
            ds.setURL(url);
        } catch (Exception e) {
            e.printStackTrace();
            throw new HRDBException();
        }

    }

    public static Connection getConnection(String user, String password)throws HRException {
        if (instance == null) {
            instance = new ConnectionPool();
        }
        try {
            return ds.getConnection(user, password);
        } catch (SQLException e) {
            e.printStackTrace();//TODO must be removed
            throw new HRException("User or Password is incorrect");
        }
    }
}


Автор: carper 6.6.2011, 09:55
Цитата(RuslanY @  2.6.2011,  23:50 Найти цитируемый пост)
но все равно не уверен,что все правильно,


Честно говоря, лень разбираться с пулом как таковым, но можно сразу сказать, что:
1. Вот тут лежит пример :
http://www.rgagnon.com/javadetails/java-0545.html

Обратите внимание на задействование кэша ( у вас этого нет вообще), а то потом будете задавать вопросы о том, почему так много соединений.
И на наличие других полезных методов.

2. Ваш код не будет нормально работать в многопоточном приложении, из-за отсутствия синхронизации.

3. Передача пароля как строки настоятельно не рекомендуется.

Автор: RuslanY 7.6.2011, 02:03
Цитата

Передача пароля как строки настоятельно не рекомендуется.

А как же тогда его передавать?

спасибо за ответ. замечание по поводу кеша очень кстати,сейчас буду исправлять.

Автор: carper 7.6.2011, 09:00
Цитата(RuslanY @  7.6.2011,  02:03 Найти цитируемый пост)
А как же тогда его передавать?


Обычно как char[].
char[] are mutable (Strings are immutable) so we can clear the passwords after the usage.

Впрочем, все зависит от того, как и где вы будете использовать свой метод.
Вполне вероятно, что в вашем конкретном случае String вполне оправданное решение, так что я слегка погорячился. smile

Я вообще для Oracle подумал бы о proxy authentication, что позволит при утечке пароля конечного пользователя не дать злоумышленнику соединиться с базой минуя ваше приложение.



Автор: RuslanY 8.6.2011, 00:11
Цитата(carper @  7.6.2011,  09:00 Найти цитируемый пост)
Я вообще для Oracle подумал бы о proxy authentication, что позволит при утечке пароля конечного пользователя не дать злоумышленнику соединиться с базой минуя ваше приложение.


спасибо,но я пишу не рабочий вариант... это просто у меня задание такое,чтоб оценить уровень моих знаний.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)