天天看點

EJB3+JBOSS 報NameingNotfoundException錯誤:MySql not Bound

錯誤原因:

1. 使用的jndi 和綁定時的jndi name本身不一緻,是以找不到對應的class (比較少,但是有)

2.配置檔案不全或錯誤

  1. META-INF下的persistence.xml檔案

                <?xml version="1.0" encoding="UTF-8"?>

                  <persistence xmlns="http://java.sun.com/xml/ns/persistence"

                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  

                    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

                      version="1.0">

    <persistence-unit name="jpaunit">

    <!-- <provider>org.hibernate.ejb.HibernatePersistence</provider> -->

        <jta-data-source>java:/MySqlDS</jta-data-source>

        <!-- <non-jta-data-source>java:/MySqlDS</non-jta-data-source> -->

        <properties>

            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

            <!-- <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"

                /> <property name="hibernate.connection.username" value="root" /> <property

                name="hibernate.connection.password" value="root" /> <property name="hibernate.connection.url"

                value="jdbc.mysql://fh1:3306/trust" /> -->

            <property name="hibernate.hbm2ddl.auto" value="create" />

            <property name="hibernate.show_sql" value="true" />

        </properties>

    </persistence-unit>

</persistence>

          2.server/deploy/下的mysql-ds.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- $Id: mysql-ds.xml 41016 2006-02-07 14:23:00Z acoliver $ -->

<!--  Datasource config for MySQL using 3.0.9 available from:

http://www.mysql.com/downloads/api-jdbc-stable.html

-->

<datasources>

  <local-tx-datasource>

    <jndi-name>MySqlDS</jndi-name>

    <connection-url>jdbc:mysql://localhost:3306/trust</connection-url>

    <driver-class>com.mysql.jdbc.Driver</driver-class>

    <user-name>root</user-name>

    <password>root</password>

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

    <!-- should only be used on drivers after 3.22.1 with "ping" support

    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>

    -->

    <!-- sql to call when connection is created

    <new-connection-sql>some arbitrary sql</new-connection-sql>

      -->

    <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers

    <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>

      -->

    <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->

    <metadata>

       <type-mapping>mySQL</type-mapping>

    </metadata>

  </local-tx-datasource>

</datasources>

                 3.Next, we need to set the

<datasource>

and

<type-mapping>

elements in thestandardjaws.xml or jaws.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jaws PUBLIC
          "-//JBoss//DTD JAWS 2.4//EN"
          "http://www.jboss.org/j2ee/dtd/jaws_2_4.dtd">
<jaws> 
<datasource>java:/MySqlDS</datasource> 
<type-mapping>mySQL</type-mapping> 
<!--
   <enterprise-beans>
        <entity>
            <ejb-name>demo.Story</ejb-name>
            <cmp-field>
                <field-name>id</field-name>
                <column-name>ID</column-name>
            </cmp-field>
            <cmp-field>
                <field-name>author</field-name>
                <column-name>AUTHOR</column-name>
            </cmp-field>
            <cmp-field>
                <field-name>subject</field-name>
                <column-name>SUBJECT</column-name>
            </cmp-field>
            <cmp-field>
                <field-name>content</field-name>
                <column-name>CONTENT</column-name>
            </cmp-field>
            <finder>
                <name>findById</name>
                <query><![CDATA[where ID = {0}]]></query>
                <order></order>
            </finder>
            <finder>
                <name>findByAuthor</name>
                <query><![CDATA[where AUTHOR = {0}]]></query>
                <order></order>
            </finder>
            <table-name>STORY</table-name>
            <time-out>10</time-out>
        </entity>
    </enterprise-beans>-->
</jaws>
           

We also need to set the

<datasource>

and

<datasource-mapping>

elements in thestandardjbosscmp-jdbc.xml or jbosscmp-jdbc.xml file:

<jbosscmp-jdbc>
    <defaults>
       <datasource>java:/MySqlDS</datasource>
       <datasource-mapping>mySQL</datasource-mapping>
  </defaults>
</jbosscmp-jdbc>
           

Finally, we modify login-config.xml with MySQLdatabase settings. Add the following

<application-policy/>

element to login-config.xml:

<application-policy name = "MySqlDbRealm"> 
   <authentication> 
      <login-module code =  
  "org.jboss.resource.security.ConfiguredIdentityLoginModule" 
                            flag = "required"> 
         <module-option name ="principal">sa</module-option> 
         <module-option name ="userName">sa</module-option> 
         <module-option name ="password"></module-option> 
         <module-option name ="managedConnectionFactoryName">  
            jboss.jca:service=LocalTxCM,name=MySqlDS 
         </module-option> 
      </login-module> 
   </authentication> 
</application-policy>  
           

By modifying the mysql-ds.xml, standardjaws.xml, standardjbosscmp-jdbc.xml, and login-config.xml files,the JBoss 4.0 server is configured to be used with a MySQL database.

轉自:http://www.onjava.com/pub/a/onjava/2004/02/25/jbossjdbc.html#mysql

           https://books.google.com.hk/books?id=EjqbAgAAQBAJ&pg=PA138&lpg=PA138&dq=Depend+On:+++++jboss.jca:service%3DDataSourceBinding,name%3DMySqlDS&source=bl&ots=xkQwGmAo-Q&sig=inckUiWa2yT4Qukdjxd_kOtk77A&hl=zh-CN&sa=X&ei=LWm8VK-3EazesATokICYAg&ved=0CEwQ6AEwBQ#v=onepage&q=Depend%20On%3A%20%20%20%20%20jboss.jca%3Aservice%3DDataSourceBinding%2Cname%3DMySqlDS&f=false

3. 如果你確定jndi沒有使用錯誤的情況下,在很大可能上就屬于如下情形了:

這時候,通常我們的應用程式運作在一個standalone的環境中,也即是我們的client端本身不是運作在JBoss環境中,而是另外一個JVM中。

原因之一,是我們把jndi-name定義成了java:/hibernate/SessionFactory。 可是我們忘了, 所有以java:/開頭的jndi都隻能在同一個JVM中使用。

原因之二,即使我們的jndi并沒有以java:/開頭(這種情況下傳回的通常是null),但是在預設情況下,出于安全方面的原因,JBoss是把datasoure綁定到java:下的,沒有把DataSource share給别的JVM使用。是以我們自然也就查找不到了。

By default, the datasources in JBoss are bound to java: namespace and are not visible outside the server JVM

如果一定想要在另外一個JVM中使用的話,可以在*-ds.xml檔案中通過在設定use-java-context為false。

<use-java-context>false</use-java-context>  加上這個後persistence.xml中----不能使用    <jta-data-source>java:/mySource</jta-data-source> 而改為

<jta-data-source>mySource</jta-data-source>