У меня есть приложение, в котором я сохранял все свои данные в Google Cloud SQL. Но теперь я думаю, что некоторые таблицы можно перенести в хранилище данных Google. Поэтому мой вопрос заключается в том, как использовать как хранилище данных, так и облачный SQL с использованием того же приложения. Я попытался проверить как опцию для хранилища данных, так и облачный SQL, но он остается только в Cloud SQL.Используйте Google Data Store и Google App Engine в одном приложении
Это мой файл 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-optional1">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<class>com.sample.poc.Component</class>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
<property name="datanucleus.singletonEMFForName" value="true"/>
</properties>
</persistence-unit>
<persistence-unit name="transactions-optional2"
transaction-type="RESOURCE_LOCAL">
<provider> org.datanucleus.jpa.PersistenceProviderImpl</provider>
<class>com.sample.poc.User</class>
<class>com.sample.poc.Role</class>
<properties>
<property name="javax.persistence.jdbc.driver"
value="com.google.appengine.api.rdbms.AppEngineDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:google:rdbms://span-test-app:testinstance/pocDB" />
<property name="javax.persistence.jdbc.user" value="" />
<property name="javax.persistence.jdbc.password" value="" />
</properties>
</persistence-unit>
</persistence>
Вот мои две EMF бобы:
Для Datastore:
package com.sample.poc;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public final class EMFDS {
private static final EntityManagerFactory emfInstance = Persistence
.createEntityManagerFactory("transactions-optional1");
private EMFDS() {
}
public static EntityManagerFactory get() {
return emfInstance;
}
}
Вот EMF боб для облачных SQL:
package com.sample.poc;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public final class EMFRDBMS {
private static final EntityManagerFactory emfInstance = Persistence
.createEntityManagerFactory("transactions-optional");
private EMFRDBMS() {
}
public static EntityManagerFactory get() {
return emfInstance;
}
}
Вот сервлет для вставки компонента в хранилище данных:
package com.sample.poc;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ComponentInsert extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String CompId = request.getParameter("CompId");
String CompName= request.getParameter("CompName");
response.setContentType("text/html");
EntityManager e = EMFDS.get().createEntityManager();
try {
e.getTransaction().begin();
Component ob = new Component();
ob.setCompId(Integer.parseInt(CompId));
ob.setCompName(CompName);
e.persist(ob);
e.getTransaction().commit();
} catch (Exception ex) {
e.getTransaction().rollback();
ex.printStackTrace();
}
}
}
Я просто хочу, чтобы пользователь, роль bean сохранялся в облаке sql и компоненте в хранилище данных.
Когда я пытаюсь вставить компонент в датасторе его бросает это исключение:
Caused by: javax.persistence.PersistenceException: No persistence providers available for "transactions-optional1" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:180)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:70)
at com.sample.poc.EMFDS.<clinit>(EMFDS.java:9)
... 40 more
12 Aug, 2013 9:48:24 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Nested in java.lang.ExceptionInInitializerError:
javax.persistence.PersistenceException: No persistence providers available for "transactions-optional1" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:180)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:70)
я упускаю некоторые вещи. Пожалуйста, предложите.
Где находится контейнер JavaEE в вашей среде? Это то, что для аннотации PersistenceContext. Вы не говорите, что вы пытались и что произошло, и что говорят различные журналы. Вы не указываете провайдера для одной единицы персистентности (так что JPA impl будет сохраняться в MySQL?). Какую версию JPA (1.0, 2.0, 2.1) вы используете для cloud-sql, а для AppEngine/Datastore? – DataNucleus
у вас не может быть 2 единицы с сохранением с тем же именем – DataNucleus
Я отредактировал вопрос. Пожалуйста, дайте свои ценные советы. – user2670364