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