2013-05-04 34 views
1

我正在爲MySQL數據庫連接池創建一個類。我的JDBC連接池有什麼問題?

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(); 
    } 

不過,我有一個MySQL數據庫稱爲音樂和MySQL應該正確配置:

enter image description here

我不是確定它爲什麼會拋出空指針異常。

謝謝

+0

唯一的方法可行,我看到了空指針是數據源爲空。你在哪裏/如何在代碼中創建數據源? – 2013-05-05 03:41:45

回答

4

我不認爲這是一個很好的連接池實現。爲什麼?看起來游泳池是空的。這可能不是線程安全的。沒有連接檢查。

如果你打印或記錄堆棧跟蹤,它會告訴你到底哪一行有NPE。我的猜測是JNDI查找失敗,所以數據源爲空。

你爲什麼寫一個連接池類?你正在做一個JNDI查詢,這意味着你有一個命名服務正在運行。這些通常是Java EE應用服務器的一部分,該服務器可能內置了連接池。爲什麼不使用它?如果不是,我會用別人寫的。它保證比你寫的任何東西都寫得更好。

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"); 

這解決了我的問題,可能會幫助你