2010-02-17 2 views
19

Я знаю, что для JBoss вам нужен файл [name] -ds.xml в подкаталоге/deploy соответствующего экземпляра. У меня нет опыта с другими контейнерами Java EE, но я стараюсь придерживаться стандартов как можно больше. Существует стандартный способ определения источника данных JDBC и его развертывания? если возможно, я хотел бы включить свой источник данных в * .ear-файл (например, встроенный в источник данных HSQLDB в памяти для демонстрационных целей)?Существует ли стандартный способ определения источника данных JDBC для контейнеров Java EE?

Если нет стандартного способа, будут ли другие контейнеры, по крайней мере, принимать способ jboss? (/deploy/*-ds.xml)

ответ

21

Существует ли стандартный способ определения источника данных JDBC и его развертывания?

Да, есть. Это делается через элемент <data-source>, который вы можете разместить в web.xml, ejb-jar.xml и application.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. Я удивлен, что все остальные ответы говорят, что этого не существует, хотя это ясно, даже в то время, когда этот вопрос изначально был задан.

+0

Вопрос был о конфигурации контейнера, я полагаю? Как http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Connectors_on_JBoss-Configuring_JDBC_DataSources.html Это не эквивалент этого, если я правильно понимаю вопрос. Но да, вы правы, это правильный ответ в 90% случаев - в то время это было несколько месяцев, и я точно не знал об этом! –

+1

@SeanOwen> Вопрос был о конфигурации контейнера, я считаю, - я думаю, что Op попросил стандартный способ для чего-то, что в противном случае можно было бы сделать с помощью конфигурации контейнера. Я согласен с тем, что в то время, когда этот механизм был всего лишь несколько месяцев назад, и различные продавцы на самом деле не слишком много шумели. –

+0

yup, OP определенно искал что-то вроде этого :-) большое спасибо Arjan. это означает, что мне нужно идти с разнесенным развертыванием, чтобы сделать конфиг легко доступным для скриптов/инструментов, но это очень правильный вариант. если вы посмотрите на дату, хотя, я смотрел на ~ 2010, поэтому j2ee6 не был действительно вариантом. – radai

0

Теория Sun Java EE определяет несколько ролей при разработке, разработке и развертывании корпоративного приложения. Конструкция Java EE учитывает и отражает эти проблемы.

В частности, Sun хочет отделить разработчика от администратора приложения, что является хорошей идеей. Разработчик записывает корпоративные компоненты контейнерно-агностическим способом. В web.xml, например, вы объявлять DataSources стандартным способом:

<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», зависит от другой роли, администратора контейнера.

Так что я повторяю правильный ответ выше: нет. Но причина в том, что в противном случае вы будете кодировать свое приложение в определенный тип базы данных на конкретном хосте и порту, и дело в том, что вы не должны этого делать, поэтому стандартная поддержка для него отсутствует цель.

+0

в то время как вы правы в общем случае, в моем случае я планирую использовать в-JVM, в памяти DB, с Hibernate на вершине (думаю о нем, как кэш Object) - что-то я надеялся, мог сделать это переносимым способом – radai

+1

>, что является хорошей идеей - это хорошая идея для некоторых случаев использования, но не для всех случаев использования. Java EE 6 начал предоставлять альтернативы (например, вы можете определить источник данных из своего приложения), а Java EE 7 продолжил эту тенденцию (такие вещи, как адреса JMS и почтовые сеансы, также могут быть определены в приложении). –

+1

> вы не должны этого делать - спецификация не должна указывать на один и только один способ работы. Это объяснение полностью не учитывает наличие локальных, частных (возможно, в памяти) баз данных, и оно не масштабируется до самых простых приложений. Интерфейсы и отдельные модули для бизнес-логики, возможно, были лучшей практикой для некоторых случаев использования, но принудительное применение EJB показало, что он тяжеловес. Начиная с Java EE 6, выбор зависит от разработчика (интерфейсы и отдельный модуль EJB теперь являются необязательными). –

5

Существует ли стандартный способ определения источника данных 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-resources или Cargo. Существуют также более сложные решения, такие как ControlTier или Chef.

Теперь, в вашем случае (поскольку я понял, что вы хотите использовать встроенную базу данных, которая будет поставляться вместе с вашим приложением), я не думаю, что вам нужно настроить источник данных на уровне сервера приложений. Вы должны просто упаковать банку своей базы данных в свое приложение с помощью автономного пула подключений, например c3p0 или DBCP.

+1

> это конкретный контейнер. - Нет, это не обязательно конкретный контейнер. Существует также стандартный способ использования элемента '', например. веб.xml (см. мой ответ ниже). –

Смежные вопросы