Java Web应用程序和PostgreSQL上的Websphere自由

我正在Docker上的websphere-liberty上部署一个可用的Tomcat webapp。 该Web应用程序连接到docker上的postgres数据源。 在websphere中,当我试图获得连接

DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres"); Connection conn = ds.getConnection(); 

我的web.xml被设置为:

 <resource-ref> <description>postgreSQL Connection</description> <res-ref-name>jdbc/postgres</res-ref-name> <res-type>javax.sql.XADataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 

我得到以下错误

 javax.naming.NamingException: CWNEN1001E: The object referenced by the java:comp/env/jdbc/postgres 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/postgres reference. The exception message was: CWNEN1004E: The server was unable to find the jdbc/postgres default binding with the javax.sql.XADataSource type for the java:comp/env/jdbc/postgres reference.] 

我排除这是一个dockernetworking的问题。 我所犯的错误是什么? 在我的网站是自由的东西吗?

server.xml是

 <server description="Default server"> <!-- Enable features --> <featureManager> <feature>webProfile-7.0</feature> <feature>adminCenter-1.0</feature> <feature>jdbc-4.0</feature> </featureManager> <quickStartSecurity userName="admin" userPassword="password"/> <!-- Define the host name for use by the collective. If the host name needs to be changed, the server should be removed from the collective and re-joined. --> <!-- <variable name="defaultHostName" value="localhost" /> --> <!-- Define an Administrator and non-Administrator --> <basicRegistry id="basic"> <user name="admin" password="admin" /> <user name="nonadmin" password="nonadminpwd" /> </basicRegistry> <!-- Assign 'admin' to Administrator --> <administrator-role> <user>admin</user> </administrator-role> <!-- <keyStore id="defaultKeyStore" password="Liberty" /> --> <httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443" /> <remoteFileAccess> <writeDir>${server.config.dir}</writeDir> </remoteFileAccess> <library id="postgres-lib"> <fileset dir="/arturial/project/" includes="postgresql-9.4.1208.jre6.jar"/> </library> <dataSource id="jdbc-Prima_WA_db" jndiName="jdbc/postgres" type="javax.sql.DataSource"> <jdbcDriver libraryRef="postgres-lib"/> <connectionManager numConnectionsPerThreadLocal="10" id="connectionManager" minPoolSize="1"/> <!-- <properties.oracle user="postgres" password="postgres" - url="jdbc:postgres://172.17.0.3:5432/Prima_WA_db"/> --> </dataSource> <!-- <applicationManager updateTrigger="disabled"/> <application id="primawebapp" name="primawebapp" location="war/primawebapp" type="war"> <classLoader delegation="parentLast" commonLibraryRef="postgres-lib"/> </application> --> </server> 

尝试这个;

 DataSource ds = (DataSource)ctx.lookup("jdbc/postgres"); 

另外, 一个不同的方式 。

您的<datasource>必须在其下configuration属性,否则Liberty无法知道如何连接到您的数据库。

对于postgresql,请尝试以下configuration:

 <dataSource id="jdbc-Prima_WA_db" jndiName="jdbc/postgres"> <jdbcDriver libraryRef="postgres-lib"/> <properties serverName="172.17.0.3" portNumber="5432" databaseName="Prima_WA_db" user="postgres" password="postgres"/> </dataSource> 

当然,使用正在运行的postgresql实例所对应的正确值。

看起来您的数据源定义可能不完整,请尝试使用以下命令进行更新:

 <dataSource type="javax.sql.XADataSource" ... <jdbcDriver javax.sql.XADataSource="org.postgresql.xa.PGXADataSource" ...