1

警告:Java 新手

我有一个简单的 Netbeans 项目 - 我只想了解如何与来自 php 的 DB 进行交互,我想我会尝试在我的计算机上运行一个本地项目。

很多例子都说使用 InitialContext() 对象来引用数据库资源。

遵循示例后,我得到以下异常 - 许多 Google 的东西都指向一些 .xml 文件 - 我不知道它甚至不知道它在 Netbeans 项目中的位置?我现在没有使用 Web 服务器,所以没有使用 Tomcat 或类似的东西,只是本地 Java 程序来执行此操作,我怀疑这可能是问题所在。任何人都可以对此有所了解吗?

Exception thrown 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.


package learningjava;
import com.mysql.jdbc.jdbc2.optional.*;
import com.mysql.jdbc.Driver;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.*;



public class LearningJava {

    public static void main(String[] args) {

       MysqlDataSource test_db = new MysqlDataSource(); 

       test_db.setServerName("localhost");
       test_db.setDatabaseName("dev");

       try {

            InitialContext test_db_context = new InitialContext();
            test_db_context.bind("jcdb/testdb", test_db);
            MysqlDataSource test_db_datasource = (MysqlDataSource)test_db_context.lookup("testdb");

       } catch (NamingException e) {

           System.out.println("Exception thrown " + e);

       }
        try {

            test_db.getConnection("root","password");

        } catch (SQLException e) {

             System.out.println("Exception thrown " + e);

        }


    }    

}
4

3 回答 3

2

您可以尝试在以下内容之前添加此内容InitialContext test_db_context = new InitialContext();

System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");

您应该在类路径中包含 jar 命名-common-4.1.34 和 mysql-connector-java-5.1.6

这个例子对我有用(未优化但有效!)

public static void main(String[] args) throws NamingException {
        // Create initial context
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
        System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");

        InitialContext ic = new InitialContext();
        ic.createSubcontext("java:");
        ic.createSubcontext("java:comp");
        ic.createSubcontext("java:comp/env");
        ic.createSubcontext("java:comp/env/jdbc");

         MysqlConnectionPoolDataSource mysqlConnectionPoolDataSource = new MysqlConnectionPoolDataSource();
         mysqlConnectionPoolDataSource.setUser("root");
         mysqlConnectionPoolDataSource.setPassword("root");
         mysqlConnectionPoolDataSource.setURL("jdbc:mysql://localhost:3306/test_my_database");

         ic.bind("java:comp/env/jdbc/test", mysqlConnectionPoolDataSource);

    }
于 2012-07-09T13:30:37.457 回答
0

一般来说,您应该了解 JNDI 应该有一个服务器。在您提供的代码片段中,当您进行查找时,您正在使用 JNDI 技术的 _CLIENT_SIDE_ 部分。应该有一个可以从本地客户端连接访问的 JNDI 服务器。一旦正确配置,对查找的调用应该发出与 JNDI 服务器的连接,并提供一种获取/绑定资源到该服务器的方法。

如何正确配置 JNDI?

通常您应该提供一个属性文件,该文件将包含此服务器的主机名、端口 + 一些特定于实现的信息。

当您使用应用程序服务器(如 JBoss 或 Web Sphere)时,通常已经提供了 JNDI 服务器。我认为这是误解的根源。

希望这可以帮助

于 2012-07-09T13:30:41.977 回答
0

通常 JNDI 用于应用程序服务器内部,这不是您的情况。

根据您的需要,您可以使用以下代码:

Class.forName("com.mysql.jdbc.Driver")
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dbname", "user", "password");

此外,您还需要在此处下载 MySQL 驱动程序并将相应的 JAR 文件 (mysql-connector-java-5.1.21-bin.jar) 添加到您的应用程序的类路径中,这里描述了如何执行此操作

于 2012-07-09T13:33:55.687 回答