2016-01-06 2 views
-1

J'ai un projet basé sur maven pour le déploiement sur GoogleAppEngine. J'ai DB local MySQL (pour le développement) et à distance CloudSQL DB (pour la production)
Mon code est basé sur google github
Les données dans CloudSQL et MySQL sont identiques. J'ai un problème en essayant de récupérer des données via une requête nommée en production - la liste de taille 0 est retournée. Sur le code DB MySQL local, les données sont correctement renvoyées. J'ai même essayé de récupérer des données de ClodSQL en utilisant le standard java.sql.Connection et j'ai pu récupérer des données. Aucune donnée n'est renvoyée uniquement lorsqu'elle est demandée à JPA. requête nommée utilisée:JPA ne renvoie aucune donnée de CloudSQL

@NamedQueries({(name = "Device.getDevices", = "SELECT d FROM Device d") 

mon persistence.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<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_1_0.xsd" 
    version="1.0"> 
<persistence-unit name="transactions-optional-device"> 
    <class>commander.apprecorder.database.pojos.device.Device</class> 

    <properties> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="datanucleus.autoCreateSchema" value="true"/> 
    </properties> 
</persistence-unit> 
</persistence> 

Contenu de pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<packaging>war</packaging> 
<version>1.0-SNAPSHOT</version> 

<groupId>group</groupId> 
<artifactId>art</artifactId> 

<properties> 
    <app.id>appid</app.id> 
    <app.version>version</app.version> 
    <appengine.version>1.9.30</appengine.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <gcloud.plugin.version>2.0.9.74.v20150814</gcloud.plugin.version> 

    <objectify.version>5.1.5</objectify.version> 
    <guava.version>18.0</guava.version> 

    <datanucleus.jpa.version>3.1.1</datanucleus.jpa.version> 

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation> 
    <cloudsql.device.url> 
     jdbc:google:mysql://some:instance:name/db?user=xxx 
    </cloudsql.device.url> 
    <cloudsql.device.url.dev>jdbc:mysql://localhost/db?user=x</cloudsql.device.url.dev> 

    <datanucleus-core.version>4.0.0-release</datanucleus-core.version> 
    <datanucleus-maven-plugin.version>4.0.0-release</datanucleus-maven-plugin.version> 
    <datanucleus-accessplatform-jpa-rdbms.version>4.0.0-release</datanucleus-accessplatform-jpa-rdbms.version> 
    <javax.persistence.version>2.1.0</javax.persistence.version> 
</properties> 

<prerequisites> 
    <maven>3.1.0</maven> 
</prerequisites> 

<dependencies> 
    <!-- Compile/runtime dependencies --> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-api-1.0-sdk</artifactId> 
     <version>${appengine.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.appengine.tools</groupId> 
     <artifactId>appengine-gcs-client</artifactId> 
     <version>0.5</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>jstl</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20151123</version> 
    </dependency> 


    <!--JPA start --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.25</version> 
    </dependency> 
    <dependency> 
     <groupId>org.datanucleus</groupId> 
     <artifactId>datanucleus-accessplatform-jpa-rdbms</artifactId> 
     <version>${datanucleus-accessplatform-jpa-rdbms.version}</version> 
     <type>pom</type> 
    </dependency> 

    <dependency> 
     <groupId>org.datanucleus</groupId> 
     <artifactId>javax.persistence</artifactId> 
     <version>${javax.persistence.version}</version> 
    </dependency> 
    <!--JPA end --> 

    <!-- [START Objectify_Dependencies] --> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>${guava.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.googlecode.objectify</groupId> 
     <artifactId>objectify</artifactId> 
     <version>${objectify.version}</version> 
    </dependency> 
    <!-- [END Objectify_Dependencies] --> 

    <!-- Test Dependencies --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>2.0.2-beta</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-testing</artifactId> 
     <version>${appengine.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.appengine</groupId> 
     <artifactId>appengine-api-stubs</artifactId> 
     <version>${appengine.version}</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

<build> 

    <!-- for hot reload of the web application--> 
    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>versions-maven-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <phase>compile</phase> 
        <goals> 
         <goal>display-dependency-updates</goal> 
         <goal>display-plugin-updates</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <version>3.2</version> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
      <dependencies> 
       <dependency> 
        <groupId>org.datanucleus</groupId> 
        <artifactId>datanucleus-core</artifactId> 
        <version>${datanucleus-core.version}</version> 
        <scope>compile</scope> 
       </dependency> 
      </dependencies> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.6</version> 
      <configuration> 
       <archiveClasses>true</archiveClasses> 
       <webResources> 
        <!-- in order to interpolate version from pom into appengine-web.xml --> 
        <resource> 
         <directory>${basedir}/src/main/webapp/WEB-INF</directory> 
         <filtering>true</filtering> 
         <targetPath>WEB-INF</targetPath> 
        </resource> 
       </webResources> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>com.google.appengine</groupId> 
      <artifactId>appengine-maven-plugin</artifactId> 
      <version>${appengine.version}</version> 
      <configuration> 
       <enableJarClasses>false</enableJarClasses> 
       <version>${app.version}</version> 
       <!-- Comment in the below snippet to bind to all IPs instead of just localhost --> 
       <!-- address>0.0.0.0</address> 
       <port>8080</port --> 
       <!-- Comment in the below snippet to enable local debugging with a remote debugger 
        like those included with Eclipse or IntelliJ --> 
       <!-- jvmFlags> 
        <jvmFlag>-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n</jvmFlag> 
       </jvmFlags --> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>com.google.appengine</groupId> 
      <artifactId>gcloud-maven-plugin</artifactId> 
      <version>${gcloud.plugin.version}</version> 
      <configuration> 
       <set_default>true</set_default> 
      </configuration> 
     </plugin> 
     <!--DB start--> 
     <plugin> 
      <groupId>org.datanucleus</groupId> 
      <artifactId>datanucleus-maven-plugin</artifactId> 
      <version>${datanucleus-maven-plugin.version}</version> 
      <configuration> 
       <api>JPA</api> 
       <persistenceUnitName>transactions-optional-device</persistenceUnitName> 
       <fork>false</fork> 
       <!--<persistenceUnitName>Demo</persistenceUnitName>--> 
       <!--<log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>--> 
       <verbose>true</verbose> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>process-classes</phase> 
        <goals> 
         <goal>enhance</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>org.datanucleus</groupId> 
        <artifactId>datanucleus-core</artifactId> 
        <version>${datanucleus-core.version}</version> 
       </dependency> 
      </dependencies> 
     </plugin> 
     <!--JPA end--> 
    </plugins> 
</build> 

Et servlet pour JPA

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.setContentType("text/plain"); 

    Map<String, String> properties = new HashMap(); 
    if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) { 
     properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.GoogleDriver"); 
     properties.put("javax.persistence.jdbc.url", System.getProperty("cloudsql.device.url")); 
    } else { 
     properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver"); 
     properties.put("javax.persistence.jdbc.url", System.getProperty("cloudsql.device.url.dev")); 
    } 

    // List all the rows. 

     EntityManagerFactory emf = Persistence.createEntityManagerFactory(
       "transactions-optional-device", properties); 
     EntityManager em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
     resp.getWriter().println("performing query"); 
     List<Device> result = em.createNamedQuery("Device.getDevices", Device.class).getResultList(); 
     resp.getWriter().println("Starting to list devices - " + result.size()); 
     for (Device g : result) { 
      resp.getWriter().println(g.getA() + "_" + g.getB()); 
     } 

     em.getTransaction().commit(); 
     em.close(); 

} 

Il n'y a pas d'erreur dans le journal du moteur de l'application. Pouvez-vous s'il vous plaît me dire ce qui ne va pas? Merci :)

+0

et dans le LOG de votre fournisseur JPA? quel SQL est appelé? qu'est-ce que le LOG dit d'autre? –

+0

merci, en utilisant les journaux JPA j'ai pu trouver le problème – Ajvo

+1

Vous avez des versions totalement incompatibles de jars là ... datanucleus-api-jpa v3.1.1 avec datanucleus-core v4.0.0! Et pourquoi vous utilisez une ancienne version, je n'ai aucune idée réelle. La dernière version que je vois est 4.1.7 de datanucleus-accessplatform-jpa-rdbms –

Répondre

-1

J'ai défini le niveau de journalisation sur ALL et j'ai découvert que Datanucleus essayait d'accéder à la banque de données. Il a créé une nouvelle table dans le magasin de données et a récupéré son contenu - aucune donnée.
Je ne sais pas pourquoi il a essayé d'accéder datastore et n'utilisait CloudSQL, mais tant pis ...
j'ai remplacé DataNucles pour mise en veille prolongée tutoriel à l'intérieur google github et il a travaillé sur la première fois
La migration était facile, seulement persistence. xml et pom.xml ont dû être modifiés.

+1

Ceci ne répond pas à la "question", ou tente de comprendre pourquoi vous avez un problème, en le contournant simplement. Aussi, il serait essayer d'accéder au magasin de données parce que votre configuration lui a dit de le faire ... vous avez une propriété persistence définie pour faire exactement cela dans votre persistence.xml, donc si vous ne voulez pas créer une table alors pourquoi demander à? –