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

时间:2013-05-04 23:47:07

标签: 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)
        {
            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:

enter image description here

我不确定它为什么抛出空指针异常。

由于

2 个答案:

答案 0 :(得分:4)

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

如果您打印或记录堆栈跟踪,它会告诉您具有NPE的确切行。我的猜测是JNDI查找失败,因此数据源为空。

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

答案 1 :(得分: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");

这解决了我的问题,可能会帮到你