我正在研究一个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:
我不确定它为什么抛出空指针异常。
由于
答案 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");
这解决了我的问题,可能会帮到你