Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat MySQL连接数据源不工作_Java_Tomcat_Jdbc - Fatal编程技术网

Java Tomcat MySQL连接数据源不工作

Java Tomcat MySQL连接数据源不工作,java,tomcat,jdbc,Java,Tomcat,Jdbc,我在我的应用程序中硬编码DB连接,现在我正在努力使其更好。问题是我似乎做了所有该做的事,但还是失败了 1-下载适合您平台的二进制发行版,提取JAR文件,并将其复制到“$CATALINA_HOME/lib”——完成 2-将MySQL数据库配置为JNDI资源。作为应用程序上下文元素中的资源和应用程序“WEB-INF/WEB.xml”文件中的资源引用 它在“ds=(DataSource)ctxt.lookup(“java:comp/env/jdbc/storagerDB”)上失败 线程“main”ja

我在我的应用程序中硬编码DB连接,现在我正在努力使其更好。问题是我似乎做了所有该做的事,但还是失败了

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

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

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

线程“main”javax.naming.NoInitialContextException中的异常:需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中指定:java.naming.factory.initial
位于javax.naming.spi.NamingManager.getInitialContext(未知源)
位于javax.naming.InitialContext.getDefaultInitCtx(未知源)
位于javax.naming.InitialContext.getURLOrDefaultInitCtx(未知源)
位于javax.naming.InitialContext.lookup(未知源)
位于com.wordpress.belichev.model.DataAccessObject.(DataAccessObject.java:58)
位于com.wordpress.belichev.model.DataAccessObject.main(DataAccessObject.java:279)

您获得此
NoInitialContextException
的原因是您将此应用程序作为独立应用程序运行。这将忽略您的web.xml文件以及所有资源定义。你需要把它作为一个网络应用来运行,甚至给它一个工作的机会


在下一行中获得NPE(如您在评论中所述)是因为您的应用程序在上下文查找后未找到数据源。这是一个不同的问题,可能也与web.xml的使用有关。我建议看一看,看看要点。

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

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