使用WebSphere Liberty Profile 8.5设置数据源

9

我的Web应用正在使用以下方式从JNDI获取数据源:

javax.naming.InitialContext ctx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource) 
    ctx.lookup("java:comp/env/jdbc/db");

在应用程序的WEB-INF/web.xml中,我有以下内容:
<resource-ref>
    <description>DataSource</description>
    <res-ref-name>jdbc/db</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在应用程序的WEB-INF/ibm-web-bnd.xml文件中,我有以下内容:
<web-bnd
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
    version="1.0">
    <virtual-host name="default_host"/>
    <resource-ref name="jdbc/db" binding-name="jdbc/db"/>
</web-bnd>

在WebSphere Liberty Profile的server.xml文件中,我有以下内容(只保留相关部分):
<server description="new server">

    <featureManager>
        <feature>jsp-2.2</feature>
        <feature>jdbc-4.0</feature>
    </featureManager>

    <library id="oracle-lib">
        <fileset dir="lib" includes="ojdbc5_g.jar"/>
    </library>

    <dataSource jndiName="jdbc/db" jdbcDriverRef="oracle-driver" type="javax.sql.DataSource">
        <jdbcDriver libraryRef="oracle-lib" id="oracle-driver"/>
        <connectionManager numConnectionsPerThreadLocal="10" id="ConnectionManager" minPoolSize="1"/>
        <properties user="user" password="password"
                    url="jdbc:oracle:thin:@//db-server:1521/db"/>
    </dataSource>

</server>

当应用程序尝试从JNDI获取数据源时,会出现以下错误:
CWNEN0030E: The @Resource factory encountered a problem getting
the object instance jdbc/oracle binding object.  The exception message was: 
failed to resolve jdbc/oracle to javax.sql.DataSource: 
javax.naming.NameNotFoundException: 
Intermediate context does not exist: jdbc/oracle

我在这里缺少什么?

3个回答

12

WebSphere服务器配置文件server.xml

<server>    
    <featureManager>
        <feature>jndi-1.0</feature>
        <feature>jdbc-4.1</feature>
    </featureManager>

    <httpEndpoint id="defaultHttpEndpoint"
                  host="localhost"
                  httpPort="9080"
                  httpsPort="9443" />

    <library id="oracle-lib">
        <fileset dir="lib" includes="ojdbc6_g.jar"/>
    </library>

    <dataSource jndiName="jdbc/oracle">
        <jdbcDriver libraryRef="oracle-lib"/>
        <properties.oracle user="orbeon" password="password"
                           url="jdbc:oracle:thin:@//localhost:1521/orbeon"/>
    </dataSource>

    <application name="orbeon" location="war/orbeon" type="war">
        <classloader commonLibraryRef="oracle-lib"/>
    </application>    
</server>

WEB-INF/ibm-web-bnd.xml

<web-bnd version="1.0"
        xmlns="http://websphere.ibm.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd">
    <virtual-host name="default_host"/>
    <resource-ref name="jdbc/oracle" binding-name="jdbc/oracle"/>
</web-bnd>

WEB-INF/web.xml

<resource-ref>
    <res-ref-name>jdbc/oracle</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

资源注入(替代web.xml + ibm-web-bnd.xml):

@Resource(lookup = "jdbc/oracle")
DataSource ds;

我有Websphere Liberty Profile 8.5.5.9,它不需要WEB-INF/ibm-web-bnd.xml。此外,对于我的应用程序,仅包含ojdbc jar是不够的,还需要orai18n jar。<library id="oracle-lib"><fileset dir="C:\jars\oracle11g" /></library>可以正常工作。 - sigint

3
我们在Liberty 8.5.5上使用DB2,并且在server.xml中进行配置。
<dataSource id="db2" isolationLevel="TRANSACTION_READ_COMMITTED" jndiName="jdbc/db2" type="javax.sql.DataSource">
    <jdbcDriver>
        <library>
            <fileset dir="/usr/lib/java/ibm-db2-universal-driver" includes="db2jcc4.jar, db2jcc_license_cisuz.jar, db2jcc_license_cu.jar"/>
        </library>
    </jdbcDriver>

    <properties.db2.jcc databaseName="DB2T" portNumber="21020" serverName="db2t.lvm.de"/>
    <containerAuthData password="{xor}KzspMC04" user="tdvorg"/>
</dataSource>

也许这会有所帮助。
罗伯特

是的,像您所做的那样将<library>放在<dataSource>中对我有效。然而,我最终遇到了ClassCastException,因为驱动程序中的类由2个不同的类加载器加载:应用程序中的类加载器和驱动程序的类加载器。(我确信在许多情况下这是可以的,只要您不直接使用驱动程序类即可。)因此,我恢复了顶级库声明并使其正常工作。我使用了自己的设置回答了我的问题,但这绝对有所帮助! - avernet
3
如果数据库实例不是公共数据库,你可能需要隐藏用户名和密码。 - danial
我们是否有类似WAS中的图形用户界面(GUI)来完成这些更改? - Venkata Ramireddy CH

0
在我的情况下,下面的解决方案对我很有效。
我在Eclipse中创建了一个名为“资源”的“通用项目”。在这个项目中,我创建了一个名为dataSource.xml的文件,并填充了以下内容:
<server>
    <dataSource id="ccm" jndiName="jdbc/ccm" type="javax.sql.DataSource">
        <jdbcDriver id="oracle-driver" libraryRef="oracle-lib"/>
        <connectionManager id="ConnectionManager" minPoolSize="1" numConnectionsPerThreadLocal="10"/>
        <properties.oracle password="password" url="jdbc:oracle:thin:@128.1.30.150:1521:ccmdes" user="ccm"/>
    </dataSource>

   <library id="oracle-lib">
        <fileset dir="C:\Oracle\product\10.1.0\Client_1\jdbc\lib" includes="ojdbc14_g.jar"/>
    </library>

    <jdbcDriver id="oracle" libraryRef="oracle-lib"/>

</server>

我可以在Eclipse中拖放此文件以进行服务器配置,或者在server.xml中创建该行:

<include location="${shared.config.dir}/dataSource.xml"/>

文件server.xml是这样的:

<server description="new server">

    <!-- Enable features -->
    <featureManager>
        <feature>jsp-2.3</feature>
        <feature>adminCenter-1.0</feature>
        <feature>jdbc-4.1</feature>
        <feature>jndi-1.0</feature>
        <feature>servlet-3.1</feature>
    </featureManager>

    <httpEndpoint host="localhost" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>

    <applicationMonitor updateTrigger="mbean"/>                 

<!-- Define your admin user name and password -->
    <quickStartSecurity userName="admin" userPassword="password"/>

<!-- Define a keystore for the HTTPS port -->
    <keyStore id="defaultKeyStore" password="Liberty"/> 

<!-- Allows remote file access for config changes -->
<remoteFileAccess>
  <writeDir>${server.config.dir}</writeDir>
</remoteFileAccess> 

    <!-- <applicationMonitor updateTrigger="mbean"/> -->
    <webApplication id="TestPage" location="TestPage.war" name="TestPage"/>
    <webApplication id="MonitoriaAtendimento" location="MonitoriaAtendimento.war" name="MonitoriaAtendimento"/>

    <include location="${shared.config.dir}/dataSource.xml"/>
</server>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接