13 Replies Latest reply on Mar 27, 2002 4:24 AM by Dieter Bartmann

    javax.sql.DataSource JNDI name

    sealbb Newbie

      Hi there,

      I have my datasource successfully bound as:
      [rwdev] XA Connection pool rwdev bound to java:/rwdev

      but when i try to call this resource from my bean,
      or even just regular java file, i got this message:

      [AlbumMasterEJB] TRANSACTION ROLLBACK EXCEPTION:javax.naming.NamingException: javax.naming.NameNotFoundException: jdbc not bound; nested exception is:
      java.rmi.RemoteException: javax.naming.NamingException: javax.naming.NameNotFoundException: jdbc not bound

      any clue?...
      i have tried to call the "rwdev" resource like:
      java:comp/env/jdbc/rwdev
      or
      rwdev
      or
      jdbc/rwdev

      i am dead. any help?
      thanks.

        • 1. Re: javax.sql.DataSource JNDI name
          Cl Michel Newbie

          Hi,

          I experienced the same problem as yours, at the same time... I finally got the lookup working using a jboss.xml to have the datasource registered with the bean java:comp/env namespace.

          In short, two options:

          1) lookup the datasource as "java:/rwdev" and it should work, but the portability to other servers would not be ideal...

          2) use a jboss.xml file in addition to your ejb-jar.xml:


          <enterprise-beans>

          <ejb-name>YourBean</ejb-name>
          <resource-ref>
          <res-ref-name>jdbc/rwdev</res-ref-name>
          <resource-name>rwdevDS</resource-name>
          </resource-ref>

          </enterprise-beans>
          <resource-managers>
          <resource-manager res-class="org.jboss.jdbc.XADataSourceLoader">
          <res-name>rwdevDS</res-name>
          <res-jndi-name>java:/rwdev</res-jndi-name>
          </resource-manager>
          </resource-managers>


          Hope it will help...

          • 2. Re: javax.sql.DataSource JNDI name
            Jani Newbie

            well

            how do i get the DataSource from a java client not an EJB.
            I have failed to get the lookup of the DS.
            Is there any example or code available.

            greetz
            Jani

            • 3. Re: javax.sql.DataSource JNDI name
              David Jencks Master

              you can't access datasources outside the jboss vm. IMHO it is also a very bad idea architecturally, weblogic's implementation notwithstanding.

              • 4. Re: javax.sql.DataSource JNDI name
                Gudu Newbie

                Why is the implementation specific jboss.xml file necessary to achieve behavior as defined in the EJB spec? Or do I not understand the EJB spec?

                Is it possible to configure jboss to put JDBC datasources under java:comp by default and thus avoid putting a jboss.xml file in the EJB jar?

                • 5. Re: javax.sql.DataSource JNDI name
                  jian gao Newbie

                  But if I use the joss+tomcat as my J2EE environment, I want to use a servlet program to lookup a Datasource registered in JBoss (I use JBoss-2.4.3_Tomcat-3.2.3),Can I say that the servlet and JBoss are in same JVM? If so,to lookup a datasource from Jboss might not be a bad idea, OK?

                  • 6. Re: javax.sql.DataSource JNDI name
                    David Jencks Master

                    yes, in the same vm it is (performance-wise) ok, whether it is architecturally wise is another question. For instance, it ties your app to running tomcat + jboss in the same vm, and distributes data access code over several layers.

                    • 7. Re: javax.sql.DataSource JNDI name
                      Jay Wright Newbie


                      What if you have multiple ejbs that all use the same resource reference? Is there any way, in either the ejb-jar.xml or jboss.xml file to manage this without one entry per ejb?

                      Jay

                      • 8. Re: javax.sql.DataSource JNDI name
                        David Jencks Master

                        With cmp, you can specify the default datasource in the defaults section of jbosscmp-jdbc.xml.

                        With bmp, if you are willing to throw out portability, don't use a resource ref at all and just hardcode the global jndi name. If you want portability, since the local environment is per-bean, you have to set it up in each bean.

                        • 9. Re: javax.sql.DataSource JNDI name
                          Jay Wright Newbie


                          Yes, using BMP. Is there any issue using a JNDI name such as "jaguar/dataSource"? I'm still having problems accessing the datasource.

                          In my ejb-jar.xml file I include:
                          <resource-ref>
                          <res-ref-name>jaguarDS</res-ref-name>
                          <res-type>javax.sql.DataSource</res-type>
                          <res-auth>Container</res-auth>
                          </resource-ref>

                          In my jboss.xml I include:
                          <resource-ref>
                          <res-ref-name>jaguarDS</res-ref-name>
                          <resource-name>jaguar/dataSource</resource-name>
                          </resource-ref>

                          with each bean and:

                          <resource-managers>
                          <resource-manager res-class="org.jboss.jdbc.XADataSourceLoader">
                          <res-name>jaguarDS</res-name>
                          <res-jndi-name>java:/jaguar/dataSource</res-jndi-name>
                          </resource-manager>
                          </resource-managers>


                          my (truncated) mbean from jboss.jcml:


                          jaguar/dataSource
                          org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl

                          ...

                          • 10. Re: javax.sql.DataSource JNDI name
                            David Jencks Master

                            I think you don't specify res-class in resource-manager (you already specified it in ejb-jar.xml), and anyway the class you specify is wrong.

                            I think the resource-ref resource-name and resource-manager res-name have to match up
                            <resource-managers>
                            <resource-manager">
                            <res-name>jaguar/dataSource</res-name>
                            <res-jndi-name>java:/jaguar/dataSource</res-jndi-name>
                            </resource-manager>
                            </resource-managers>

                            There's a pretty good explanation of this in the dtd.

                            • 11. Re: javax.sql.DataSource JNDI name
                              Jay Wright Newbie


                              Maybe it's just friday afternoon, but this is just plain not working for me. Where is the DTD for jboss.xml?

                              Does anyone have an example of a properly configured OracleDriver DataSource with Connection Pooling?

                              Jay

                              • 12. Re: javax.sql.DataSource JNDI name
                                Charles Bradley Newbie

                                I got mine to work in the following manner:
                                (This is an incomplete, in process doc, but thought it might help!)



                                Instructions for setting up Jboss/Tomcat/Ant


                                1. Download Ant v1.4
                                http://jakarta.apache.org/builds/jakarta-ant/release/v1.4.1/bin/
                                2. Install Ant
                                http://www.jboss.org/online-manual/HTML/ch01s05.html

                                3. Download JBoss

                                4. Install JBoss and run it to test install
                                http://www.jboss.org/online-manual/HTML/ch01s06.html
                                *** Note: Instead of typing in ‘run’, type in ‘run_with_catalina.bat’

                                (It’s a good idea to read the pages between the previous URL and the next URL)

                                5. Run the examples…

                                a. Build the server and deploy it
                                http://www.jboss.org/online-manual/HTML/ch01s14.html

                                b. Build the client and run it
                                http://www.jboss.org/online-manual/HTML/ch01s15.html


                                6. Install the Oracle Drivers

                                Note: You can retrieve classes12.zip(The Oracle JDBC Thin Driver) from:
                                1.) Your computer, if you have the Oracle client installed, in the following directory:
                                C:\oracle\ora81\jdbc\lib
                                (or similar)
                                2.) You can download it from technet.oracle.com

                                Put jdbc driver (in this case classes12.zip) in jboss_home/lib/ext -->

                                7. Test the Oracle Data Source and Connection Pool by modifying the example Session Bean:

                                (In all of the below, the bold code[stuff between and ] is the stuff to insert)
                                (Also, anywhere there is a your****, you should replace that text with the appropriate stuff for your stuff)

                                a. Put the following lines in the “InterestBean” class of the JBOSS_DIST/examples dir.


                                //
                                import javax.sql.*;
                                import javax.naming.*;
                                //


                                ….
                                public double calculateCompoundInterest(double principle,
                                double rate, double periods)
                                {
                                System.out.println("Someone called `calculateCompoundInterest!'");
                                //
                                // put this code into this method at this spot
                                try {
                                Context initial = new InitialContext();
                                DataSource dataSource = (DataSource)initial.lookup("java:/OracleDS");
                                System.out.println("It Worked!");
                                System.out.println(dataSource);

                                } catch (Exception ex) {
                                ex.printStackTrace();
                                }

                                // end inserted code
                                //
                                return principle * Math.pow(1+rate, periods) - principle;


                                b. Put the following in jboss.jcml

                                <!-- ==================================================================== -->
                                <!-- JDBC -->
                                <!-- ==================================================================== -->
                                <!-->

                                oracle.jdbc.driver.OracleDriver


                                jdbc/OracleDS
                                org.opentools.minerva.jdbc.xa.wrapper.XADataSourceImpl
                                jdbc:oracle:thin:@yourIPAddress:1521:yourSID
                                yourUSERNAME
                                yourPASSWORD

                                <!-->
                                <!-- ==================================================================== -->
                                <!-- JBoss Server Management -->
                                <!-- ==================================================================== -->

                                c. Put the following in the ejb-jar.xml file:

                                <transaction-type>Bean</transaction-type>

                                </enterprise-beans>
                                <!-->
                                <resource-managers>
                                <resource-manager res-class="org.jboss.jdbc.XADataSourceLoader">
                                <res-name>OracleDS</res-name>
                                <res-jndi-name>java:/OracleDS</res-jndi-name>
                                </resource-manager>
                                </resource-managers>
                                <!-->
                                </ejb-jar>


                                d. Put the following in the jboss.xml file:

                                <jndi-name>interest/Interest</jndi-name>
                                <!-->
                                <resource-ref>
                                <res-ref-name>OracleDS</res-ref-name>
                                <resource-name>java/OracleDS</resource-name>
                                </resource-ref>
                                <!-->


                                </enterprise-beans>
                                <!-->
                                <resource-managers>
                                <resource-manager res-class="org.jboss.jdbc.XADataSourceLoader">
                                <res-name>OracleDS</res-name>
                                <res-jndi-name>java:/OracleDS</res-jndi-name>
                                </resource-manager>
                                </resource-managers>
                                <!-->



                                e. re-build the ejb
                                http://www.jboss.org/online-manual/HTML/ch01s14.html

                                In the build dir:
                                ant intro-interest-jar
                                ant intro-interest-deploy


                                f. re-run the client
                                http://www.jboss.org/online-manual/HTML/ch01s15.html

                                In the bulid dir:
                                ant intro-interest-client

                                You should see:
                                [INFO,Default] Someone called `calculateCompoundInterest!'
                                [INFO,Default] It Worked!
                                [INFO,Default] org.jboss.pool.jdbc.xa.XAPoolDataSource@639bf1


                                Disclaimer: Works on my machine!!

                                • 13. Re: javax.sql.DataSource JNDI name
                                  Dieter Bartmann Newbie

                                  I haven't tested this, but there are two things which I think are not right:

                                  1. Your ejb-jar.xml does not conform to neither the ejb-jar.dtd nor to the ejb-jar_2_0.dtd. I think it should look something like this:

                                  ...
                                  <transaction-type>Bean</transaction-type>
                                  <resource-ref>
                                  <res-ref-name>OracleDS</res-ref-name>
                                  <res-type>javax.sql.XADataSource</res-type>
                                  <res-auth>Container</res-auth>
                                  </resource-ref>


                                  I'm not really sure, but perhaps you would have to use javax.sql.DataSource instead of javax.sql.XADataSource.

                                  2. I think davidjencks is right (indeed I think he always is right) concerning the specification of the res-class. However I've seen two different versions of jboss_2_4.dtd: one with the res-class attribute (required!) with the resource-manager element and one without such an attribute. I think the second one is the one you should use. Hence the jboss.xml file should look something like this:
                                  <enterprise-beans>

                                  ...
                                  <resource-ref>
                                  <res-ref-name>OracleDS</res-ref-name>
                                  <resource-name>myTestOracleDS</resource-name>
                                  </resource-ref>

                                  </enterprise-beans>

                                  <resource-managers>
                                  <resource-manager>
                                  <res-name>myTestOracleDS</res-name>
                                  <res-jndi-name>java:/OracleDS</res-jndi-name>
                                  </resource-manager>
                                  </resource-managers>