Rollin onj Rubyv3

46

description

Using JPA vs. Activerecord for persistence in JrubyChris Bucchere and Pieter Humphrey from Openworld 2009.

Transcript of Rollin onj Rubyv3

Page 1: Rollin onj Rubyv3
Page 2: Rollin onj Rubyv3

Enterprise Ruby on Rails: Rolling with JRuby on Oracle WebLogic SuiteChris BucchereCEO of BDGPieter HumphreyPrincipal Product Manager, Oracle

Page 3: Rollin onj Rubyv3

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 4: Rollin onj Rubyv3

Intro Slides

• Chris Bucchere – CEO, BDG– Oracle ACE Director

• Pieter Humphrey– Principal Product Director, Oracle

Page 5: Rollin onj Rubyv3

Ruby 101

Page 6: Rollin onj Rubyv3

Ruby Overview

• Key Features– Purely object-oriented– Dynamically-typed– Compact, yet easy to read syntax– Blocks that are closures– Open classes and objects– Domain Specific Language capabilities

Strong

Weak

staticdynamic

Page 7: Rollin onj Rubyv3

Basics

Page 8: Rollin onj Rubyv3

Iteration, Blocks & Closures

Page 9: Rollin onj Rubyv3

String Handling & Regular Expressions

Page 10: Rollin onj Rubyv3
Page 11: Rollin onj Rubyv3

Guiding Principles

• Duck Typing– If it walks like a duck and quacks like a duck, then it probably

is a duck

• Convention over Configuration– Down with XML!

• Rapid Prototyping– Allows for agile development with short iterations

• Sustainable Productivity

Page 12: Rollin onj Rubyv3

Example Applications

• Twitter• 43Things• 37 Signals– Basecamp– Campfire– Backpack– Highrise

• Social Collective, Inc.– The Social Collective– CrowdCampaign

• Thousands of others. . . .

Page 13: Rollin onj Rubyv3

Migrations

Page 14: Rollin onj Rubyv3

ActiveRecord & Validations

Page 15: Rollin onj Rubyv3

Scaffolding

Page 16: Rollin onj Rubyv3

Built-in MVC

Page 17: Rollin onj Rubyv3

UI Helpers

Page 18: Rollin onj Rubyv3

Show methe money!

Page 19: Rollin onj Rubyv3

JRuby and Database Access

Page 20: Rollin onj Rubyv3

What is JRuby?• JRuby is a port of Ruby onto Java, written in C & ruby• Offers Native Multithreading• Full Access to Java Libraries

Configuration DSL

Exte

rnal

Sys

tem

s

Static Layer - Static typed legacy Java Libraries

Dynamic layer - Application Code

Page 21: Rollin onj Rubyv3

Why JRuby?

• To use Java libraries from code written in Ruby syntax– Swing, etc

• To use Ruby libraries from code written in Java syntax– Via ActiveRecord with Bean Scripting Framework (BSF)– Via “Scripting for the Java Platform” (JSR 223) in Java 6

• Performance vs. C-based interpreter is a hot debate– Depends who you ask, but it seems performance is surprisingly good

• Great for the following use cases– Agile Methodology shops, small teams– REST / Web App for routing data to back end resources– Enterprise Deployments

Page 22: Rollin onj Rubyv3

Why JRuby cont.• Integration with Java libraries:

JRuby classes can• extend Java classes• implement a single Java interface• add methods to existing Java classes

• Native threads• Unicode support• Portability• Can drop in into SQL easily ( find_by_sql )• Many DB accees options – this is where Ruby shines

Page 23: Rollin onj Rubyv3

JRuby Developer Tool support

• IDEs– Eclipse– RDT plug-in supports Ruby development– RadRails IDE– IntelliJ IDEA– NetBeans

• Editors– syntax highlighting (emacs, jEdit and Vim)

• Spring– an IOC + Java EE framework – supports beans implemented in Java, JRuby, Groovy

Page 24: Rollin onj Rubyv3

Rack

• Ruby’s CGI / Servlet equivalent – In web.xml, a rack servlet filter will dispatch params /

requests to the RACK component

• Rack provides a single API to abstracts multiple webservers ( mongrel, fast-cgi, webrick, fusion passenger )• Standardizes the request that a Ruby app expects

(get params), wrapping HTTP requests/responses• Based on WSGI for Python

Page 25: Rollin onj Rubyv3

<Insert Picture Here>

Ruby DBI

Ruby Script

DBI

API

ADO ODBCDatabasesDB2, Informix, mySQL, Oracle

Page 26: Rollin onj Rubyv3

ActiveRecord

• ActiveRecord is …– a Ruby library for accessing relational databases– Simple, yet amazingly powerful / portable DB access– Tricky to tune under load, not for use with legacy schemas

• It can be used from Java through JRuby– install the ActiveRecord gem – under Java 5 and earlier• use Bean Scripting Framework (BSF)– classpath must contain bsf.jar, jruby.jar, jvyaml.jar,

commons-logging-1.1.jar– under Java 6 and later• use JSR 223 Scripting API

• Convention, not configuration• Great for greenfield web apps

Page 27: Rollin onj Rubyv3

Getting Started with JRuby

• Getting JRuby– http://dist.codehaus.org/jruby/1.3.1/ – jRuby1.3.1/bin should be in PATH– JDK 1.5 or more should be in PATH, JAVA_HOME set– Apache Ant (http://jakarta.apache.org/ant/) 1.7 or greater

• Getting Rails (the web tier for Ruby)– Once JRuby environment is set:– 'gem install rails -v 2.2.2'

• Getting Warbler (Java EE deployment unit converter)– 'gem install warbler -v 0.9.12‘– Make sure you aren’t behind a proxy server

Page 28: Rollin onj Rubyv3

Demo Application: Maintain FOD Supplier Catalog

FOD SCHEMA

WebLogicServer

EclipseLinkRun WARBLER

Ruby App

JRubyinterpreter

Ruby App

Page 29: Rollin onj Rubyv3

JRuby, WebLogic, TopLink Database Access

Page 30: Rollin onj Rubyv3

JPA—in a Nutshell

• Concrete classes (POJOs)• No required interfaces or inheritance• new() for instance creation• Mapping using annotations and/or XML• “Managed” by an EntityManager• Can leave the Container (“detached”)

Page 31: Rollin onj Rubyv3

Where does JPA fit?

RelationalDatabase

Java SE/EE/OSGi

JPA Persistence Provider

Design Time Runtime

Mapping Metadata

Java Classes

Database Schema

Page 32: Rollin onj Rubyv3

<Insert Picture Here>

JRuby + JPA = Enterprise friendly Rails

• JPA is better for working with pre-existing database schemas

• JRuby/JPA/WebLogic = easy Ops compliance• Development tools: Standalone, JDev, Eclipse• WebLogic provides connection pooling• WebLogic provides Oracle RAC integration• WebLogic provides Oracle JPA / Coherence integration• WebLogic provides XA with Messaging & DB• WebLogic provides easy ways to expose as JAX-WS, JAX-

RPC, Spring Beans• WebLogic provides SUN RI: EclipseLink, Kodo

Page 33: Rollin onj Rubyv3

WebLogic Server JDBC Architecture

Page 34: Rollin onj Rubyv3
Page 35: Rollin onj Rubyv3

JDBC 4.0 - Connection Management

• Additional enhancements to Connection interface to permit improved connection state tracking in pool environments.

• Connection new methods– isValid Check whether the current connection has not been closed and is still valid.– getClientInfo & setClientInfo Get and set current value of client info property supported by the driver. The values

supplied to these methods are used for accounting, diagnostics and debugging purposes only.

• Code example

Page 36: Rollin onj Rubyv3

JDBC 4.0 - Statement Management

• Additional enhancements to Statement interface to get greater flexibility when managing Statement objects in pool environments.

• Statement new methods– isClosed: Check whether this Statement object has been closed. – isPoolable & setPoolable: Get and set poolable state of this statement

object .• Code example

Page 37: Rollin onj Rubyv3

JDBC 4.0 - Wrapper Pattern

• Added the ability to unwrap implementation of JDBC classes to make use of non-standard JDBC methods provided by vendor implementations.

• New interface java.sql.Wrapper– isWrapperFor It can be used to determine if the instance implements the specified interface or

if the instance is a wrapper for an object that does.– unwrap It is used to return an object that implements the specified interface allowing

access to vendor-specific methods.• Subinterfaces derived from Wrapper

– Connection– Statement– PreparedStatement– CallableStatement– ResultSet– DatabaseMetaData– …

Page 38: Rollin onj Rubyv3

JDBC 4.0 - New data types

• Add the data type java.sql.RowId. This allows JDBC programs to access a SQL ROWID.

• Resultset new methods– getRowId– updateRowId

• Add new interface java.sql.SQLXML. Additional APIs have been added to allow applications access to this data.

• Connection new method– createSQLXML

• PreparedStatement new method– setSQLXML

• CallableStatement new methods– getSQLXML– setSQLXML

• ResultSet new methods– getSQLXML– updateSQLXML

Page 39: Rollin onj Rubyv3

TopLink 11g (includes EclipseLink 1.0.1)

Eclipse Persistence Services Project (EclipseLink)

DBWSDBWS

SDOSDO

EISEIS

MOXyMOXy

JPAJPA

XML Data Legacy SystemsDatabases

Java SEJava SE Java EEJava EE OSGiOSGi SpringSpring ADFADF

Page 40: Rollin onj Rubyv3

Scaling with JPA and ActiveCache • A clustered Enterprise Java application can experience slower

response time due to database latency as it scales its number of instances– As the number of concurrent application instance increase the

number of read and write requests that must use the database also increase

– Independent caching in each application node must be minimized where concurrent writing is involved

– Reduced caching comes at a cost of increasing backend database load

App Machines

WebLogic Cluster

Enterprise App

JDBC

Enterprise App

JDBC

Web App

JDBC

Databases

Persistence Persistence Persistence

Page 41: Rollin onj Rubyv3

Scaling with JPA and ActiveCache • TopLink Grid integrates Coherence as shared cache for TopLink

11g JPA between Application Tier and database• Single Coherence cache shared by all application nodes

supports maximum caching even with concurrent writing• Coherence Data Grid caching minimizes database load to allow

for predictable scalability

Named Cache Named Cache Named Cache Named Cache

Cache Store Cache Store Cache Store Cache Store

Named Cache

Cache Store

Oracle Coherence In Memory Data Grid

Database

App Machines

WebLogic Cluster

Enterprise App

JDBC

Enterprise App

JDBC

Web App

JDBCJPA JPA JPA

Page 42: Rollin onj Rubyv3

TopLink Grid

• Combines:– the simplicity of application development using the Java

standard Java Persistence API (JPA) with– the scalability and distributed processing power of Oracle’s

Coherence Data Grid.

Page 43: Rollin onj Rubyv3

TopLink Grid Features

• Simple configuration using annotations that align with standard JPA, e.g.,

@Entity@Customizer(CoherenceReadWriteCustomizer.class)public class Title implements Serializable {

• Ability to choose which entities are stored in the grid versus those stored directly in the backing data store• Support for executing queries against either the Grid

or directly against the data store– JPQL queries translated into Coherence filters– Queries executed in parallel across all members in grid

• Support for all Coherence distribution schemes

Page 44: Rollin onj Rubyv3

TopLink Grid Features (2)

• Support for sequence generation and locking using either the Grid or the backing data store– Optimistic Locking supported against Grid

• Store entities in their object representation– Avoid object building cost when retrieving entity from grid– Once in the grid, all member save on building cost, not just

initial reader

• Leverage the power of the Coherence Data Grid, e.g.,– Parallel query processing– Linear scalability– Change listeners, etc.

Page 45: Rollin onj Rubyv3

TopLink Grid CacheStore

• Coherence backed by TopLink Grid for DB Access

(c) Copyright 2007. Oracle Corporation

Page 46: Rollin onj Rubyv3

TopLink Development Tool Support

• JDeveloper 11g– Advanced JPA Tooling– Native ORM, OXM, and EIS mapping

• Eclipse IDE– EclipseLink JPA support provided by Dali in Eclipse 3.4 (Ganymede)– Oracle Enterprise Pack for Eclipse (OEPE) offers additional support

for building and deploying to WebLogic• Standalone Workbench– TopLink 11g Workbench for using oracle.toplink.* (toplink.jar)• Native ORM, OXM, and EIS mapping

– EclipseLink Workbench (not shipped in 11g) for org.eclipse.persistence.* (eclipselink.jar)• Native ORM, OXM, and EIS mapping