1

MySQL データベース接続プールのクラスに取り組んでいます。

public class ConnectionPool
{
    private static ConnectionPool pool = null;
    private static DataSource dataSource = null;

    public synchronized static ConnectionPool getInstance()
    {
        if (pool == null)
        {
            pool = new ConnectionPool();
        }
        return pool;
    }

    private ConnectionPool()
    {
        try
        {
            InitialContext ic = new InitialContext();
            dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/music");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public Connection getConnection()
    {
        try
        {
            return dataSource.getConnection();
        }
        catch (SQLException sqle)
        {
            sqle.printStackTrace();
            return null;
        }
    }

    public void freeConnection(Connection c)
    {
        try
        {
            c.close();
        }
        catch (SQLException sqle)
        {
            sqle.printStackTrace();
        }
    }
}

ただし、ここで例外がスローされます: {

  try
    {
        InitialContext ic = new InitialContext();
        dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/music");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

ただし、music という名前の mysql データベースがあり、mysql を正しく構成する必要があります。

ここに画像の説明を入力

null ポインター例外がスローされる理由がわかりません。

ありがとう

4

2 に答える 2

4

これは、接続プールの適切な実装とは言えません。なんで?プールは空っぽのようです。おそらくスレッドセーフではありません。接続チェックなし。

スタック トレースを印刷またはログに記録すると、どの行に NPE があるかが正確にわかります。私の推測では、JNDI ルックアップが失敗したため、データ ソースは null です。

なぜ接続プール クラスを作成するのですか? JNDI ルックアップを実行しています。これは、ネーム サービスが実行されていることを意味します。これらは通常、おそらく接続プールが組み込まれている Java EE アプリケーション サーバーの一部です。そうでない場合は、他の誰かが書いたものを使用します。あなたが書くどんなものよりも良く書かれていることが保証されています.

于 2013-05-04T23:52:26.247 に答える
0

データソースにアクセスする前に、このコード行を使用してください Context envContext = (Context)initContext.lookup("java:comp/env");

したがって、変更されたコードは次のようになります

InitialContext ic = new InitialContext();
Context envContext = (Context)ic.lookup("java:comp/env");
dataSource = (DataSource) envContext.lookup("java:/comp/env/jdbc/music");

これは私の問題を解決しました、あなたを助けるかもしれません

于 2013-05-07T07:29:32.710 に答える