Especificação JPA - Data Source independente de fornecedor?

Boa tarde estava estudando JPA e fazendo alguns testes.

Criei um pool de conexões no glassfih e um dataSource com o nome JNDI “TitanCon”

<persistence-unit name="TitanSessionBean-ejbPU" transaction-type="JTA"> <jta-data-source>TitanCon</jta-data-source> <properties/> </persistence-unit>

Até ai tudo bem mais tive que descobrir como configurar um pool de conexões do GlassFish para o banco de dados derby e criar um dataSource… registrar o nome JNDI no glassFish isso deu um certo trabalho sendo que se eu for usar o JBoss ou o WebLogic vou ter aprender tudo de novo.

Gostaria de saber como e se existe uma maneira, para definir o dataSource no persistence.xml fornecendo usuário,senha,url,driver,nome JNDI etc… e os próprios containers, seja o GlassFish,Jboss,Weblogic etc… criarem um pool e dataSource e a entrada JNDI se baseando no xml do persistence.

pois da o maior trabalho aprender a configurar esses pool em todos fornecedores… se não existir essa maneira não achão que deveria entrar na próxima versão da especificação?

uma curiosidade no netbeans quando voce vai na persistense unit e pede para alterar a conexão… ele te pede um nome JNDI e uma conexão… e gera o seguinte codigo no arquivo especifico do glassFish sun-resources.xml

<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.apache.derby.jdbc.ClientDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="derby_net_banco_bancoPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> <property name="serverName" value="localhost"/> <property name="portNumber" value="1527"/> <property name="databaseName" value="banco"/> <property name="User" value="banco"/> <property name="Password" value=""/> <property name="URL" value="jdbc:derby://localhost:1527/banco;create=true"/> <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/> </jdbc-connection-pool> <jdbc-resource enabled="true" jndi-name="nome" object-type="user" pool-name="derby_net_banco_bancoPool"/>

Que especifica o pool e cria o data source… só que especificamente para o glassfish não tem algo similar a isto no persistence xml de forma que todos os containers consigam se auto configurar.

Isso não é possível. E o motivo é simples: os datasources podem ser usados em mais de uma aplicação.

Imagine o que aconteceria se uma aplicação configurasse um datasource de uma maneira e uma outra o configurasse de outra maneira.

Também não acho que isso deveria entrar na especificação (pelo motivo acima).

Realmente faz sentido o que você disse o persistence.xml não seria o local mais indicado, mais essa configuração poderia ser padronizada de alguma forma como por exemplo se fosse especificado que todo servidor que suporte a J2EE deve ter o arquivo data.xml e este arquivo deveria faria este trabalho de configuração padronizada, claro que cada pessoa poderia optar por configurar nos arquivos proprietários… mais ter essa opção padronizada seria muito interessante.

Eu trabalho com o Glassfish a alguns anos e nunca vi dificuldade nenhuma em criar pools JDBC. O seu problema foi, provavelmente, decorrente da falta de experiência com query ruins no Google. Após entendido o q um pool, vc dificilmente terá alguma dificuldade real em criar um em qualquer outro servidor.

A propósito, existe sim um modo portável de se declara pools de conneção. Esse modo foi introduzido na espec do JEE6. Isso pode ser feito através da anotação @DataSourceDefinition.

@DataSourceDefinition (
    className="org.apache.derby.jdbc.ClientDataSource",
    name="java:global/jdbc/AppDB",
    serverName="localhost",
    portNumber=1527,
    user="user",
    password="password",
    databaseName="dev-db"
)
public class Config {
    ...
}

tem algum link de referencia sobre essa feature?

e voce disse que tem bastante experiencia com glassFish sabe por que quando eu clico com o botao direito nele e escolho admin console.

no console do glassFish aparece

INFO: admin console: initSessionAttributes()
INFO: Cannot refresh Catalog : Connection refused: connect

e não abre nada no navegador so fica tentando nesta url http://localhost:4848/

Documentação: http://download.oracle.com/javaee/6/api/javax/annotation/sql/DataSourceDefinition.html
Um artigo sobre o uso: http://blogs.sun.com/Lance/entry/introducing_the_datasourcedefinition_annotation

Divirta-se! :slight_smile:

Obrigado.