我正在使用Websphere Portal 7.0并使用RAD 8.0创建一个portlet.我的portlet正在尝试与远程服务器建立db2连接.我在本地编写了一个java程序来与服务器建立基本的JDBC连接,并从表中获取记录.代码工作正常; 但是,当我将代码添加到我的portlet以及db2jcc4.jar时,连接不起作用.我正在使用基本的:
Connection connection = DriverManager.getConnection("jdbc:db2://server:port/db:user=user;password=pw;");
Run Code Online (Sandbox Code Playgroud)
我认为使用Websphere数据源是正确的方法.我知道数据源的JNDI名称,但我没有找到关于如何建立连接的明确示例.有几个例子使用了一个DataSource类(我输入了这个类,这看起来好像它来自一个原生的java包,所以我在这里使用什么导入?)加上一个Context.我遇到过如下代码:
Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");
Run Code Online (Sandbox Code Playgroud)
...有人可以为我打破这个吗?
编辑1
我根据列出的答案更新了我的代码.我真的觉得我越来越近了.这是我的getConnection()方法:
private Connection getConnection() throws SQLException {
javax.naming.InitialContext ctx = null;
javax.sql.DataSource ds = null;
System.out.println("Attempting connection..." + DateUtil.now() );
try {
ctx = new javax.naming.InitialContext();
ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/db");
connection = ds.getConnection();
} catch (NamingException e) {
System.out.println("peformanceappraisalstatus: COULDN'T CREATE CONNECTION!");
e.printStackTrace();
}
System.out.println("connection: " + connection.getClass().getName() + " at " + DateUtil.now());
return connection;
}
Run Code Online (Sandbox Code Playgroud)
我的整个web.xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app …
Run Code Online (Sandbox Code Playgroud) 我想将连接URL存储在我的Tomcat应用程序的JNDI绑定中.由于Tomcat context.xml
用于JNDI资源定义,我需要找出存储String(或多个连接的多个字符串)的属性方法context.xml
.
我这样做的原因是我可以为不同的环境定义不同的字符串,并通过JNDI加载它们.
通常,我看到这样的条目:
<Context ...>
<Resource name="someName" auth="Container"
type="someFullyQualifiedClassName"
description="Some description."/>
</Context>
Run Code Online (Sandbox Code Playgroud)
这真的很简单:
<Context ...>
<Resource name="myConnectionURL" auth="Container"
type="java.lang.String"
description="A connection URL string."/>
</Context>
Run Code Online (Sandbox Code Playgroud)
如果是这样,我在哪里实际存储String值?!?!如果它不正确,那么我存储的正确方法是什么,例如" amqp:5272//blah.example.com¶m1=4
",context.xml
所以我可以这样查找:
Context ctx = new InitialContext();
String connectionURL = (String)ctx.lookup("myConnectionURL");
Run Code Online (Sandbox Code Playgroud)
提前致谢!
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/multiDS");
connection = dataSource.getConnection();
Run Code Online (Sandbox Code Playgroud)
请帮我模仿上面的代码.
嗨汤姆安德森
我尝试了下面的代码
@BeforeClass
public static void setUpClass() throws Exception {
// rcarver - setup the jndi context and the datasource
try {
// Create initial context
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES,
"org.apache.naming");
Context ic = new InitialContext();
ic.createSubcontext("java:");
ic.createSubcontext("java:comp");
ic.createSubcontext("java:comp/env");
ic.createSubcontext("java:comp/env/jdbc");
ic.createSubcontext("java:comp/env/jdbc/multiDS");
// Construct DataSource
OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
ds.setURL("jdbc:oracle:thin:@g9u0696.houston.hp.com:1525:CRNAD");
ds.setUser("uname");
ds.setPassword("pwd");
} catch (NamingException ex) {
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
但它给出的错误是:
com.hp.corona.common.exception.CacheException: org.apache.naming.NamingContext cannot be cast to javax.sql.DataSource …
Run Code Online (Sandbox Code Playgroud) 我正在使用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
我有以下环境设置:
我很想知道如何编写可以引用应用程序服务器提供的JNDI数据源的Java客户端(即Web应用程序之外)的代码.
Sun Application Server的端口都是默认端口.在服务器配置中有一个名为jdbc/xxxx的JNDI数据源,但我注意到Web应用程序的Hibernate配置使用名称java:comp/env/jdbc/xxxx.
到目前为止,我见过的大多数例子都涉及代码
Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");
Run Code Online (Sandbox Code Playgroud)
但似乎我要么使用错误的JNDI名称,要么我需要配置jndi.properties或其他配置文件来正确指向监听器?我有来自Sun Application Server的appserv-rt.jar,里面有一个jndi.properties,但似乎没什么帮助.
这里有一个类似的问题,但它没有给出任何代码/指的是让iBatis自动获取JNDI数据源:从Web容器外部访问数据源(通过JNDI)
我有一个工作代码片段,我可以通过它来验证用户dn
和密码.我的要求是用户将输入他的用户名(sAMAccountName
),我想使用sAMAccountName
和密码进行身份验证.如何修改此代码才能实现?
String userName = "John P R-Asst General Manager";
String passWord = "asdfgh123";
String base ="OU=SOU,DC=example,DC=com";
String dn = "cn=" + userName + "," + base;
String ldapURL = "ldap://mdsdc3.example.com:389";
authEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
authEnv.put(Context.PROVIDER_URL, ldapURL);
authEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
authEnv.put(Context.SECURITY_PRINCIPAL, dn);
authEnv.put(Context.SECURITY_CREDENTIALS, password);
try {
DirContext authContext = new InitialDirContext(authEnv);
return true;
} catch (NamingException namEx) {
return false;
}
Run Code Online (Sandbox Code Playgroud) 正如标题所暗示的那样,"javax.naming.NoInitialContextException"在非技术术语中意味着什么?有什么一般建议来解决它?
编辑(从控制台):
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.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:25)
at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:10)
at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:30)
at cepars.review.Test.main(Test.java:43)
java.lang.NullPointerException
at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:31)
at cepars.review.Test.main(Test.java:43)
cepars.app.DAOException
at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:39)
at cepars.review.Test.main(Test.java:43)
Run Code Online (Sandbox Code Playgroud) 我需要知道我对上述内容的理解是否正确.
在连接池中,使用java.sql.Datasource设置多个连接.
在jdbc中,我们直接指定连接url和oracle.jdbc.driver.OracleDriver,它始终是一个连接,其中另一个请求必须等到连接完成处理.
使用JNDI,它类似于直接jdbc,我们通过名称引用jdbc设置,以便我们可以在应用程序服务器中指定连接URL和其他设置,而不是将它们绑定到应用程序,对吧?
我有两个选项来配置我的应用程序数据库连接 - 一个使用JDBC,另一个使用JNDI.就这些连接类型与数据库的工作速度而言,最佳选择是什么.
我理解这些是使用不同原则的两种不同类型的数据库连接(JDBC是直接数据库连接,JNDI是应用程序服务器端的数据库连接池配置).但是否有其他一般的JDBC/JNDI优缺点可能比运行速度更重要?如果是的话,他们是什么?
为什么java.sql.Connection无法在下面的代码中强制转换为oracle.jdbc.OracleConnection?
我的主要目标是传递给Oracle连接新用户名并将其保存在例如'osuser'列的'SESSION'表中,因为我想跟踪数据库用户更改并将其显示在表中.
@Repository
public class AuditLogDAOImpl implements AuditLogDAO {
@PersistenceContext(unitName="myUnitName")
EntityManager em;
@Resource(name = "dataSource")
DataSource dataSource;
public void init() {
try {
Connection connection = DataSourceUtils.getConnection(dataSource);
OracleConnection oracleConnection = (OracleConnection) connection; //Here I got cast exception!
String metrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = "my_new_username";
oracleConnection.setEndToEndMetrics(metrics, (short) 0);
java.util.Properties props = new java.util.Properties();
props.put("osuser", "newValue");
oracleConnection.setClientInfo(props);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误日志:
10:42:29,251 INFO [STDOUT] org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@bcc8cb
10:42:51,701 ERROR [STDERR] java.lang.ClassCastException: $Proxy286 cannot be cast to oracle.jdbc.OracleConnection …
Run Code Online (Sandbox Code Playgroud)