启动连接池时数据源的NullPointerException

时间:2016-08-26 16:01:38

标签: java nullpointerexception database-connection connection-pooling

所以我在 context.xml 中有一个代码,其中包含我的数据库连接的信息

<?xml version="1.0" encoding="UTF-8"?>

<Resources name="jdbc/murach" auth="Containter"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/murach"
    username="root" password="root"
    maxActive="100" maxIdle="30" maxWait="10000"
    logAbandoned="true" removeAbandoned="true"
    removeAbandonedTimeout="60" type="javax.sql.DataSource" />

 <ResourceLink name="jdbc/murach"
         global="jdbc/mydb"
          type="javax.sql.DataSource" />

对于连接池,我创建了一个类来启动并将其连接到数据库。错误从getConnection()的方法开始。我可以问一下,我应该把它放在查找工作中。顺便说一下,NullPointerException

的返回错误为datasource.getConnection()
package lars.data;

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;


public class ConnectionPool {
    private static ConnectionPool pool = null;
    private static DataSource dataSource = null;

    private ConnectionPool() {
        try {
            InitialContext ic = new InitialContext();
            dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/murach");
            System.out.print(dataSource);
        } catch (NamingException e) {
            System.out.println(e);
        }
    }

    public static synchronized ConnectionPool getInstance() {
        if (pool == null) {
            pool = new ConnectionPool();
        }
        return pool;
    }

    public Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            System.out.println(e);
            return null;
        }
    }

    public void freeConnection(Connection c) {
        try {
            c.close();
        } catch (SQLException e) {
            System.out.println(e);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您的问题在于ResourceLink的配置,尤其是属性global的值,该值应与Resource中定义的值相匹配,应该是:< / p>

 <ResourceLink name="jdbc/murach"
         global="jdbc/murach"
          type="javax.sql.DataSource" />
  

global :全局JNDI中链接的全局资源的名称   上下文。

     

name :要创建的资源链接的名称,相对于   java:comp/env上下文。

NB 1:定义资源的节点名称为Resource而非Resources。换句话说,它应该是:

<Resource name="jdbc/murach" ... />

注意2:您应该尝试ic.lookup("java:comp/env/jdbc/murach")