我正在编写一个将数据持久保存在数据库中的小型 Web 服务。我正在使用 WSO2 Application Server 5.2.1 和 Oracle Database XE 11g 并在 Windows 7 上进行开发/测试。
当我在 [AppServerHome]/repository/conf/tomcat/context.xml 中创建资源时,代码有效。当我改为在管理控制台下创建数据源并将其公开为 JNDI 数据源时,getConnection 调用失败并出现 SQLException。
如果我使用在管理控制台中创建的数据源通过管理控制台创建数据服务,则数据服务也可以工作。所以这应该表明数据源是有效的并且可以工作。
我尝试了 jdbc url 的不同变体:
jdbc:oracle:thin:@localhost:1521:xe jdbc:oracle:thin:@localhost:1521/xe jdbc:oracle:thin:@localhost:1521:XE jdbc:oracle:thin:@localhost:1521/XE
我还尝试检查“使用数据源工厂”选项,但并没有真正理解它的作用。它也没有明显的效果。
我尝试按照https://docs.wso2.com/display/AS520/Exposing+Datasources+as+JNDI+Resources上的说明进行操作,但它也没有效果。
谁能帮助解释为什么数据源不适用于 webapp 但 context.xml 资源是?我需要让数据源正常工作,以便在 context.xml 文件中没有纯文本密码,并且数据源和密码的管理严格通过 WSO2 管理控制台完成。
context.xml 中有效的资源是:
<Resource name="jdbc/db1" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
maxActive="100" maxIdle="30" maxWait="10000"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="user" password="aPasswordGoesHere"/>
我在管理控制台下创建的数据源包含以下信息:
数据源类型:关系型数据库 名称:MyDB 数据源提供者:默认 驱动:oracle.jdbc.OracleDriver 网址:jdbc:oracle:thin:@localhost:1521:xe 用户名:用户 密码:aPasswordGoesHere 公开为 JNDI 数据源: 名称:jdbc/db1 使用数据源工厂:未选中 JNDI 属性:未设置 数据源配置参数: (未进行任何更改)
以及我的 META-INF/context.xml 中的匹配 ResourceLink
<ResourceLink name="jdbc/db1" global="jdbc/db1" type="javax.sql.DataSource" />
用于获取 DataSource 的代码是:
连接连接; 尝试 { 数据源 ds; 上下文 ctx; 对象对象; ctx = new InitialContext(); obj = ctx.lookup(jndiName); ds = (DataSource) PortableRemoteObject.narrow(obj, DataSource.class); conn = ds.getConnection(); } 捕获(命名异常 e) { throw new DBException("从 JNDI 目录获取数据源失败:" + e.getMessage(), e); } 捕获(SQLException e) { throw new DBException("无法从连接池获取连接:" + e.getMessage(), e); }
我在 wso2carbon.xml 中得到的错误是:
TID:[0] [AS] [2016-02-04 15:14:57,007] 错误 {POCDAO} - 发生 DBException {POCDAO} DBException:无法从连接池获取连接:无法创建 PoolableConnectionFactory(侦听器拒绝连接并出现以下错误: ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID ) 在 JNDIConnectionDescriptor.getConnection(JNDIConnectionDescriptor.java:159) 在 JNDIConnectionDescriptor.getConnectionRO(JNDIConnectionDescriptor.java:49) 在 ConnectionManager.getConnectionRO(ConnectionManager.java:179) 在 BaseDAO.getConnection(BaseDAO.java:66) 在 server.POCServer.savePocs(POCServer.java:47) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180) 在 org.apache.cxf.jaxws.JAXWSMethodInvoker.performInvocation(JAXWSMethodInvoker.java:66) 在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 在 org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.invoke(AbstractJAXWSMethodInvoker.java:232) 在 org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:85) 在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:74) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 在 java.util.concurrent.FutureTask.run(FutureTask.java:262) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$2.run(ServiceInvokerInterceptor.java:126) 在 org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:131) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 在 org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 在 org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251) 在 org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234) 在 org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208) 在 org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) 在 org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:180) 在 org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293) 在 org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:212) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:755) 在 org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:268) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.wso2.carbon.statistics.webapp.RequestIntercepterValve.invoke(RequestIntercepterValve.java:43) 在 org.wso2.carbon.bam.webapp.stat.publisher.WebAppStatisticPublisherValve.invoke(WebAppStatisticPublisherValve.java:104) 在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:178) 在 org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke(CarbonTomcatValve.java:47) 在 org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:56) 在 org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47) 在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:141) 在 org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:156) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 在 org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:52) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1653) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745) 引起:org.apache.tomcat.dbcp.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory(监听器拒绝连接并出现以下错误: ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID ) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 在 JNDIConnectionDescriptor.getConnection(JNDIConnectionDescriptor.java:97) ... 58 更多 原因:java.sql.SQLException:侦听器拒绝连接并出现以下错误: ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID 在 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:743) 在 oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666) 在 oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 在 oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566) 在 org.apache.tomcat.dbcp.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 在 org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) 在 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) ... 61 更多 原因:oracle.net.ns.NetException:侦听器拒绝连接并出现以下错误: ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID 在 oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:275) 在 oracle.net.ns.NSProtocol.connect(NSProtocol.java:264) 在 oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1452) 在 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496) ... 68 更多