Sat*_*ala 20 java tomcat jndi connection-pooling java-ee
我正在使用JNDI来创建tomcat连接池.它在Web应用程序中运行良好.我相信InitialContext是由tomcat服务器提供的.
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("jdbc/testdb");
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从独立的Java程序调用相同的实用程序时,initContext对象为null.如何显式提供Context对象所期望的所有必需属性.
错误:javax.naming.NoInitialContextException:需要在环境或系统属性或applet参数或应用程序资源文件中指定类名:java.naming.factory.initial
小智 24
这是一个根据已接受的答案进行调整的示例,但是为了避免创建额外的类而内联所有内容.
public static void main(String[] args) {
setupInitialContext();
//do something that looks up a datasource
}
private static void setupInitialContext() {
try {
NamingManager.setInitialContextFactoryBuilder(new InitialContextFactoryBuilder() {
@Override
public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) throws NamingException {
return new InitialContextFactory() {
@Override
public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
return new InitialContext(){
private Hashtable<String, DataSource> dataSources = new Hashtable<>();
@Override
public Object lookup(String name) throws NamingException {
if (dataSources.isEmpty()) { //init datasources
MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
ds.setURL("jdbc:mysql://localhost:3306/mydb");
ds.setUser("mydbuser");
ds.setPassword("mydbpass");
dataSources.put("jdbc/mydbname", ds);
//add more datasources to the list as necessary
}
if (dataSources.containsKey(name)) {
return dataSources.get(name);
}
throw new NamingException("Unable to find datasource: "+name);
}
};
}
};
}
});
}
catch (NamingException ne) {
ne.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以创建自己的自定义上下文.
LocalContext ctx = LocalContextFactory.createLocalContext();
ctx.addDataSource("jdbc/testdb", driverName, url, usr, pwd);
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅使用Application Server数据源的本地运行Bean.
UPDATE
你可以使用org.springframework.mock.jndi.SimpleNamingContextBuilderSpring 类.例如:
建立:
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind("jdbc/Oracle", ods);
builder.activate();
Run Code Online (Sandbox Code Playgroud)使用:
DataSource ds = InitialContext.doLookup("jdbc/Oracle");
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
33695 次 |
| 最近记录: |