GAE Developer - Day4
Simon @ MiCloud
2014Q1
Last Class
● Memcache basic
● Task Queue concept
● Push Queue
● Pull Queue
● Create a Bucket
● Create a CloudSQL
Before Today
Create a Bucket
$ gcloud auth login
$ gcloud config set project [my-project-id]
$ gsutil mb gs://[my-bucket]
$ gsutil ls gs://[my-bucket]
Sample Database
http://www.mysqltutorial.org/mysql-sample-database.aspx
Create a CloudSQL
$ gcloud sql -h
$ gcloud sql instances create [inst-name]
$ gcloud sql instances list
$ gcloud sql instances import instance-name --uri 
gs://your-bucket/sql-dump-file.gz
$ gcloud sql instances patch --assign-ip [inst-name]
$ gcloud sql instances get [inst-name]
Create a CloudSQL
$ gcloud sql instances set-root-password test-sql 
-p [password]
$ gcloud sql instances patch test-sql 
--authorized-networks=[your-ip-address]
Connect Cloud SQL - MySQL Workbench
http://www.mysql.com/products/workbench/
Today
● Use CloudStorage - BlobStore
● Connect CloudSQL
Using Cloud Storage
Use CloudStorage - BlobStore
Create Upload Url
BlobstoreService blobstoreService =
BlobstoreServiceFactory.getBlobstoreService();
UploadOptions uploadOptions =
UploadOptions.Builder.withGoogleStorageBucketName(
"BUCKET-NAME"); //Name without “gs://”
String uploadUrl = blobstoreService.createUploadUrl(
"/callback-url", uploadOptions);
resp.getWriter().println("<form action=" + uploadUrl
+ " method="post" enctype="multipart/form-data">");
resp.getWriter().println("<input type="file" name="field-name"");
public void doPost(HttpServletRequest req,
HttpServletResponse resp) throws IOException {
BlobstoreService blobstoreService =
BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<FileInfo>> blobs = blobstoreService.getFileInfos(req);
List<FileInfo> keys = blobs.get("field-name"); //input file name on
form
if (keys != null && keys.size() > 0) {
FileInfo fileKey = keys.get(0);
String objectUploaded = fileKey.getGsObjectName();
…. (Save the objectUploaded mapping to datastore or database)
Create Callback Handler
Serving Data
public void doGet(HttpServletRequest req, HttpServletResponse resp){
BlobstoreService blobstoreService =
BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey =
blobstoreService.createGsBlobKey("/gs/<bucket>/<object>");
try {
blobstoreService.serve(blobKey, resp);
} catch (IOException e){
e.printStackTrace();
}
….
Other Storage API
● Image API
● Cloud Storage Client Library
Connect Cloud SQL
Before Connect
● CloudSQL instance ready
● Authorized
○ root password
○ instance ip address
○ access ip address
Configure Connectors
● Hostname is Cloud SQL instance IP address
● Connection URL includes instance IP and
database name
● Java connection is:
jdbc:mysql://<instance-ip>:3306/
Local Test Configure
appengine-web.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>mitac-cp300</application>
<version>eord</version>
….
<use-google-connector-j>true</use-google-connector-j>
….
</appengine-web-app>
Connect from App Engine
● JDBC
● Java Persistence API (JPA)
● Java Data Objects (JDO)
● Other JPAs custom additions: Hibernate, EclipseLink
jdbc:google:mysql://...
(instead of jdbc:mysql://...)
Detect running environment
Connection conn = null;
if (SystemProperty.environment.value() ==
SystemProperty.Environment.Value.Production) {
// app is running in production
Class.forName("com.mysql.jdbc.GoogleDriver");
String url= "jdbc:google:mysql://instance-name/";
conn = DriverManager.getConnection(url);
...
} else {
// app is running on localhost
Class.forName("com.mysql.jdbc.Driver");
String url= "jdbc:mysql://db-ip-address/";
conn = DriverManager.getConnection(url);
...
}
conn.~
DriverManager.registerDriver(new AppEngineDriver());
conn = DriverManager.getConnection(connUrl);
String sql = "SELECT count(*) as total FROM " + tableName + "";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet results = stmt.executeQuery();
while (results.next()) {
int total = results.getInt("total");
…
}
Query Example - Standard JDBC
Other Frameworks
Popular frameworks for programming MySQL
● Hibernate (Java)
● JOOQ (Java)
● JPA ( Java )
● Django (Python)
Google App Engine Developer - Day4

Google App Engine Developer - Day4

  • 1.
    GAE Developer -Day4 Simon @ MiCloud 2014Q1
  • 2.
    Last Class ● Memcachebasic ● Task Queue concept ● Push Queue ● Pull Queue
  • 3.
    ● Create aBucket ● Create a CloudSQL Before Today
  • 4.
    Create a Bucket $gcloud auth login $ gcloud config set project [my-project-id] $ gsutil mb gs://[my-bucket] $ gsutil ls gs://[my-bucket]
  • 5.
  • 6.
    Create a CloudSQL $gcloud sql -h $ gcloud sql instances create [inst-name] $ gcloud sql instances list $ gcloud sql instances import instance-name --uri gs://your-bucket/sql-dump-file.gz $ gcloud sql instances patch --assign-ip [inst-name] $ gcloud sql instances get [inst-name]
  • 7.
    Create a CloudSQL $gcloud sql instances set-root-password test-sql -p [password] $ gcloud sql instances patch test-sql --authorized-networks=[your-ip-address]
  • 8.
    Connect Cloud SQL- MySQL Workbench http://www.mysql.com/products/workbench/
  • 9.
    Today ● Use CloudStorage- BlobStore ● Connect CloudSQL
  • 10.
  • 11.
  • 12.
    Create Upload Url BlobstoreServiceblobstoreService = BlobstoreServiceFactory.getBlobstoreService(); UploadOptions uploadOptions = UploadOptions.Builder.withGoogleStorageBucketName( "BUCKET-NAME"); //Name without “gs://” String uploadUrl = blobstoreService.createUploadUrl( "/callback-url", uploadOptions); resp.getWriter().println("<form action=" + uploadUrl + " method="post" enctype="multipart/form-data">"); resp.getWriter().println("<input type="file" name="field-name"");
  • 13.
    public void doPost(HttpServletRequestreq, HttpServletResponse resp) throws IOException { BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); Map<String, List<FileInfo>> blobs = blobstoreService.getFileInfos(req); List<FileInfo> keys = blobs.get("field-name"); //input file name on form if (keys != null && keys.size() > 0) { FileInfo fileKey = keys.get(0); String objectUploaded = fileKey.getGsObjectName(); …. (Save the objectUploaded mapping to datastore or database) Create Callback Handler
  • 14.
    Serving Data public voiddoGet(HttpServletRequest req, HttpServletResponse resp){ BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/<bucket>/<object>"); try { blobstoreService.serve(blobKey, resp); } catch (IOException e){ e.printStackTrace(); } ….
  • 15.
    Other Storage API ●Image API ● Cloud Storage Client Library
  • 16.
  • 17.
    Before Connect ● CloudSQLinstance ready ● Authorized ○ root password ○ instance ip address ○ access ip address
  • 18.
    Configure Connectors ● Hostnameis Cloud SQL instance IP address ● Connection URL includes instance IP and database name ● Java connection is: jdbc:mysql://<instance-ip>:3306/
  • 19.
    Local Test Configure appengine-web.xml <?xmlversion="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application>mitac-cp300</application> <version>eord</version> …. <use-google-connector-j>true</use-google-connector-j> …. </appengine-web-app>
  • 20.
    Connect from AppEngine ● JDBC ● Java Persistence API (JPA) ● Java Data Objects (JDO) ● Other JPAs custom additions: Hibernate, EclipseLink jdbc:google:mysql://... (instead of jdbc:mysql://...)
  • 21.
    Detect running environment Connectionconn = null; if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) { // app is running in production Class.forName("com.mysql.jdbc.GoogleDriver"); String url= "jdbc:google:mysql://instance-name/"; conn = DriverManager.getConnection(url); ... } else { // app is running on localhost Class.forName("com.mysql.jdbc.Driver"); String url= "jdbc:mysql://db-ip-address/"; conn = DriverManager.getConnection(url); ... } conn.~
  • 22.
    DriverManager.registerDriver(new AppEngineDriver()); conn =DriverManager.getConnection(connUrl); String sql = "SELECT count(*) as total FROM " + tableName + ""; PreparedStatement stmt = conn.prepareStatement(sql); ResultSet results = stmt.executeQuery(); while (results.next()) { int total = results.getInt("total"); … } Query Example - Standard JDBC
  • 23.
    Other Frameworks Popular frameworksfor programming MySQL ● Hibernate (Java) ● JOOQ (Java) ● JPA ( Java ) ● Django (Python)