2010-05-26 9 views
11
source de données

dans server.xml J'ai défini les ressources mondiales (j'utilise Tomcat 6):référence Tomcat JNDI dans persistence.xml

<GlobalNamingResources> 
    <Resource name="jdbc/myds" auth="Container" 
      type="javax.sql.DataSource" 
      maxActive="10" maxIdle="3" maxWait="10000" 
      username="sa" password="" 
      driverClassName="org.h2.Driver" 
      url="jdbc:h2:~/.myds/data/db" 
    /> 
</GlobalNamingResources> 

Je vois dans catalina.out que cela est lié, donc je suppose que c'est OK.

Dans mon application web j'ai le lien vers la source de données, je ne suis pas sûr que c'est OK:

<Context>  
<ResourceLink global='jdbc/myds' name='jdbc/myds' type="javax.sql.Datasource"/>  
</Context> 

et en application il y a persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="oam" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>jdbc/myds</non-jta-data-source> 
    <!-- class definitions here, nothing else --> 

    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Il devrait être OK, mais très probablement cette définition ou la définition ResourceLink est erronée parce que je reçois:

javax.naming.NameNotFoundException: Nom jdbc n'est pas lié dans ce contexte

Qu'est-ce qui ne va pas et pourquoi cela ne fonctionne pas?

MISE À JOUR:

J'ai essayé d'obtenir la source de données directement:

public class WebAppListener implements ServletContextListener 
{ 
    // ServletContextListener interface - start 
    public void contextInitialized(ServletContextEvent sce) 
    { 
     try 
     { 
      Context initCtx = new InitialContext(); 
      Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
      DataSource ds = (DataSource) 
      envCtx.lookup("jdbc/myds"); 
     } 
     catch (NamingException ex) 
     { 
      System.out.println("!!!! Got NamingException:"); 
      ex.printStackTrace(System.out); 
     } 
    } 

    public void contextDestroyed(ServletContextEvent sce) { } 

} 

mon web.xml:

<listener> 
    <display-name>Listener</display-name> 
    <listener-class>WebAppListener</listener-class> 
    </listener> 

obtenir toujours la même erreur même si je vois la source de données dans la console JMX lorsque je me connecte au Tomcat (Catalina - Datasource - javax.sql.Datasource = "jdbc/myds": ObjectName = Catalina: type = DataSource, classe = javax.sql.DataSource, name = "jdbc/myds".)

+0

avez-vous résolu votre problème? Si oui, comment? – artaxerxe

+0

Malheureusement, en raison d'un changement de concept, il n'y a pas eu de demande supplémentaire. –

Répondre

9

Le <non-jta-data-source> en persistence.xml devrait être

java:comp/env/jdbc/myds

selon la réponse à http://forums.oracle.com/forums/thread.jspa?messageID=1899677

Et est votre pilote db dans $CATALINA_HOME/lib

+0

Essayé, revérifié, ne fonctionne pas. –

+1

Hmm, pouvez-vous parcourir ce tutoriel et voir si toutes les étapes correspondent. http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial – JoseK

+0

Je vais regarder le tutoriel bien que je n'utilise pas eclipse. –

0

Avez-vous fait que les ressources disponibles pour la demande en le déclarant dans votre web.xml?

<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/myds</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 
+0

Cela ne fonctionnera pas pour la ressource globale, je l'ai activée de manière accoutinante et j'ai obtenu la source de données avec des propriétés vides (class = "", url = null). Mais si vous avez une configuration de travail avec une ressource définie localement, je suis dedans. Je l'ai essayé au début. –

+0

@binary_runner: N'a pas fait assez attention, n'a pas remarqué que la ressource était globale. Et oui, j'ai une configuration de travail avec une ressource définie localement, je l'afficherai plus tard (pas sur cet ordinateur). –

+0

Merci. Je ne reçois toujours pas ce qui ne va pas, tout semble correct mais les recherches échouent :(. –

1

(Im en utilisant la bibliothèque Apache dans OpenJPA tomcat7 donc peut ne pas correspondre à Hibernate choses)

Je n'ai jamais utilisé un jdbc global pour mes OpenJPA webapps mais il a donné un essai. Cela a fonctionné et c'est ma configuration. Voir le dossier où persistence.xml est sauvegardé, probablement le problème openjpa mais sans cela rien ne fonctionne.

myapp/WEB-INF/classes/META-INF/persistence.xml
utilise ce fournisseur de openjpa si la liste des classes ne peut être nécessaire en veille prolongée.

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<persistence-unit name="main" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <non-jta-data-source>java:comp/env/jdbc/mydb</non-jta-data-source> 

    <class>com.myapp.db.User</class> 
    <class>com.myapp.db.Server</class> 

    <properties> 
     <property name="openjpa.DynamicEnhancementAgent" value="false" /> 
     <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" /> 
     <property name="openjpa.Log" value="commons" /> 
     <property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" /> 
    </properties> 
</persistence-unit> 

</persistence> 

tomcat/conf/server.xml
Ajouter une ressource globale jdbc.

..cut... 
    <GlobalNamingResources> 
    <Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
       description="User database that can be updated and saved" 
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" readonly="true" /> 

    <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" 
     maxActive="100" maxIdle="20" maxWait="10000" 
     username="myuser" password="mypwd" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf8" 
     validationQuery="SELECT 1" removeAbandoned="true" removeAbandonedTimeout="300" 
    /> 
    </GlobalNamingResources> 
    ..cut... 

tomcat/conf/Catalina/localhost/myapp.xml
cette ma boîte de développement, donc j'utiliser docBase pour relier directement le dossier des projets. Vous devriez trouver l'insertion de ceci au paquet de guerre (META-INF/context.xml) quand déployé dans la boîte de production.

<?xml version="1.0" encoding="UTF-8"?> 
<Context docBase="/projects/myapp/web" reloadable="true" crossContext="true" > 

    <Realm className="org.apache.catalina.realm.DataSourceRealm" 
    dataSourceName="jdbc/mydb" localDataSource="false" digest="SHA" 
    userTable="user"   userNameCol="username" userCredCol="password" 
    userRoleTable="user_role_v" roleNameCol="role" 
    /> 

    <ResourceLink name="jdbc/mydb" global="jdbc/mydb" type="javax.sql.DataSource" /> 
</Context> 

myapp/WEB-INF/web.xml
Ajouter resource-ref à la fin du fichier.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0" > 

    <description>Webapp</description> 
    <display-name>Webapp</display-name> 
    ..cut... 

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

</web-app> 

Parce que Im en utilisant OpenJPA + tomcat7 (non fullsized de récipient j2ee) cela peut sembler overengineering mais c'est comment cela fonctionne. Les résultats sont bons et le développement de webapp db-aware est très facile. Pas besoin de manuel sql requête hardcoding et oldskool DAO classes.

+0

Pouvez-vous clarifier comment avez-vous intégré webapp avec l'openJPA J'ai un portlet liferay avec openEJB et je reçois toujours l'erreur javax.persistence.PersistenceException: Non Persistance fournisseur pour EntityManager nommé kepler_v1PU J'ai liferay 6.1 fourni avec tomcat 7 et j'ajoute openEJB à mon projet par maven dépendance org.apache.openejb JavaEE-api 6.0-5 Je peux l'extraire à la question séparée, mais je trouve déjà simila r sur SO. – user3057486

+0

Je dois poster plus tard une réponse plus longue pour décrire les astuces utilisées par JPA + OpenJPA + AutomanagedEM dans la pure webapp de Tomcat. Clé était que j'ai trouvé ce (maintenant obsolète) helper lib https://code.google.com/p/scoped-entitymanager/. Je l'ai modifié pour fonctionner avec l'interface JPA2.x. Il donne un gestionnaire d'entité JPA auto-géré dans la portée servlethttprequest. Le portlet Liferay est un problème que je ne connais pas. – Whome

+0

Enfin, je l'ai fait et posté le code source, c'est wrapper compatible JPA2.x pour le conteneur de servlet Tomcat. Automanage entitymanagers https://github.com/Murmur/ScopedEntityManager – Whome