【发布时间】:2016-09-07 12:53:00
【问题描述】:
我有一个 WebSphere Liberty 16.0.0.2 web 应用程序,我使用 JPA 使用 Derby DB 在我的笔记本电脑上开发并在本地运行它来处理数据库。我曾经使用 SQLDB(2016 年 5 月被 IBM 淘汰)将它部署到 Bluemix 中,并且在服务的自动连接中一切正常。由于 SQLDB 不再可用,我能够在 Bluemix 上找到的唯一免费 SQL 是 ElephantSQL,但是自动装配似乎不起作用。这是我在部署后得到的错误:
Program error occured: CWWJP0013E: The server cannot locate the java:comp/env/jdbc/TriReplicatorDB data source for the TriReplicatorPersistenceUnit persistence unit because it has encountered the following exception: javax.naming.NamingException: CWNEN1001E: The object referenced by the java:comp/env/jdbc/TriReplicatorDB JNDI name could not be instantiated. If the reference name maps to a JNDI name in the deployment descriptor bindings for the application performing the JNDI lookup, make sure that the JNDI name mapping in the deployment descriptor binding is correct. If the JNDI name mapping is correct, make sure the target resource can be resolved with the specified name relative to the default initial context. [Root exception is com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/jdbc/TriReplicatorDB reference. The exception message was: CWNEN1006E: The server was unable to obtain an object for the jdbc/TriReplicatorDB binding with the javax.sql.DataSource type. The exception message was: java.sql.SQLNonTransientException: DSRA4000E: A valid JDBC driver implementation class was not found for the jdbcDriver jdbcDriver[myDerbyJDBCdriver] using the library com.ibm.ws.classloading.sharedlibrary_79. [/home/vcap/app/wlp/usr/servers/triServer/lib/postgresql-jdbc-9.4.1209.jar]].
我上传网络应用的方式是打包服务器并使用cf push 命令。这是生成的 server.xml 文件:
<server description="new server">
<!-- Enable features -->
<featureManager>
<feature>jsp-2.3</feature>
<feature>concurrent-1.0</feature>
<feature>jaxrs-2.0</feature>
<feature>jaxrsClient-2.0</feature>
<feature>jpa-2.1</feature>
<feature>appSecurity-2.0</feature>
<feature>localConnector-1.0</feature>
<feature>icap:managementConnector-1.0</feature>
<feature>appstate-1.0</feature>
<feature>jdbc-4.1</feature>
<feature>cloudAutowiring-1.0</feature>
</featureManager>
<httpEndpoint httpPort="${port}" id="defaultHttpEndpoint" host="*"/>
<webContainer deferServletLoad="false" trustHostHeaderPort="true" extractHostHeaderPort="true"/>
<applicationMonitor updateTrigger="mbean"/>
<!-- This is the application itself -->
<webApplication contextRoot="/" id="Tri-Replicator" location="Tri-Replicator.war" name="Tri-Replicator">
</webApplication>
<jdbcDriver id="myDerbyJDBCdriver">
<library name="DerbyLib">
<fileset dir="C:\projects_c\Tri-Replicator-16\db\db-derby-10.11.1.1-bin\lib" includes="derby.jar"/>
<fileset dir='${server.config.dir}/lib' includes='postgresql-jdbc-9.4.1209.jar'/>
</library>
</jdbcDriver>
<!-- Use local Derby DB for local testing on laptop, but when deployed into BlueMix this will automatically be rewired to use SQL DB instance -->
<dataSource id="DerbyConnection" jdbcDriverRef="myDerbyJDBCdriver" jndiName="jdbc/TriReplicatorDB">
<properties createDatabase="create" databaseName="${cloud.services.ElephantSQL-tri-replicator.connection.name}" user="${cloud.services.ElephantSQL-tri-replicator.connection.user}" password="${cloud.services.ElephantSQL-tri-replicator.connection.password}" serverName="${cloud.services.ElephantSQL-tri-replicator.connection.host}" portNumber="${cloud.services.ElephantSQL-tri-replicator.connection.port}"/>
</dataSource>
<include location='runtime-vars.xml'/>
<httpDispatcher enableWelcomePage='false'/>
<config updateTrigger='mbean'/>
<appstate appName='Tri-Replicator' markerPath='${home}/../.liberty.state'/>
作为替代问题 - 任何人都可以建议其他小型免费计划用于 Bluemix 中的 SQL 数据库吗? PostgreSQL 和 DB2 不提供免费计划。
【问题讨论】:
-
这里发生的事情是 Liberty buildpack 在您的 server.xml 上执行了自动配置并添加了正确的 JDBC 驱动程序,但忘记使用正确的
javax.sql.DataSource属性更新dataSource元素。这看起来像一个错误。请在Liberty buildpack project 报告此问题。
标签: java postgresql jdbc ibm-cloud websphere-liberty