1

我有这样一个问题:不同的 Web 服务器对 jndi 命名有不同的规则。因此,例如,如果在 Tomcat 中我想使用 jndi 名称作为数据源,它将如下所示:

<dataSource type="JNDI">
    <property name="data_source" value="java:comp/env/jdbc/myJndiName"/>
</dataSource>

但是在 WebSphere 或 Jboss 中,我必须提供不带“comp/env”的 jndi 名称,就像

<dataSource type="JNDI">
    <property name="data_source" value="java:jdbc/myJndiName"/>
</dataSource>

或我在配置中提供的 jndi 名称。如果使用与 Tomcat 中相同的名称,使用“comp/env”前缀,显然是行不通的。

有没有办法让应用程序对不同的网络服务通用?我正在考虑编写自己的 DataSource 包装来检查 jndi 名称的可用性并正确设置它。有什么想法吗?

4

2 回答 2

2

Mybatis 环境可能正是你要找的。

http://mybatis.github.com/mybatis-3/configuration.html#environments

在您的情况下,配置可能看起来像

<environments default="tomcat">
    <environment id="tomcat">
        <transactionManager type="JDBC"/>
        <dataSource type="JNDI">
            <property name="data_source" value="java:comp/env/jdbc/myJndiName"/>
        </dataSource>
    </environment>
    <environment id="websphere">
        <transactionManager type="JDBC"/>
        <dataSource type="JNDI">
            <property name="data_source" value="java:jdbc/myJndiName"/>
        </dataSource>
    </environment>
</environments>

您需要为每个环境创建一个 sql 会话工厂

InputStream in = Resources.getResourceAsStream("myconfig.xml");
SqlSessionFactory tomcatSessionFactory = new SqlSessionFactoryBuilder().build(in, "tomcat");
SqlSessionFactory websphereSessionFactory = new SqlSessionFactoryBuilder().build(in, "websphere");
于 2013-04-02T16:21:18.393 回答
1

在 OSGI 环境(Aries JNDI)中,查找配置应如下所示

<environment id="development">
   <transactionManager type="JDBC"/>
    <dataSource type="JNDI">
    <property name="data_source" value="osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/Ds)"/>
  </dataSource>

于 2015-02-25T05:21:46.613 回答