javax.naming.NameNotFoundException:在 WebSphere Liberty 上
javax.naming.NameNotFoundException: on WebSphere Liberty
我正在尝试在 WebSphere Application Server Liberty 上使用配置为 JNDI 的数据源,但是我收到以下错误:
javax.naming.NameNotFoundException: java:comp/env/jdbc/myapp/master
Websphere 应用程序服务器中数据源的配置是:
<dataSource commitOrRollbackOnCleanup="commit" id="jdbc/myapp/master" jdbcDriverRef="ojdbc7" jndiName="jdbc/myapp/master">
<properties.oracle URL="jdbc:oracle:thin:@127.0.0.1:1521:xe" oracleRACXARecoveryDelay="0" password="xxxxxxxx" user="app_master">
</properties.oracle>
<connectionManager maxPoolSize="50"/>
</dataSource>
到数据库的连接是通过 servlet (jndi=jdbc/myapp/master) 中的这段代码建立的:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup(jndi);
setConnection(ds.getConnection());
System.out.println(getConnection().toString() );
我做错了什么?
java:comp/env
需要资源引用。您有以下选项可以解决该问题:
1) 使用资源注入 - 所以不要直接查找它(通过 InitialContext),只需在您的 servlet 中添加以下内容 class
@Resource(lookup = "jdbc/myapp/master", name="jdbc/myapp/master")
private DataSource dataSource;
2) 在您的 web.xml
中定义资源引用
<resource-ref>
<description>my datasource</description>
<res-ref-name>jdbc/myapp/master</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>CONTAINER</res-auth>
</resource-ref>
或者您也可以通过代码中的注释创建引用。
3) 使用直接 JNDI,没有引用(不是 Java EE 最佳实践)
DataSource ds = (DataSource) initCtx.lookup("jdbc/myapp/master");
除了其他答案中已经说明的内容外,您还应该检查您是否启用了jndi-1.0功能。这是查找在 Liberty 中不起作用的常见原因。
例如,在server.xml、
<featureManager>
<feature>jdbc-4.2</feature>
<feature>jndi-1.0</feature>
... other features that you use
</featureManager>
如果这也不足以让它工作,您还应该检查数据源所依赖的资源的配置,例如您在配置片段中引用的 id 为 ojdbc7 的 jdbcDriver提供。
我正在尝试在 WebSphere Application Server Liberty 上使用配置为 JNDI 的数据源,但是我收到以下错误:
javax.naming.NameNotFoundException: java:comp/env/jdbc/myapp/master
Websphere 应用程序服务器中数据源的配置是:
<dataSource commitOrRollbackOnCleanup="commit" id="jdbc/myapp/master" jdbcDriverRef="ojdbc7" jndiName="jdbc/myapp/master">
<properties.oracle URL="jdbc:oracle:thin:@127.0.0.1:1521:xe" oracleRACXARecoveryDelay="0" password="xxxxxxxx" user="app_master">
</properties.oracle>
<connectionManager maxPoolSize="50"/>
</dataSource>
到数据库的连接是通过 servlet (jndi=jdbc/myapp/master) 中的这段代码建立的:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup(jndi);
setConnection(ds.getConnection());
System.out.println(getConnection().toString() );
我做错了什么?
java:comp/env
需要资源引用。您有以下选项可以解决该问题:
1) 使用资源注入 - 所以不要直接查找它(通过 InitialContext),只需在您的 servlet 中添加以下内容 class
@Resource(lookup = "jdbc/myapp/master", name="jdbc/myapp/master")
private DataSource dataSource;
2) 在您的 web.xml
中定义资源引用
<resource-ref>
<description>my datasource</description>
<res-ref-name>jdbc/myapp/master</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>CONTAINER</res-auth>
</resource-ref>
或者您也可以通过代码中的注释创建引用。
3) 使用直接 JNDI,没有引用(不是 Java EE 最佳实践)
DataSource ds = (DataSource) initCtx.lookup("jdbc/myapp/master");
除了其他答案中已经说明的内容外,您还应该检查您是否启用了jndi-1.0功能。这是查找在 Liberty 中不起作用的常见原因。
例如,在server.xml、
<featureManager>
<feature>jdbc-4.2</feature>
<feature>jndi-1.0</feature>
... other features that you use
</featureManager>
如果这也不足以让它工作,您还应该检查数据源所依赖的资源的配置,例如您在配置片段中引用的 id 为 ojdbc7 的 jdbcDriver提供。