同weblogic不同,在 jboss中配置数据源并没有可视化的控制台.一般.大家都是到%JBOSS_HOME%\docs\examples\jca目录下,找到自己所要配置的数据源的模板文件,然后修改jndi-name,connection-url,driver-class,user-name,password,等等,然后把修改后的配置文件丢到要使用的domain下的deploy目录下就可以了,但是这时住往会有个问题.
你会发现,你在客户端查找不到你刚刚配置的数据源.

结果是一大堆异常:
  • Exception in thread "main" javax.naming.NameNotFoundException: MySqlDS not bound   
  •     at org.jnp.server.NamingServer.getBinding(NamingServer.java:542)   
  •     at org.jnp.server.NamingServer.getBinding(NamingServer.java:550)   
  •     at org.jnp.server.NamingServer.getObject(NamingServer.java:556)   
  •     at org.jnp.server.NamingServer.lookup(NamingServer.java:296)   
  •     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   

  • JNDI查找不到"MySqlDS"这个名称..
    为什么呢?
    我们去JBOSS的控制台去查看JNDI树结构.

    Other components with java:comp namespace
    java: Namespace
      +- ClusteredXAConnectionFactory (class: org.jboss.jms.client.JBossConnectionFactory)
      +- jaas (class: javax.naming.Context)
      |   +- messaging (class: org.jboss.security.plugins.SecurityDomainContext)
      +- TransactionPropagationContextImporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
      +- MySqlDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)

    很明显"MySqlDS"做为key被绑定在JNDI上了.那么为什么还会出错呢...

    : )我浪费了很长时间在找这个错误的过程中,中间甚至一度以为,JBOSS不支持在服务器外获取数据源.后来一个家伙好像在写EJB3.0的时候也遇到这个问题,并且找来了下面这个项文文档..让我惊为天人啊...

    <use-java-context> - A boolean indicating if the jndi-name should be prefixed with java: which causes the DataSource to only be accessible from within the jboss server vm. The default is true.

    Configuring a DataSource for remote usage
    As of jboss-4.0.0 there is support for accessing a DataSource from a remote client. The one change that is necessary for the client to be able to lookup the DataSource from JNDI is to specify use-java-context=false as shown here:

    <datasources>  <local-tx-datasource>    <jndi-name>GenericDS</jndi-name>    <use-java-context>false</use-java-context>    <connection-url>...</connection-url>...
    This results in the DataSource being bound under the JNDI name "GenericDS" instead of the default of "java:/GenericDS" which restricts the lookup to the same VM as the jboss server.

    身为高级知识分子,我相信大家即使读不懂上面的英文,金山词霸总是会使用的.
    它说的大概意思就是.
    当你指定<use-java-context>的值为false时,你就可以在jboss运行的VM外的VM上查找到这个DataSource.
    这个属性默认.为true   :( 
    即,默认情况下你是不可以在JBOSS的VM外来查找这个数据源. 

    其实吧,这个问题看起来很普通,解决起来也很简单只是加了一行代码,但是.JBOSS服务器的提供厂商是否有想过,一个example配置文件中,具然少了这种重要的配置信息.
    至少你把它配上,然后注掉也好啊.