我正在研究IBM发布的Managing database connections with JDBC。这是一些旧的东西(2001年)。他们正在使用JNDI。当我尝试实现他们的代码时:
try {
Hashtable env = new Hashtable();
env.put(
Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
// Create the initial context
Context ctx = new InitialContext(env);
// Here we create the actual DataSource and then set the relevant
// parameters.
TdsDataSource ds = new TdsDataSource();
ds.setServerName(serverName);
ds.setPortNumber(portNumber);
ds.setDatabaseName(databaseName);
ds.setUser(login);
ds.setPassword(password);
ds.setDescription("JDBC DataSource Connection");
// Now we bind the DataSource object to the name we selected earlier.
ctx.bind(filePath, ds);
ctx.close();
// Generic Exception handler, in practice, this would be replaced by an
// appropriate Exception handling hierarchy.
} catch (Exception ex) {
System.err.println("ERROR: " + ex.getMessage());
}
但我发现没有“com.sun.jndi.fscontext.RefFSContextFactory”文件系统服务提供程序。然后我按如下方式更改了代码(来自Initialize Data Source Properties)。
OracleDataSource ods = new OracleDataSource();
ods.setDriverType("oci");
ods.setServerName("dlsun999");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("816");
ods.setPortNumber(1521);
ods.setUser("scott");
ods.setPassword("tiger");
Context ctx = new InitialContext();
ctx.bind("jdbc/sampledb", ods);
当我尝试执行此代码时,出现以下错误:
ERROR: 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
我认为它仍然要求Context.INITIAL_CONTEXT_FACTORY。有解决方案吗我从早上开始寻找它。
答案 0 :(得分:1)
在创建InitialContext
对象之前尝试包含以下行。它应该解决问题。
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
这基本上告诉System
您用于存储数据源上下文的初始上下文库。
答案 1 :(得分:0)
如果您可以发布StactTrace或有关运行此代码的容器/服务器的任何详细信息,将会很有帮助。
DataSource对象和JNDI Context是两种不同的资源,尽管它们一起使用。 JNDI
是一个存储库,可以保存由名称之类的路径标识的对象。 DataSource
是一个对象,其中包含使用JDBC建立数据库连接的信息。要提供对DataSource的系统范围访问,其对象将使用键绑定到JNDI,以便可以在系统内全局查找。
好像您的问题与JNDI提供程序库有关。您无需为此更改DataSource实现库(从TdsDataSource
更改为OracleDataSource
)。
可能这个细节可以帮助您或发布更多细节以了解您的运行时环境。