0

Jboss AS 5.1.x サーバーを使用しています。Java プログラムで jndi 名の DataSource オブジェクトを使用していると、サーバー マネージャ接続プールに接続中にエラーが発生します。以下の詳細を確認し、エラーが発生する理由を教えてください。

DataSource を Jndi に配置するには、*-ds.xml ファイルを配置する必要があるため、次のタグを使用して mysql-ds.xml ファイルを default/deploy フォルダーに配置しました。

 <?xml version="1.0" encoding="UTF-8"?>
  <datasources>
  <local-tx-datasource>
 <jndi-name>MySqlDS</jndi-name>
 <connection-url>jdbc:mysql://localhost:3306/mysql</connection-url>
 <driver-class>org.gjt.mm.mysql.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>
    <new-connection-sql>SELECT 1</new-connection-sql>
    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
 <metadata>
    <type-mapping>mySQL</type-mapping>
  </metadata>
  </local-tx-datasource>
 </datasources>

この xml ファイルを deploy フォルダーに配置した後、Jndiview をブラウズしているときに、Java の MySqlDs を含む jnditree に 1 つのタグが見つかりました: |MySqlDs

上記のバインドされた jndi 名を使用するために、次の Java プログラム (スタンドアロン) を使用しました。

// JndiDsConTest.java
import javax.naming.*; //(jndi api)
import javax.sql.*;
import java.sql.*;
import java.util.*;

public class JndiDsConTest
 {
public static void main(String args[])throws Exception
{


    //Jbosss
     Hashtable ht=new Hashtable();
         ht.put(Context.INITIAL_CONTEXT_FACTORY,
               "org.jnp.interfaces.NamingContextFactory");
    ht.put(Context.PROVIDER_URL,"jnp://localhost:1099");

    // create InitialContext obj
    InitialContext ic=new InitialContext(ht);
                                // represents conectivity with registry s/w

    // get DataSoruce obj ref from registry
    DataSource ds=(DataSource)ic.lookup("java:/MySqlDS");
     //DataSource ds=(DataSource)ic.lookup("java:comp/env/jdbc/MySqlDS");

     // get con obj from Jdbc Con pool
     Connection con=ds.getConnection();

     // write jdbc persistance logic
     Statement st=con.createStatement();
     ResultSet rs=st.executeQuery("select count(*) from  employee");

      if(rs.next())
      {
          System.out.println("count of records :"+rs.getInt(1));
      }

      // close jdbc objs
      rs.close();
      st.close();
      // release con obj back to con pool
      con.close();
      }//main
     }//class

クラスファイルの上で実行していると、スタックトレースのエラーが発生します。

    D:\JAVA DRIVER\JAVA\JNDI>java JndiDsConTest
   Exception in thread "main" javax.naming.CommunicationException: Could not obtain
   connection to any of these urls: MySqlDS and discovery failed with error: javax
   .naming.CommunicationException: Receive timed out [Root exception is java.net.So
   cketTimeoutException: Receive timed out] [Root exception is javax.naming.Communi
  cationException: Failed to connect to server MySqlDS:1099 [Root exception is jav   
  ax.naming.ServiceUnavailableException: Failed to connect to server MySqlDS:1099
  [Root exception is java.net.UnknownHostException: MySqlDS]]]
    at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1763)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:693)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:686)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at JndiDsConTest.main(JndiDsConTest.java:25)
  Caused by: javax.naming.CommunicationException: Failed to connect to server MySq
  lDS:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to
   connect to server MySqlDS:1099 [Root exception is java.net.UnknownHostException:
  MySqlDS]]
    at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:335)
    at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1734)
    ... 4 more
   Caused by: javax.naming.ServiceUnavailableException: Failed to connect to server
   MySqlDS:1099 [Root exception is java.net.UnknownHostException: MySqlDS]
    at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:305)
    ... 5 more  
   Caused by: java.net.UnknownHostException: MySqlDS
    at java.net.InetAddress.getAllByName0(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getByName(Unknown Source)
    at org.jnp.interfaces.TimedSocketFactory.createSocket(TimedSocketFactory
    .java:81)
    at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:301)
    ... 5 more

エラースタックトレースの理由を見つけて解決してください。

よろしくお願いします。

4

2 に答える 2

0

スタックトレース メッセージを見るjava.net.UnknownHostException: MySqlDSと、JDBC ドライバーは「MySqlDS」という名前のホストを探していると思います。したがって、少なくとも mysql-ds.xml ファイルから情報を取得しているとは思いません。ここに記述しました。

JBoss 5.1.0 で動作するコードの一部を次に示します。(元のデータソース名ではなく、あなたのデータソース名を表示しています。)

javax.naming.Context ic = new javax.naming.InitialContext();
javax.naming.Context ctx = (javax.naming.Context) ic.lookup("java:");
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("jdbc/mysqlds");
conn = ds.getConnection();

思いつきでは、JNDI ルックアップで大文字と小文字が区別されるかどうかわかりません。私は常に小文字を使用してきました。

それが役立つことを願っています。

于 2013-05-30T18:21:06.920 に答える