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:

在此处输入图像描述

我不确定它为什么会引发空指针异常。

谢谢

4

2 回答 2

4

我不认为这是一个很好的连接池实现。为什么?看起来游泳池是空的。它可能不是线程安全的。没有连接检查。

如果您打印或记录堆栈跟踪,它会准确地告诉您哪一行有 NPE。我的猜测是 JNDI 查找失败,所以数据源为空。

为什么要写一个连接池类?您正在执行 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 回答