2016-01-06 25 views
-1

我有基於maven的項目在GoogleAppEngine上進行部署。我有本地MySQL DB(用於開發)和遠程CloudSQL DB(用於生產)
我的代碼基於google github
CloudSQL和MySQL中的數據是相同的。嘗試通過生產中的命名查詢檢索數據時遇到問題 - 返回大小爲0的列表。在本地MySQL DB代碼正確返回數據。我甚至試圖使用標準的java.sql.Connection從ClodSQL檢索數據,並且我能夠檢索數據。只有在JPA請求時纔會返回數據。使用 命名查詢:JPA不會從CloudSQL返回任何數據

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

我的persistence.xml的pom.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> 

內容

<?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> 

和servlet的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(); 

} 

應用程序引擎日誌內沒有錯誤。你能告訴我什麼是錯的嗎?謝謝:)

+0

和您的JPA提供程序的日誌?什麼SQL被調用? LOG還說什麼? –

+0

謝謝,使用JPA日誌我能夠找出問題 – Ajvo

+1

你有完全不一致的jar版本... datanucleus-api-jpa v3.1.1 with datanucleus-core v4.0.0!爲什麼你在那裏使用舊版本,我沒有真正的想法。我看到的最新版本是datanucleus-accessplatform的4.1.7-jpa-rdbms –

回答

-1

我將日誌級別設置爲ALL,並發現Datanucleus試圖訪問數據存儲。它在數據存儲區內創建了新表並檢索其內容 - 沒有數據。
我不知道爲什麼有人試圖訪問數據存儲,並沒有使用CLOUDSQL,但請不要介意...
我更換DataNucles對Hibernate的教程裏面google github和它的工作在第一次
移民是容易的,只有持久性。必須修改xml和pom.xml。

+1

這並不回答「問題」,或試圖理解爲什麼你會遇到問題,只是繞過它。此外,它會試圖訪問數據存儲,因爲你的配置告訴它這樣做......你有一個持久性屬性被定義爲在你的persistence.xml中做到這一點,所以如果你不想它創建一個表,那麼爲什麼要問它來? –