Я работаю над веб-проектом, и я недавно установил 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;
}
Я работаю над веб-проектом, и я недавно установил postgres 9.1.1
...
Я добавил его в путь сборки java , используя свойства проекта через eclipse.
Это неправильный путь. Этот JAR должен быть удален прямо в папке /WEB-INF/lib
веб-проекта без использования пути сборки в свойствах проекта. Эта папка является стандартной частью пути к среде выполнения Webapp.
Несвязанный к конкретной проблеме: у вас есть главный недостаток дизайна в вашем классе DBConnection
. Вы объявили Connection
как static
, который по существу делает ваше соединение не потокобезопасным. Используйте пул соединений и никогда не назначайте Connection
(и Statement
и ResultSet
) как переменную класса/экземпляра. Они должны быть созданы и закрыты в том же блоке try-finally
, где вы выполняете запрос. Кроме того, у вас есть также инъекционное отверстие SQL. Используйте PreparedStatement
вместо конкатенации контролируемых пользователем переменных в строке SQL.
dataSource.getConnection()
на DriverManager.getConnection(url, username, password)
если вы еще не собираетесь использовать пул соединений).
Первое, что я сделал, это распаковать банку и подтвердить, что драйвер действительно находится там как org.postgresql.Driver
. Я замечаю, глядя на jarfinder и связанные сайты, что нет баннер Postgres 9.x, содержащий org.postgresql.Driver
.
Добавьте эту зависимость в свой pom:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1203-jdbc4</version>
</dependency>
Добавить в основной класс:
DriverManager.registerDriver(new org.postgresql.Driver());
connect()
? Похоже, плохая идея. Лучше:if (connection == null || connection.isClosed()) { ... do connect ... }
.