有没有为Java EE容器定义JDBC数据源的标准方法?

时间:2010-02-17 10:36:56

标签: java jdbc java-ee hsqldb

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

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

3 个答案:

答案 0 :(得分:25)

  

是否有标准方法来定义JDBC数据源并进行部署?

是的,有。它是通过<data-source>元素完成的,您可以将其放入web.xmlejb-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>

进一步阅读:

P.S。令我感到惊讶的是,所有其他答案都说这不存在,但很明显,即使在最初问这个问题的时候也是如此。

答案 1 :(得分:3)

  

是否有标准方法来定义JDBC数据源并进行部署?

不,这是特定于容器的。作为Application Component Provider,您应该记录所需的资源,Application deployer and Administrator将对其进行配置。

  

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

不,因为这是JBoss的方式,因此JBoss具体。

  • 使用Tomcat,您必须使用context.xml文件。
  • 使用Jetty,jetty-env.xml
  • 使用WebSphere,您可以创建一个所谓的WebSphere Enhanced EAR
  • 使用WebLogic,您可以在应用程序中打包JDBC Module
  • 使用GlassFish,您可以使用命令asadmin add-resources my.xml添加XML文件中描述的数据源(例如here)。
  • 等等。

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

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

答案 2 :(得分: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>

这说“应用程序需要这个数据库的东西,通过'jdbc / myDB'中的标准JNDI,让它可供我使用,无论数据库是什么以及你运行它的任何容器”。这与开发人员可以做的一样多 - 其余部分必然是容器特定的,因此不是标准化的。

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

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