我正在尝试在JDBC connection pool
中实施JBoss EAP 6.4
。我使用JBoss EAP 6.1+ adapter
IDE中的Eclipse Luna
和Jboss EAP management console
来管理此服务器。
我的应用程序使用的数据库是Oracle 11g SE
。我正在使用的JDBC jar版本是Oracle Database 12c Release 1 (12.1.0.1) JDBC Driver
以下是我遵循的步骤:
将JDBC jar部署为独立应用程序。为此,我将jar放在jboss-eap-6.4\standalone\deployments
目录中。然后我从eclipse重新启动服务器,我可以看到服务器自动将JDBC jar识别为符合Type 4的驱动程序。
然后,我使用JBoss EAP管理控制台UI创建并配置了数据源。我能够使用UI成功测试连接。以下是用户在standalone.xml
目录中的jboss-eap-6.4\standalone\configuration
文件中创建的条目
<datasource jta="true" jndi-name="java:/MyWebServiceOracleDs" pool-name="MyWebService" enabled="true" use-ccm="true" statistics-enabled="true">
<connection-url>jdbc:oracle:thin:@//myIp:1521/myDbName</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<driver>ojdbc7.jar</driver>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>50</max-pool-size>
<prefill>true</prefill>
<use-strict-min>true</use-strict-min>
</pool>
<security>
<user-name>myUsername</user-name>
<password>myPassword</password>
</security>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<timeout>
<set-tx-query-timeout>false</set-tx-query-timeout>
<blocking-timeout-millis>0</blocking-timeout-millis>
<idle-timeout-minutes>5</idle-timeout-minutes>
<query-timeout>0</query-timeout>
<use-try-lock>0</use-try-lock>
<allocation-retry>0</allocation-retry>
<allocation-retry-wait-millis>0</allocation-retry-wait-millis>
</timeout>
<statement>
<prepared-statement-cache-size>32</prepared-statement-cache-size>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</datasource>
&#13;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
InitialContext context = null;
DataSource dataSource = null;
Connection conn = null;
try
{
// Create a Database Connection
context = new InitialContext();
dataSource = (DataSource) context.lookup("java:/MyWebServiceOracleDs");
conn = dataSource.getConnection();
&#13;
一旦我在服务器上运行更新的代码并运行我的单元测试,我就会得到以下异常:
javax.naming.NamingException: Lookup failed for 'java:/MyWebServiceOracleDs' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: No object bound for java:/MyWebServiceOracleDs [Root exception is java.lang.NullPointerException]]
javax.naming.NamingException: Lookup failed for 'java:/MyWebServiceOracleDs' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: No object bound for java:/MyWebServiceOracleDs [Root exception is java.lang.NullPointerException]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at com.myprj.business.MyWebServiceImpl.doSomethings(MyWebServiceImpl.java:250)
at com.myprj.webservice.MyWebService.doSomethings(MyWebService.java:64)
at com.myprj.test.SomeFunctionality.doSomethingsTest(SomeFunctionality.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: javax.naming.NameNotFoundException: No object bound for java:/MyWebServiceOracleDs [Root exception is java.lang.NullPointerException]
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:229)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:471)
... 29 more
Caused by: java.lang.NullPointerException
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:167)
... 30 more
&#13;
似乎我在查找服务器上创建的数据源时遇到问题。我在代码中使用其确切的JNDI名称。我可以直接在我的代码中引用JNDI资源,还是必须先在我的应用程序中在某个XML配置文件中定义它。
只是一些背景知识,我的应用程序是使用JAX-B annotations
创建的Web服务。我已将其创建为Dynamic Web Project
Eclipse工作区。
我正在尝试了解导致此问题的原因以及我如何解决此问题。