Класс не найден загрузка JDBC org.postgresql.Driver

14

Я работаю над веб-проектом, и я недавно установил postgres 9.1.1

Сервер postgresql запущен и работает. Я могу подключиться через psql, как обычно, и все загружено и правильно сохранено из дампа db, сделанного из 8.5.

Итак, я также загрузил драйвер JDBC4 для версии 9.1 postgres здесь: http://jdbc.postgresql.org/download/postgresql-jdbc-9.1-901.src.tar.gz

Я добавил его в путь сборки java, используя свойства проекта через eclipse.

Это код, который я использую для обеспечения соединения db с другими классами (т.е. это singleton, я получаю новое соединение только в том случае, если существующее является либо закрытым, либо нулевым, из одного объекта за раз)

public abstract class DBConnection {
private static Connection connection = null;

public static void connect() {
    try {
        if (connection == null) {
            String host = "127.0.0.1";
            String database = "xxxxx";
            String username = "xxxxx";
            String password = "xxxxx";
            String url = "jdbc:postgresql://" + host + "/" + database;
            String driverJDBC = "org.postgresql.Driver";
            Class.forName(driverJDBC);
            connection = DriverManager.getConnection(url, username,
                    password); //line firing the class not found exception

        } else if (connection.isClosed()) {
            connection = null;
            connect();
        }
    } catch (SQLException e) {
        e.printStackTrace(System.err);
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
}

public static void disconnect() {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            Logger.getLogger(DBConnection.class.getName()).log(
                    Level.SEVERE, null, e);
        }
        }
    }

    public static Connection getConnection() {

        try {
            if (connection != null && !connection.isClosed()) {
                return connection;
            } else {
                connect();
                return connection;
            }
        } catch (SQLException e) {
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE,
                    null, e);
            return null;
        }
    }

    @Override
    public void finalize() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                Logger.getLogger(DBConnection.class.getName()).log(
                        Level.SEVERE, null, e);
            }
        }
    }

}

Как я писал в заголовке, когда я запускаю проект, а класс запрашивает подключение к этому классу, я всегда получаю исключение класса Not Found, так как он, по-видимому, не может загрузить org.postgresql.Driver.class. Драйвер находится в подпапке проекта ~/lib/org.postgresql-9.1-901.jdbc4.jar и, как я уже сказал, добавлен в путь сборки через свойства проекта eclipse.

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

public static final User validateUserCredentials(String id, String pswd) {
    Connection connection = DBConnection.getConnection();
    Logger.getLogger(Credentials.class.getName()).log(Level.SEVERE, (connection!=null)?"connection not null":"connection null");
    Statement stmt = null;
    Logger.getLogger(Home.class.getName()).log(Level.SEVERE, "validating credentials for user: username : " + id + " password : " + pswd);
    String sql = "Select * from fuser where id = '" + id + "'";
    ResultSet resultset = null;
    try {
        stmt = connection.createStatement();
        resultset = stmt.executeQuery(sql);
        Logger.getLogger(Credentials.class.getName())
                .log(Level.SEVERE, sql);
        resultset.next();
        String password = resultset.getString("pswd");
        if (pswd.equals(password))
            return new User(id, pswd);
    } catch (SQLException ex) {

        Logger.getLogger(Credentials.class.getName()).log(Level.SEVERE,
                null, ex);
    } finally {
        if (stmt != null)
            stmt = null;

        if (resultset != null)
            resultset = null;
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {

            }
            connection = null;
        }
    }
    return null;
}
  • 0
    Рекурсия в вашем методе connect() ? Похоже, плохая идея. Лучше: if (connection == null || connection.isClosed()) { ... do connect ... } .
  • 0
    ну, это не очень удобно, но я получаю исключение с самого начала, и соединение изначально пустое ... Я проверяю, хотя ... Я волнуюсь, потому что раньше все работало нормально, пока я не обновился до версии Postgres
Показать ещё 3 комментария
Теги:
jdbc

4 ответа

25
Лучший ответ

Я работаю над веб-проектом, и я недавно установил postgres 9.1.1

...

Я добавил его в путь сборки java , используя свойства проекта через eclipse.

Это неправильный путь. Этот JAR должен быть удален прямо в папке /WEB-INF/lib веб-проекта без использования пути сборки в свойствах проекта. Эта папка является стандартной частью пути к среде выполнения Webapp.


Несвязанный к конкретной проблеме: у вас есть главный недостаток дизайна в вашем классе DBConnection. Вы объявили Connection как static, который по существу делает ваше соединение не потокобезопасным. Используйте пул соединений и никогда не назначайте ConnectionStatement и ResultSet) как переменную класса/экземпляра. Они должны быть созданы и закрыты в том же блоке try-finally, где вы выполняете запрос. Кроме того, у вас есть также инъекционное отверстие SQL. Используйте PreparedStatement вместо конкатенации контролируемых пользователем переменных в строке SQL.

См. также:

  • 0
    спасибо, я имел дело со многими изменениями, которые я не заметил. Да, я знаю, что это не потокобезопасно. Мне нужно что-то работающее в краткосрочной перспективе, спасибо за решение и предложения (Это мой первый веб-проект, назначение курса)!
  • 0
    Пожалуйста. Я бы посоветовал проверить последнюю из ссылок «Смотрите также», чтобы найти более конкретный пример того, чего вы пытаетесь достичь (вам нужно только заменить dataSource.getConnection() на DriverManager.getConnection(url, username, password) если вы еще не собираетесь использовать пул соединений).
Показать ещё 2 комментария
3

Первое, что я сделал, это распаковать банку и подтвердить, что драйвер действительно находится там как org.postgresql.Driver. Я замечаю, глядя на jarfinder и связанные сайты, что нет баннер Postgres 9.x, содержащий org.postgresql.Driver.

  • 0
    Я уже проверил это. И из eclipse, и через filemanager он есть, ~ / org / postgresql / Driver.class - это файл размером 14,9 КБ :( спасибо
  • 0
    Очевидно, jarfinder выглядит не очень внимательно, потому что соответствующие файлы jar легко найти: jdbc.postgresql.org/download.html
1

Добавьте эту зависимость в свой pom:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1203-jdbc4</version>
    </dependency>
1

Добавить в основной класс:

DriverManager.registerDriver(new org.postgresql.Driver());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню