21

我知道对于 JBoss,您需要在相应实例的 /deploy 子目录中创建一个 [name]-ds.xml 文件。我对其他 Java EE 容器没有任何经验,但我试图尽可能地遵守标准。是否有定义 JDBC 数据源并部署它的标准方法?如果可能的话,我想在 *.ear 文件中包含我的数据源(例如,用于演示目的的嵌入式内存 HSQLDB 数据源)?

如果没有标准方式,其他容器至少会接受jboss方式吗?(/部署/*-ds.xml)

4

3 回答 3

28

是否有定义 JDBC 数据源并部署它的标准方法?

就在这里。它是通过<data-source>元素完成的,您可以将其放入web.xml,ejb-jar.xmlapplication.xml. 如果您不喜欢 XML,也可以为此使用注释:@DataSourceDefinition

web.xml 条目的示例

<data-source>
    <name>java:app/myDS</name>
    <class-name>org.postgresql.xa.PGXADataSource</class-name>
    <server-name>pg.myserver.com</server-name>
    <database-name>my_db</database-name>
    <user>foo</user>
    <password>bla</password>
    <transactional>true</transactional>
    <isolation-level>TRANSACTION_READ_COMMITTED</isolation-level>
    <initial-pool-size>2</initial-pool-size>
    <max-pool-size>10</max-pool-size>
    <min-pool-size>5</min-pool-size>
    <max-statements>0</max-statements>
</data-source>

进一步阅读:

ps 我很惊讶所有其他答案都说这不存在,虽然它显然存在,即使在最初提出这个问题时也是如此。

于 2013-04-28T09:30:11.217 回答
3

是否有定义 JDBC 数据源并部署它的标准方法?

不,这是特定于容器的。作为应用程序组件提供者,您应该记录您需要的资源,应用程序部署者和管理员将配置它们。

如果没有标准的方式,其他容器至少会接受JBoss的方式吗?

不,因为这是 JBoss 方式,因此是 JBoss 特有的。

  • 使用 Tomcat,您必须使用该context.xml 文件。
  • 与码头,jetty-env.xml.
  • 使用 WebSphere,您可以创建所谓的WebSphere 增强型 EAR
  • 使用 WebLogic,您可以将JDBC 模块打包到您的应用程序中。
  • 使用 GlassFish,您可以使用该命令asadmin add-resources my.xml添加 XML 文件中描述的数据源(此处为示例)。
  • 等等等等。

请注意,有些项目试图以通用方式实现此目标,例如jndi-resourcesCargo。还有更复杂的解决方案,如ControlTierChef

现在,在您的情况下(据我所知,您希望使用将与您的应用程序捆绑在一起的嵌入式数据库),我认为您不应该在应用程序服务器级别配置数据源。您应该使用独立的连接池(如 c3p0 或 DBCP)将数据库的 jar 打包到应用程序中。

于 2010-02-17T14:27:06.313 回答
0

Sun 的 Java EE 理念定义了企业应用程序的设计、开发和部署中的多个角色。Java EE 设计适应并反映了这些关注点分离。

特别是 Sun 希望将开发人员与应用程序的管理员分开,这是一个好主意。开发人员以与容器无关的方式编写企业组件。例如,在 web.xml 中,您确实以标准方式声明了 DataSource:

<resource-ref>
 <res-ref-name>jdbc/myDB</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

这表示“应用程序需要的这个数据库,通过标准 JNDI 在 'jdbc/myDB' 提供给我,无论是什么数据库,无论你在什么容器中运行它”。这是开发人员所能做的——其余的必须是特定于容器的,因此不是标准化的。

然后如何实际配置“myDB”取决于另一个角色,即容器的管理员。

所以我重复上面的正确答案:不。但原因是,否则,您会将您的应用程序编码到特定主机和端口上的特定类型的数据库,关键是您不应该这样做,因此没有对此的标准支持目的。

于 2010-02-17T12:48:29.667 回答