私はWebプロジェクトに取り組んでおり、最近postgres 9.1.1をインストールしました
Postgresqlサーバーが稼働しています。通常どおりpsql経由で接続でき、8.5から作成したdbのダンプからすべてがロードされ、適切に保存されます。
そのため、9.1 postgresバージョン用のJDBC4ドライバーもここからダウンロードしました。 http://jdbc.postgresql.org/download/postgresql-jdbc-9.1-901.src.tar.gz
Eclipseを介してプロジェクトプロパティを使用して、Javaビルドパスに追加しました。
これは、他のクラスへのdb接続を提供するために使用するコードです(つまり、シングルトンであり、既存のものが閉じているかnullの場合にのみ、一度に1つのオブジェクトからのみ新しい接続を取得します)
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);
}
}
}
}
プロジェクトの実行時にタイトルに書いたように、クラスがこのクラスへの接続を要求すると、常にorg.postgresql.Driver.classをロードできないため、Class Not Found例外が発生します。プロジェクトのサブフォルダー〜/ 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;
}
私はwebプロジェクトに取り組んでおり、最近postgres 9.1.1をインストールしました
...
これをJavaビルドパスプロジェクトプロパティの使用 Eclipse経由で追加しました。
それは間違った方法です。そのJARは、プロジェクトのプロパティでBuild Pathをいじることなく、Webプロジェクトの/WEB-INF/lib
フォルダーに直接ドロップする必要があります。そのフォルダーは、webappのランタイムクラスパスの標準部分です。
無関係具体的な問題:DBConnection
クラスに大きな設計上の欠陥があります。 Connection
をstatic
として宣言しました。これにより、基本的に接続が確立されますスレッドセーフではない。接続プールを使用し、Connection
(またはStatement
もResultSet
)もクラス/インスタンス変数として割り当てないでください。クエリを実行している場所とまったく同じtry-finally
ブロックで作成して閉じる必要があります。さらに、SQLインジェクションホールもあります。 SQL文字列内のユーザー制御変数を連結する代わりに、PreparedStatement
を使用します。
この依存関係をpomに追加します。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1203-jdbc4</version>
</dependency>
最初に行うことは、jarファイルを展開し、ドライバーがorg.postgresql.Driver
。 jarfinderや関連サイトを見ると、org.postgresql.Driver
。