代码之家  ›  专栏  ›  技术社区  ›  Michael

从web容器外部访问数据源(通过jndi)

  •  3
  • Michael  · 技术社区  · 17 年前

    我试图从容器外部的胖客户机访问在web容器(jboss)中定义的数据源。

    我决定通过jndi查找数据源。实际上,我的持久性框架(ibatis)做到了这一点。

    在执行查询时,我总是得到以下错误:

    java.lang.IllegalAccessException: Method=public abstract java.sql.Connection java.sql.Statement.getConnection() throws java.sql.SQLException does not return Serializable 
    
    Stacktrace:
    org.jboss.resource.adapter.jdbc.remote.WrapperDataSourceService.doStatementMethod(WrapperDataSourceS
    ervice.java:411),
    org.jboss.resource.adapter.jdbc.remote.WrapperDataSourceService.invoke(WrapperDataSourceService.java
    :223),
    sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source),
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25),
    java.lang.reflect.Method.invoke(Method.java:585),
    org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155),
    org.jboss.mx.server.Invocation.dispatch(Invocation.java:94),
    org.jboss.mx.server.Invocation.invoke(Invocation.java:86),
    org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264),
    org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659),
    

    我的数据源:

    <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
            <jndi-name>jdbc/xxxxxDS</jndi-name>
            <connection-url>jdbc:oracle:thin:@xxxxxxxxx:1521:xxxxxxx</connection-url>
            <use-java-context>false</use-java-context>
            <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
            <user-name>xxxxxxxx</user-name>
            <password>xxxxxx</password>
            <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
            <min-pool-size>5</min-pool-size>
            <max-pool-size>20</max-pool-size>
        </local-tx-datasource>
    </datasources>
    

    有人知道这是从哪里来的吗?

    也许有人甚至知道一个更好的方法来实现这一点。 任何提示都非常感谢!

    干杯,

    迈克尔

    6 回复  |  直到 17 年前
        1
  •  1
  •   toolkit    17 年前

    不确定这是不是同一个问题?

    JBoss DataSource config

    数据源包装器在服务器虚拟机之外不可用

        2
  •  1
  •   brabster    17 年前

    @michael好吧,java.sql.connection是一个接口——从技术上讲,您从jboss获得的具体实现可能是可序列化的——但我不认为您真的会有任何可用的选项。如果可能的话,可能会很容易:)

    我认为@toolkit可能在vm之外使用了正确的词-jdbc驱动程序将与运行在底层操作系统中的本机驱动程序代码对话,所以这可能解释了为什么不能通过网络在其他地方传递连接。

    我的建议,(如果你没有更好的建议!)可能会找到另一种方法-如果您有权在jboss目录中找到资源,那么可以实现一个代理对象,您可以从该目录中找到并获取该对象,该对象允许您从胖客户机远程使用连接。我认为这是一种叫做数据传输对象的设计模式 Wikipedia entry

        3
  •  0
  •   Michael    17 年前

    @工具包: 嗯,不完全是。因为我可以通过jndi访问数据源,所以它实际上是可见的,因此是可用的。

    还是我完全错了?

    @ Brabster: 我觉得你走对了。有没有办法使连接可序列化?可能只是配置问题…

        4
  •  0
  •   brabster    17 年前

    我已经读过iBATIS了——也许你可以使DAO等的实现可序列化,将它们发布到你的目录中,然后检索它们并在胖客户机中使用它们?你也会从中得到重用的好处。

    这里有一个类似的例子 Wicket

        5
  •  0
  •   Tim Williscroft    17 年前

    jboss用自己的数据源包装所有数据源。

    这使得它可以利用autocommit来从jdbc连接中获取指定的j2ee行为。他们是 主要地 塞拉利扎布尔。但你不必相信他们。

    我会仔细看看包装纸。我已经为jboss的jdbc j2ee包装器编写了一个代理项,它与oocjndi一起工作,使我的dao代码单元能够独立测试。

    您只需包装java.sql.driver,将oocjndi指向您的类,然后在junit中运行。

    驱动程序包装器可以直接创建一个sql驱动程序并委托给它。

    在connect上返回自己设计的java.sql.connection包装器。

    一个connectionwrapper可以包装您的oracle驱动程序提供给您的连接, 它唯一的特殊功能就是将autocommit设置为true。

    别忘了eclipse可以为你设计delgates。添加需要委派的成员,然后选择该成员并右键单击,source-=>添加delgage方法。

    当你通过电话获得报酬时,这很好;-)

    bada-bing、bada-boom、junit开箱即用j2ee测试。

    你的问题很可能也是同样的,junit被划掉了,fatclient用蜡笔写了下来。

    我的fatclient使用用xdoclet生成的rmi与j2ee服务器进行通信,所以我没有您的问题。

        6
  •  0
  •   Diodeus - James MacFarlane    17 年前

    我认为异常表明您试图检索的sqlconnection对象没有实现可序列化接口,因此无法按您要求的方式将其传递给您。

    从我对jdni所做的有限工作来看,如果您通过jndi请求一个对象,那么它必须是可序列化的。据我所知,这是没有办法的-如果我想一个更好的方法,我会张贴它…

    好的,一个明显的选项是提供一个本地的可序列化对象到使用它的数据源,但是没有将该数据源作为其可序列化对象图的一部分。胖客户机随后可以查找该对象并查询它。

    或者创建一个(网络?)访问数据源的服务是受管理的——同样,您的胖客户机也会访问该服务——如果您担心这些问题,那么这可能是更好的封装和更可重用的方法。