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

    javax.sql.DataSource JNDI name

    sealbb

      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
          clmich

          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
            janiprashant

            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
              davidjencks

              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
                gudujarlson

                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
                  luckystar_007

                  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
                    davidjencks

                    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
                      jaywright00


                      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
                        davidjencks

                        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
                          jaywright00


                          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
                            davidjencks

                            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
                              jaywright00


                              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
                                cbradley2

                                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
                                  bartmann_d

                                  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>