Класс не найден загрузка JDBC org.postgresql.Driver - PullRequest
16 голосов
/ 26 октября 2011

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

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

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

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

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

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

}

Как я написал в заголовке, когда я запускаю проект, и класс запрашивает соединение с этим классом, я всегда получаю исключение Class 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;
}

Ответы [ 3 ]

24 голосов
/ 26 октября 2011

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

...

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

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


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

Смотри также:

3 голосов
/ 03 марта 2017

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

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1203-jdbc4</version>
    </dependency>
3 голосов
/ 26 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...