gpt4 book ai didi

java - 尝试绑定(bind) dbcp 的 BasicDataSource 时出现 javax.naming.OperationNotSupportedException

转载 作者:太空宇宙 更新时间:2023-11-04 14:46:43 24 4
gpt4 key购买 nike

我正在使用 Apache 的 commons DBCP 1.4 版本的 Jar。我正在遵循通过 fscontex 绑定(bind) BasicDataSource 的 JNDI 示例。如以下链接http://commons.apache.org/proper/commons-dbcp/guide/jndi-howto.html提供的代码所示.

我编写了类似的独立代码,但出现以下错误“javax.naming.OperationNotSupportedException:只能绑定(bind)引用或可引用对象”。根据我的知识,任何想要引用的对象都必须实现 javax.naming.Referenceable 接口(interface)并定义 getReference 方法。我不确定 BasicDataSource 是否这样做?

这是我使用过的代码。

import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class DBCPTest {

public static void main(String[] args) {
try {
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
System.setProperty(Context.PROVIDER_URL, "file:///F:/JNDI/");
InitialContext ic = new InitialContext();

// Construct BasicDataSource
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("org.apache.commons.dbcp2.TesterDriver");
bds.setUrl("jdbc:apache:commons:testdriver");
bds.setUsername("username");
bds.setPassword("password");

ic.rebind("jdbc/basic", bds);

// Use
InitialContext ic2 = new InitialContext();
DataSource ds = (DataSource) ic2.lookup("jdbc/basic");

Connection conn = ds.getConnection();
conn.close();

} catch (Exception e) {
e.printStackTrace();
}
}
}

这是我的类路径中的 JAR 列表

  • commons-dbcp-1.4.jar
  • commons-ppol-1.6.jar
  • fscontext.jar
  • providerutil.jar
  • jndi.jar

任何有关解决此问题或指出我做错了什么的见解都将受到赞赏。

谢谢厘米

最佳答案

浏览网页后,我确实找到了一种通过基于文件的上下文绑定(bind)BasicDataSource的方法。我使用了以下链接提供的示例

http://www.massapi.com/class/javax/naming/StringRefAddr.java.html

System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
System.setProperty(Context.PROVIDER_URL, "file:///F:/JNDI/");

Reference ref = new Reference("javax.sql.DataSource","org.apache.commons.dbcp.BasicDataSourceFactory", null);
ref.add(new StringRefAddr("driverClassName","com.ibm.db2.jcc.DB2Driver");
ref.add(new StringRefAddr("url","jdbc:db2://myhost.example.com:port/dbname");
ref.add(new StringRefAddr("password", "SomePassord");
ref.add(new StringRefAddr("username", "myUser");

ref.add(new StringRefAddr("maxActive","100"));
ref.add(new StringRefAddr("maxWait", "10000"));
ref.add(new StringRefAddr("maxIdle", "10"));
ref.add(new StringRefAddr("minIdle", "5"));

ref.add(new StringRefAddr("testOnBorrow", "true"));
ref.add(new StringRefAddr("testOnReturn", "false"));
ref.add(new StringRefAddr("testWhileIdle","true"));
ref.add(new StringRefAddr("validationQuery","SELECT 1"));

ref.add(new StringRefAddr("timeBetweenEvictionRunsMillis",Integer.toString(10*60*1000)));
ref.add(new StringRefAddr("minEvictableIdleTimeMillis",Integer.toString(2*60*1000)));
ref.add(new StringRefAddr("numTestsPerEvictionRun","10"));

ref.add(new StringRefAddr("removeAbandoned", "true"));
ref.add(new StringRefAddr("removeAbandonedTimeout", Integer.toString(30*60)));
ref.add(new StringRefAddr("logAbandoned", "true"));

Context ctx = new InitialContext();
ctx.rebind("jdbc/MyDataSource",ref)
ctx.close();

关于java - 尝试绑定(bind) dbcp 的 BasicDataSource 时出现 javax.naming.OperationNotSupportedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com