JNDI InitialContext无法在简单的netbeans项目中工作

时间:2012-07-09 13:03:14

标签: java exception netbeans jndi

警告:Java新手

我有一个简单的Netbeans项目 - 我想学习与来自php的数据库进行交互我认为我可以使用在我的计算机上运行的本地程序。

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

按照这些示例后,我得到以下异常 - 很多谷歌的东西指向一些.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);

        }


    }    

}

3 个答案:

答案 0 :(得分:1)

您可以尝试在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 naming-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);

    }

答案 1 :(得分:0)

一般来说,你应该明白JNDI应该有一台服务器。在您执行查找时,您已经提供了使用JNDI技术的_CLIENT_SIDE_部分的代码段。应该可以从本地客户端连接访问JNDI服务器。 正确配置后,对查询的调用应该与JNDI服务器建立连接,并提供获取/绑定该服务器资源的方法。

如何正确配置JNDI?

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

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

希望,这有帮助

答案 2 :(得分:0)

通常JNDI在应用程序服务器中使用,而不是你的情况。

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

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

此外,您需要下载MySQL驱动程序here并将相应的JAR文件(mysql-connector-java-5.1.21-bin.jar)添加到应用程序的类路径here is described how to do it