Java подключение к нескольким базам данных - PullRequest
3 голосов
/ 13 декабря 2011

Я создаю Java-приложение, которое подключается к нескольким базам данных.Пользователь сможет выбрать базу данных, к которой он хочет подключиться, из выпадающего списка.

Затем программа подключается к базе данных, передавая имя методу, который создает начальный контекст, чтобы он мог общаться с источником данных веб-логики oracle.

public class dbMainConnection {

    private static dbMainConnection conn = null;
    private static java.sql.Connection dbConn = null;
    private static javax.sql.DataSource ds = null;
    private static Logger log = LoggerUtil.getLogger();

    private dbMainConnection(String database) {

         try {

            Context ctx = new InitialContext();

            if (ctx == null) {
                log.info("JDNI Problem, cannot get InitialContext");
            }

                database = "jdbc/" + database;
                log.info("This is the database string in DBMainConnection" + database);
                ds = (javax.sql.DataSource) ctx.lookup (database);


        } catch (Exception ex) {
            log.error("eMTSLogin: Error in dbMainConnection while connecting to the database : " + database, ex);
        }

    }

    public Connection getConnection() {

        try {

            return ds.getConnection();

        } catch (Exception ex) {
            log.error("Error in main getConnection while connecting to the database : ", ex);
            return null;
        }

    }

    public static dbMainConnection getInstance(String database) {

        if (dbConn == null) {
            conn = new dbMainConnection(database);
        }

        return conn;

    }

    public void freeConnection(Connection c) {
        try {
            c.close();
            log.info(c + "  is now closed");
        } catch (SQLException sqle) {
            log.error("Error in main freeConnection : ", sqle);
        }
    }

}

Моя проблема в том, что произойдет, если, скажем, кто-то забудет создать источник данных для базы данных, но все равно добавит его в раскрывающийся список?Прямо сейчас, что происходит, если я пытаюсь подключиться к базе данных, которая не имеет источника данных, он ошибается, говоря, что не может установить соединение.Это то, что я хочу, но если я подключаюсь к базе данных, у которой сначала есть источник данных, который работает, затем пытаюсь подключиться к базе данных, у которой нет источника данных, снова она выдает ошибку

javax.naming.NameNotFoundException: Невозможно разрешить jdbc.peterson.Решено 'JDBC';оставшееся имя "петерсон".

Что опять-таки можно ожидать, но что меня смущает, так это то, что он захватывает последнее хорошее соединение, предназначенное для другой базы данных, и обрабатывает все так, как будто ничего не произошло.

Кто-нибудь знает, почемуто есть?Является ли weblogic кешированием соединения или что-то как отказоустойчивое?Это плохая идея для создания связей таким образом?

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

Вы храните уникальный источник данных (и соединения, и dbMainConnection) в статической переменной вашего класса.Каждый раз, когда кто-то запрашивает источник данных, вы заменяете предыдущий новым.Если при получении источника данных из JNDI возникает исключение, статический источник данных остается без изменений.Вы не должны хранить что-либо в статической переменной.Так как ваш класс dbMainConnection создается с именем базы данных, и существует несколько имен баз данных, нет смысла делать его одноэлементным.

Просто используйте следующий код для доступа к источнику данных:

public final class DataSourceUtil {
    /**
     * Private constructor to prevent unnecessary instantiations
     */
    private DataSourceUtil() {
    }

    public static DataSource getDataSource(String name) {
        try {
            Context ctx = new InitialContext();
            String database = "jdbc/" + name;
            return (javax.sql.DataSource) ctx.lookup (database);
        }
        catch (NamingException e) {
            throw new IllegalStateException("Error accessing JNDI and getting the database named " + name);
        }
    }
}

И пусть вызывающие получат соединение из источника данных и закроют его, когда закончат его использовать.

0 голосов
/ 13 декабря 2011

Вы перехватываете исключение JNDI при поиске несуществующего источника данных, но ваш синглтон по-прежнему сохраняет ссылку на ранее просмотренный источник данных.Как говорит AB Cade, нулевая ссылка на ds при исключении или даже до этого.

На более общей ноте, возможно, использование Singleton - не лучшая идея.

...