【问题标题】:Tomcat MySQL Connection DataSource not workingTomcat MySQL连接数据源不起作用
【发布时间】:2015-11-12 19:01:56
【问题描述】:

我在我的应用程序中对数据库连接进行了硬编码,现在我正在努力让它变得更好。问题是我似乎做了所有应该做的事情,但它仍然失败了。

1- 下载适合您平台的二进制分发包,提取 JAR 文件,并将其复制到“$CATALINA_HOME/lib” - 完成。

2- 将您的 MySQL 数据库配置为 JNDI 资源。作为应用程序上下文元素中的资源和应用程序“WEB-INF/web.xml”文件中的资源引用。

<Resource name="jdbc/storagerDB"

            auth="Container"

            type="javax.sql.DataSource"

            username="root"

            password="admin"

            driverClassName="com.mysql.jdbc.Driver"

            url="jdbc:mysql:/localhost:3306/storagerDB"

            maxActive="15"

            maxIdle="3"/>

 <resource-ref>
<description>MySQL Datasource example</description>
<res-ref-name>jdbc/storagerDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>

public class DataAccessObject {

private CustomLogger logger = new CustomLogger(DataAccessObject.class);

private Statement stmt;
private Connection conn;
private DataSource ds;
private Context ctxt;

/**
 * Queries that creates the db.
 */
private static final String[] DB_CREATION_QUERIES = new String[] {

        "CREATE DATABASE IF NOT EXISTS storagerDB;", "USE storagerDB;",

        "CREATE TABLE IF NOT EXISTS user(id int NOT NULL PRIMARY KEY AUTO_INCREMENT,"
                + "username varchar(25) NOT NULL, password varchar(250) NOT NULL,"
                + "salt varchar(250) NOT NULL, email varchar(35) NOT NULL);",

        "CREATE TABLE IF NOT EXISTS header(id int NOT NULL PRIMARY KEY AUTO_INCREMENT,"
                + "user_id int, Foreign Key (user_id) REFERENCES user(id)," + "server varchar(50) NOT NULL,"
                + "content_type varchar(50) NOT NULL," + "status_code int NOT NULL," + "url varchar(250) NOT NULL);"

};

/**
 * Constructor JDBC driver could be initialized and loaded in Tomcat/lib
 * @throws NamingException 
 */
public DataAccessObject() {
    try {
        ctxt = new InitialContext();
        ds = (DataSource)ctxt.lookup("java:comp/env/jdbc/storagerDB");
        conn = ds.getConnection();

        stmt = conn.createStatement();

        for (String query : DB_CREATION_QUERIES) {
            stmt.execute(query);
        }

    }   catch (SQLException | NamingException e) {
        logger.logExceptionMessage("DAO constructor SQL", e.getStackTrace());
    }

}

在“ds = (DataSource)ctxt.lookup("java:comp/env/jdbc/storagerDB")”上失败。

Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.wordpress.belichev.model.DataAccessObject.<init>(DataAccessObject.java:58)
at com.wordpress.belichev.model.DataAccessObject.main(DataAccessObject.java:279)

【问题讨论】:

  • 谁执行了你的代码?它是否运行/被 Tomcat 调用,或者您是否尝试将其作为 Java 独立应用程序启动? (最后一个选项不会这样工作!)
  • 嗯,实际上我将它作为独立运行只是为了更容易调试,在 Tomcat 中它失败,下一行出现 NullPointer 异常 - conn = ds.getConnection();
  • 可能是配置中的错误。请尝试在 localhost 前使用两个斜杠:jdbc:mysql://localhost:3306/storagerDB(但在 tomcat 中!)
  • Tx 的响应,我试过了,但它仍然抛出空指针。
  • 关于你之后得到的 NPE,我最好的猜测是你错过了“作为应用程序上下文元素中的资源”这一部分(我怀疑这是因为你没有在此处复制该文件)。我说的是本教程的第二点:mkyong.com/tomcat/how-to-configure-mysql-datasource-in-tomcat-6。

标签: java tomcat jdbc


【解决方案1】:

您收到此NoInitialContextException 的原因是您将此应用程序作为独立应用程序运行。这将简单地忽略您的 web.xml 文件,以及您的所有资源定义。您需要将它作为 web 应用程序运行,才能让它有机会工作。

在下一行中获取 NPE(正如您在评论中提到的)是由于您的应用在上下文查找后没有找到数据源。这是一个不同的问题,可能也与您的 web.xml 使用有关。我建议看看这个post 以了解要点。

【讨论】:

猜你喜欢
  • 2016-01-31
  • 1970-01-01
  • 2016-09-29
  • 2013-01-29
  • 2017-08-12
  • 2021-10-03
  • 2013-01-02
  • 2022-08-23
  • 2012-12-20
相关资源
最近更新 更多