Java 我的JDBC连接池有什么问题?

Java 我的JDBC连接池有什么问题?,java,mysql,jsp,jdbc,Java,Mysql,Jsp,Jdbc,我正在为MySQL数据库连接池开发一个类 public class ConnectionPool { private static ConnectionPool pool = null; private static DataSource dataSource = null; public synchronized static ConnectionPool getInstance() { if (pool == null) {

我正在为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();
        }
    }
}
但是,它在这里抛出了一个异常: {

但是,我有一个名为music的mysql数据库,mysql应该正确配置:

我不知道为什么它会抛出空指针异常


谢谢

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

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


为什么要编写连接池类?您正在执行JNDI查找,这意味着您有一个正在运行的命名服务。这些通常是Java EE应用程序服务器的一部分,该服务器可能内置了一个连接池。为什么不直接使用它呢?如果不是,我会使用其他人编写的连接池。它的编写肯定比您编写的任何东西都好D编写。

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

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


为什么要编写连接池类?您正在执行JNDI查找,这意味着您有一个正在运行的命名服务。这些通常是Java EE应用程序服务器的一部分,该服务器可能内置了一个连接池。为什么不直接使用它呢?如果不是,我会使用其他人编写的连接池。它的编写肯定比您编写的任何东西都好'd write.

在访问数据源之前使用这行代码 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");

这解决了我的问题,可能会帮助您在访问数据源之前使用这行代码 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");

这解决了我的问题,可能会帮助您

我看到的空指针的唯一可能性是数据源为空。您在代码中创建数据源的位置/方式?我看到的空指针的唯一可能性是数据源为空。您在代码中创建数据源的位置/方式?