1

PostgresJDBCドライバーを介してJava1.7とPostgresを使用しています。データベース接続は、Webサービスから使用されます。テスト中に、次のエラーが発生しました。

FATAL: connection limit exceeded for non-superusers

接続を静的にし、1回だけ作成することで、エラーを解決しました。私の質問は、静的接続は安全ですか?これはこれを行う正しい方法ですか?

私は次のようなConnectionFactoryを介した接続を使用しています:

public class ConnectionFactory
{

   String driverClassName = "org.postgresql.Driver";
   String connectionUrl = "jdbc:postgresql://localhost:5432/dbName";
   String dbUser = "user";
   String dbPwd = "password";
   private static ConnectionFactory connectionFactory = null;
   private static Connection conn = null;

   private ConnectionFactory()
   {
      try
      {
         Class.forName(driverClassName);
      }
      catch (ClassNotFoundException e)
      {
         e.printStackTrace();
      }
   }
   public Connection getConnection() throws SQLException
   {
      if (conn == null)
      {
         conn = DriverManager.getConnection(connectionUrl, dbUser, dbPwd);
      }
      return conn;
   }

   public static ConnectionFactory getInstance()
   {
      if (connectionFactory == null)
      {
         connectionFactory = new ConnectionFactory();
      }
      return connectionFactory;
   }
}
4

2 に答える 2

1

申し訳ありませんが、元の投稿ではコードを注意深く調べていませんでした。わお。まだ読めません。とにかく、3回目が魅力です。コードがシングルスレッドの場合は、問題ありません。マルチスレッドの場合は、Commons接続プールなどを使用して接続を管理します。ドライバーはスレッドセーフのようですが、接続はスレッドセーフと見なされるべきではありません。したがって、ドライバーがロードされると、複数のスレッドからドライバーでgetConnectionを安全に呼び出すことができますが、接続をスレッド間で共有しないでください。

于 2013-03-03T19:54:03.710 に答える
1

Postgres JDBCドライバーはスレッドセーフとして文書化されており、必要に応じて複数のスレッドで接続を使用できます。別のスレッドが接続を使用しているときにスレッドが接続を使用しようとすると、他のスレッドが現在の操作を終了するまで待機します。

接続プールは、パフォーマンス上の理由からとにかく使用できます。

于 2013-03-03T20:13:45.993 に答える