Internetteknologi (ITNET1)

Download Report

Transcript Internetteknologi (ITNET1)

Objektorienteret Middleware (OOMI)
Persistence
Goal with todays lesson
• After these 2x35 minutes you will be:
– Comfortable with the expression “persistence”, and how
it relates to Distributed Systems
– Knowledgeable about different strategies for obtaining
persistence for Distributed Systems
– You will not:
• Be an expert on persistence, as this is a huge area in itself
Slide 2 af 53
Ingeniørhøjskolen i Århus
Outline
• Plenum – experince with persistent datastorage
• Principles of Persistence
• Datastore Technology for Persistence
– Files
– Relational Databases
– Object Databases
• Exemplified OR-mapping with EJB
Slide 3 af 53
Ingeniørhøjskolen i Århus
Experience with Persistent datastorage
• To establish a picture of your knowledge
– What kind of persistent datastorage do you know?
– What experience do you have in using it with
programming languages?
– What problems did you face – and how did you solve
them?
Slide 4 af 53
Ingeniørhøjskolen i Århus
Principles of Persistence
What is Persistence?
• Persistence is the ability of an object to survive
the lifetime of the process in which it resides.
• Persistence is relevant for stateful server objects.
• What is State?
– State = object instance attributes – private & public
– Not methods
• RMI & CORBA activation/deactivation
– The state needs to be retained between object
deactivation and object activation
– Why?
Slide 6 af 53
Ingeniørhøjskolen i Århus
How to achieve Persistence?
• Storing object state on persistent datastore before
de-activation
• Upon activation, load object state from persistent
datastore
– As we shall see in RMI & CORBA
• Persistent storage can be obtained by?
– File system (Hard Drive, Disk-on-Chip, Flash Memory)
• embedded systems with a disk storage
– Relational Database
• All from embedded, to desktop and enterprise servers (most widely used is SQL servers)
– Object-Database
• no widespread support yet
Slide 7 af 53
Ingeniørhøjskolen i Århus
Transparency of Persistence
• Persistence should be transparent to users and
designers of client objects
Client Objects
Server Objects Datastore Objects
Client
InterfaceSlide 8 af 53
Persistence
Interface Ingeniørhøjskolen i Århus
Persistence Concepts
C++/Java object or class
Object
= row in
RDBMS table
Storage
Objects
Storage Home
Incarnation
Datastore
C++/Java object
Sessions
Storage
Homes
RDBMS
Server
Storage Object
Incarnation
RDBMS
Table
C++/Java object
Slide 9 af 53
Ingeniørhøjskolen i Århus
Datastore Technology for Persistence
Datastore Technology
• Persistence can be implemented using
• Files
– CORBA Externalization
– Java Serialization
– Structured Storage in COM
• Relational Databases
– Object Relational Mappings
– JDBC/ODBC
• Oracle, IBM DB2, Microsoft SQL Server & Access, MySQL
• Object Databases
Slide 11 af 53
Ingeniørhøjskolen i Århus
How to obtain persistence?
• Roll your own persistence
– SOAP, RMI
•
•
•
•
For Java – use JDBC for RDBMS, serialization for filesystems
CORBA Externalization for filesystems
COM Serialization or Structured Storage
Possible to construct your own framework (e.g. ROAD)
• Use a standard service
–
–
–
–
CORBA Persistence service (PSS)
COM Persistence service
Enterprise Java Beans
May still be necessary to obtain persistence manually
Slide 12 af 53
Ingeniørhøjskolen i Århus
Externalization in CORBA
• Technique to
– write composite objects into a byte stream
– load composite objects from a byte stream
• Byte stream can then be written to/read from the
file system
• Supported by several CORBA products
• Also used to store Java objects
Slide 13 af 53
Ingeniørhøjskolen i Århus
Java Serialization
• Transforms Java objects into stream
• Follows all referenced Java objects
• Stream can be written onto a file to achieve
persistence
• Objects must implement Serializable
• Attributes that need not be made persistent can
be declared as transient in the class definition
Slide 14 af 53
Ingeniørhøjskolen i Århus
Example of using Serialization for RMI
• http://java.sun.com/j2se/1.3/docs/guide/rmi/activat
ion/activation.4.html
– Class:
• public class MyPersistentClass extends Activatable
– This Activatable class will
– Restore its State upon activation (if the file
persistentObjectStore.ser exist)
– Save its State after a new transaction is registered
– This could also have been done utilizing an RDBMS
Slide 15 af 53
Ingeniørhøjskolen i Århus
private Vector transactions;
private File holder;
public MyPersistentClass(ActivationID id, MarshalledObject data)
throws RemoteException, ClassNotFoundException, java.io.IOException {
CONSTRUCTOR of MyPersistentClass
Find complete example and tutorial at:
http://java.sun.com/j2se/1.3/docs/
guide/rmi/activation/activation.4.html
// Register the object with the activation system
// then export it on an anonymous port
super(id, 0);
// Extract the File object from the MarshalledObject that was
// passed to the constructor
holder = (File)data.get();
Every time a passivated object is called,
the constructor is called as the rmid daemon
Instantiates it to activate – and here it
is checked whether the File exist – or not.
If it does exist, then its State is restored
if (holder.exists()) {
// Use the MarshalledObject to restore my state
this.restoreState();
} else {
transactions = new Vector(1,1);
transactions.addElement("Initializing transaction vector");
}
}
Slide 16 af 53
Ingeniørhøjskolen i Århus
public Vector calltheServer(Vector v) throws RemoteException {
Find complete example and tutorial at:
http://java.sun.com/j2se/1.3/docs/
guide/rmi/activation/activation.4.html
int limit = v.size();
for (int i = 0; i < limit; i++) {
transactions.addElement(v.elementAt(i));
}
// Save this object's data out to file
//
this.saveState();
return transactions;
}
private void restoreState() throws IOException, ClassNotFoundException {
File f = holder;
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
transactions = (Vector)ois.readObject();
ois.close();
}
private void saveState() {
try {
File f = holder;
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(getTransactions());
oos.close();
} catch (Exception e) {
throw new RuntimeException("Error saving vector of data");
}
}
Slide 17 af 53
Using simpel Java Serilization
To obtain perstistence
Ingeniørhøjskolen i Århus
Persistence Interfaces in COM
<<Interface>>
IUnknown
<<Interface>>
IPersist
+ GetClassID()
<<Interface>>
IPersistStorage
+ IsDirty()
+ InitNew()
+ Load()
+ Save()
+ SaveCompleted()
+ HandsOffStorage()
<<Interface>>
IPersistStream
+ IsDirty()
+ Load()
+ Save()
+ GetSizeMax()
Slide 18 af 53
<<Interface>>
IPersistFile
+ IsDirty()
+ Load()
+ Save()
+ SaveCompleted()
+ GetCurFile()
Ingeniørhøjskolen i Århus
Problems with File-based Persistence
• Mapping to Files can be inefficient for large
composite objects
• Finder methods diffuclt to develop
– Naming & File search difficult
• File systems only have crude support for
concurrency control
• File systems lack support for fault-tolerance
(transactions)
• Application specific code needed for every
persistent class
Slide 19 af 53
Ingeniørhøjskolen i Århus
Relational Database
• Relational Database Management Systems
(RDBMSs) Examples:
–
–
–
–
–
–
–
Oracle
DB2
Microsoft SQL Server
Sybase
Microsoft Access
MySQL (freeware)
PostGree DB (freeware)
Slide 20 af 53
Ingeniørhøjskolen i Århus
Mapping to RDBMSs
• Relational database schemas consist of sets of
tables
• Define a table for each type
• In each table create
– primary key for object identifier
– a column for each attribute of the object
• mapping of middleware atomic types to primitive types
supported by RDMBS
• secondary keys for object references
• Resolve inheritance statically
– This and other problems -> the OR impedance
mismatch
Slide 21 af 53
Ingeniørhøjskolen i Århus
Embedding Queries into Programs
• Pure Embedded SQL
–
–
–
–
Macros to embed queries into programs
RDBMS provides processor to expand macros
API to traverse queries
Not standardized
• Open Database Connectivity - ODCB (Microsoft)
– Standardized API for RDBMS Access available on all
Microsoft Platforms
• Java Database Connectivity – JDCB (Sun)
– Standardized RDBMS Access from Java
Slide 22 af 53
Ingeniørhøjskolen i Århus
Issues with mapping
• Does this mean that we should figure out for
ourselfes how to obtain the OR-mapping?
–
–
–
–
–
–
–
No
Frameworks available
CORBA PSS, COM persistence, EJB for Java
JDBC/ODBC is at a low level – but very feasible
Torque/Turbine project freeware
JDO maps to XMI
In the following EJB will be presented
Slide 23 af 53
Ingeniørhøjskolen i Århus
RDBMS mapping illustrated with EJB’s
Enterprise JavaBeans (EJBs)
• Standard server-side component model for Java
Enterprise Applications
–
–
–
–
–
security
resource pooling
persistence
concurrency
transactional integrity
• Has nothing to do with “JavaBeans”
– JavaBeans designed for intra-process purposes
• GUIs
• non-visual widgets
– Enterprise Java Beans (EJB) designed for inter-process
purposes
Ingeniørhøjskolen i Århus
Slide 25 af 53
EJBs (cont.)
• Java
– platform independence
– “write once, run anywhere”
• EJB components
– platform/implementation independence
– write once, run in any Application Server complying with
the EJB spec
•
•
•
•
•
•
J2EE reference implementation
Oracle’s Application Server (OAS)
IBM’s Websphere
BEA’s Weblogic Server and Weblogic Enterprise
Sybase’s EAServer
Open Source – JBoss (see links)
Slide 26 af 53
Ingeniørhøjskolen i Århus
EJB Architecture
• Interfaces and Classes
– beans
• entity bean (maps perfectly to the “Entity stereotype”
• session beans (no primary key – maps to “Control”)
– Stateless session bean
– Stateful session bean
• GUI? JSP/Servlet or Java Application
– primary key (implemented in a class)
– home interface (local and remote)
– EJB object interface (local and remote)
• Container / Application Server
Slide 27 af 53
Ingeniørhøjskolen i Århus
Bean Types
• Entity beans
• models persistent state - this state is maintained through all
method and server invocations
• nouns of the domain
• real world objects (e.g. Owner, Account, Transaction)
• Session beans
• models non-persistent state - this state will be lost between
method invocations (stateless session) or server invocations
(Stateful session)
• manage tasks performed on behalf of a single client (e.g. Teller,
Monthly Statement)
– contains the business processes in which to use entity beans
• manages actions that may cross entity beans or go outside the
concern of an entity bean
– e.g. Teller may authenticate the user and transfer funds between
accounts
– e.g. Statement may include transactions from multiple accounts
Slide 28 af 53
Ingeniørhøjskolen i Århus
Bean Usage
• Entity beans
Maps to domain model (Entity classes)
– model state maintained across all client interactions
– represent a row of data in a database
• Session beans
Maps to Use Case model (Control classes)
– model business process being performed by a single
client involving one or more entity beans
– it extends the actions of the client into the server
• simplifies the actions programmed by the client
• limits the number of distributed calls required between the
client and the entity beans
• limits the number of stubs that have to be loaded by the client
– are not persisted to a database
Slide 29 af 53
Ingeniørhøjskolen i Århus
Persistence Concepts in EJB
Storage
Objects
Storage Home
Incarnation
Datastore
Sessions
Storage
Homes
Storage Object
Incarnation
Slide 30 af 53
Ingeniørhøjskolen i Århus
State Management
• State synchronization methods
– ejbLoad
– ejbStore
• Resource Management methods
– ejbActivate
– ejbPassivate
Slide 31 af 53
Ingeniørhøjskolen i Århus
Entity Bean Types
• Bean can have total control over loading and
storing from database
– Bean Managed Persistence (BMP)
• Container can take over this responsibility
– Container Managed Persistence (CMP)
• Still need to define an OR mapping in admin tool
• This is the same in CORBA PSS
– Specialized Implementations
• Legacy applications such as CICS
• When to choose what?
– Well – start out with CMP if possible, and then migrate
code as performance issues pops up during testing
Slide 32 af 53
Ingeniørhøjskolen i Århus
Bean Manged Perstistence
• Have to handle all database interaction
– except transactions (more of this next time)
• ejbLoad() and ejbStore() called when bean
instance state must be synchronized with
database
• ejbActivate() and ejbPassivate() called when bean
is moved between the ready state and pooled
state
Slide 33 af 53
Ingeniørhøjskolen i Århus
Implement a BMP Entity Bean
package java.examples.ejb.entity.bean;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
…
public class BookBMP extends BookEJB {
private DataSource dataSource_;
private EntityContext ctx_;
…
Additional setup of database connections needed – some are done in the configuration tool
Important features: Entity beans always implement the following event handles:
•ejbCreate: inseret
•ejbRemove: delete
•ejbLoad: select
•ejbStore: update
•ejbFindByPrimaryKey: select
•And more can be implemented:
•ejbFindBooksByAuthor: select
Slide 34 af 53
Ingeniørhøjskolen i Århus
Implement DB Insertion
public String ejbCreate(String id, String title, String author, String topic) {
super.ejbCreate(id, title, author, topic);
Connection conn = null;
PreparedStatement pstatement = null;
try {
conn = dataSource_.getConnection();
pstatement=conn.prepareStatement("insert into Book (id, title,
author, topic)"+
” values (?, ?, ?, ?)");
pstatement.setString(1,id_);
pstatement.setString(2,title_);
pstatement.setString(3,author_);
pstatement.setString(4,topic_);
pstatement.execute();
return id_;
}
catch(SQLException ex) { throw new EJBException(ex); }
finally { … }
}
Slide 35 af 53
BookBMP
OR mapping
id
title
author
topic
42123
EJB
SW
EJB
43423
EJB2
SW
EJB
…
…
…
…
Ingeniørhøjskolen i Århus
Implement DB Load
public void ejbLoad() {
Connection conn = null;
PreparedStatement pstatement = null;
ResultSet rs = null;
try {
conn = dataSource_.getConnection();
pstatement = conn.prepareStatement(
"select id, title, author, topic from Book " + "where id = ?");
pstatement.setString(1, (String)ctx_.getPrimaryKey());
rs = pstatement.executeQuery();
if (rs.next()) {
id_ = rs.getString("id");
title_ = rs.getString("title");
author_ = rs.getString("author");
topic_ = rs.getString("topic");
super.ejbLoad();
}
else {
throw new EJBException("unable to locate row");
}
}
catch(SQLException ex) {
throw new EJBException(getText(ex));
}
finally { … }
...
Slide 36 af 53
Ingeniørhøjskolen i Århus
Implement DB Store
public void ejbStore() {
Connection conn = null;
PreparedStatement pstatement = null;
try {
super.ejbStore();
conn = dataSource_.getConnection();
pstatement = conn.prepareStatement(
"update Book set title=?, author=?, topic=? " + "where id = ?");
pstatement.setString(1,title_);
pstatement.setString(2,author_);
pstatement.setString(3,topic_); pstatement.setString(4,id_);
pstatement.executeUpdate();
}
catch(SQLException ex) { throw new EJBException(getText(ex)); }
finally { … }
}
Slide 37 af 53
Ingeniørhøjskolen i Århus
Implement DB Remove
public void ejbRemove() {
Connection conn = null;
PreparedStatement pstatement = null;
try {
super.ejbRemove();
conn = dataSource_.getConnection();
pstatement = conn.prepareStatement("delete from Book " + "where id = ?");
pstatement.setString(1, (String)ctx_.getPrimaryKey());
pstatement.executeUpdate();
}
catch(SQLException ex) { throw new EJBException(getText(ex)); }
finally { … }
}
Slide 38 af 53
Ingeniørhøjskolen i Århus
Implement Finders
public String ejbFindByPrimaryKey(String pk) throws FinderException {
Connection conn = null;
PreparedStatement pstatement = null;
ResultSet rs = null;
try {
conn = dataSource_.getConnection();
pstatement = conn.prepareStatement("select id from Book " + "where id = ?");
pstatement.setString(1, pk);
rs = pstatement.executeQuery();
if (rs.next()) {
return rs.getString("id");
}
else { throw new ObjectNotFoundException(pk + " no found"); }
}
catch(SQLException ex) { throw new EJBException(getText(ex)); }
finally {... }
}
Slide 39 af 53
Ingeniørhøjskolen i Århus
Implement Finders (cont.)
public Collection ejbFindAll() throws FinderException {
Connection conn = null;
PreparedStatement pstatement = null;
ResultSet rs = null;
try {
Vector pKeys = new Vector();
conn = dataSource_.getConnection();
pstatement = conn.prepareStatement("select id from Book ");
rs = pstatement.executeQuery();
while (rs.next()) {
pKeys.add(rs.getString("id"));
}
return pKeys;
}
catch(SQLException ex) {throw new EJBException(getText(ex)); }
finally {... }
}
Slide 40 af 53
Ingeniørhøjskolen i Århus
RDBMS JDBC DataBean / JavaBean
example from DEITEL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Fig. 31.20: GuestBean.java
// JavaBean to store data for a guest in the guest book.
package com.deitel.advjhtp1.jsp.beans;
public class GuestBean {
private String firstName, lastName, email;
// set the guest's first name
public void setFirstName( String name )
{
firstName = name;
}
// get the guest's first name
public String getFirstName()
{
return firstName;
}
// set the guest's last name
public void setLastName( String name )
{
lastName = name;
}
This is another
way of using
JDBC access to a
RDBMS.
It consists of two
elements, the
JavaBean (code
to left is a
GuestBean), and
a DataBean
(GuestDataBean).
// get the guest's last name
public String getLastName()
{
return lastName;
}
// set the guest's email address
public void setEmail( String address )
{
email = address;
Slide 42 af 25
Ingeniørhøjskolen i Århus
36
37
38
39
40
41
42
43
}
// get the guest's email address
public String getEmail()
{
return email;
}
GuestBean.ja
va
}
Slide 43 af 25
Ingeniørhøjskolen i Århus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Fig. 31.21: GuestDataBean.java
// Class GuestDataBean makes a database connection and supports
// inserting and retrieving data from the database.
package com.deitel.advjhtp1.jsp.beans;
// Java core packages
import java.io.*;
import java.sql.*;
import java.util.*;
Defines the database driver, URL,
public class GuestDataBean {
and SQL statements.
private Connection connection;
private PreparedStatement addRecord, getRecords;
GuestDataBea
n.java
Set up database
// construct TitlesBean object
public GuestDataBean() throws Exception
{
// load the Cloudscape driver
Class.forName( "COM.cloudscape.core.RmiJdbcDriver" );
// connect to the database
connection = DriverManager.getConnection(
"jdbc:rmi:jdbc:cloudscape:guestbook" );
getRecords =
connection.prepareStatement(
"SELECT firstName, lastName, email FROM guests"
);
addRecord =
connection.prepareStatement(
"INSERT INTO guests ( " +
"firstName, lastName, email ) " +
"VALUES ( ?, ?, ? )"
);
Slide 44 af 25
Ingeniørhøjskolen i Århus
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
}
// return an ArrayList
ofthe
GuestBeans
Obtain
guest list from the
public List getGuestList() throws SQLException
database. Return each guest in a
{
List guestList =bean.
new ArrayList();
// obtain list of titles
ResultSet results = getRecords.executeQuery();
// get row data
while ( results.next() ) {
GuestBean guest = new GuestBean();
GuestDataBea
n.java
Database access
methods
guest.setFirstName( results.getString( 1 ) );
guest.setLastName( results.getString( 2 ) );
guest.setEmail( results.getString( 3 ) );
guestList.add( guest );
}
return guestList;
}
// insert a guest in guestbook database
public void addGuest( GuestBean guest ) throws SQLException
{
addRecord.setString( 1, guest.getFirstName() );
addRecord.setString( 2, guest.getLastName() );
addRecord.setString( 3, guest.getEmail() );
addRecord.executeUpdate();
}
// close statements and terminate database connection
Slide 45 af 25
Ingeniørhøjskolen i Århus
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
protected void finalize()
{
// attempt to close database connection
try {
getRecords.close();
addRecord.close();
connection.close();
}
// process SQLException on close operation
catch ( SQLException sqlException ) {
sqlException.printStackTrace();
}
GuestDataBea
n.java
Close
database
}
}
Slide 46 af 25
Ingeniørhøjskolen i Århus
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<input type = "text" name = "email" />
</td>
</tr>
<tr>
<td colspan = "2">
<input type = "submit"
value = "Submit" />
</td>
</tr>
Calls the guestData Bean to write this
</table>
</form>
new guest into the address book. The
forward the client to the guestBookView
JSP.
<% // continue scriptlet
} // end if
else {
guestData.addGuest( guest );
%> <%-- end scriptlet to insert jsp:forward action --%>
<%-- forward to display guest book contents --%>
<jsp:forward page = "guestBookView.jsp" />
Example of
usage of the
JavaBean/
Databean in
JSP
GuestBookLog
in.jsp
Add new guest to
book
<% // continue scriptlet
}
// end else
%> <%-- end scriptlet --%>
</body>
</html>
Slide 47 af 25
Ingeniørhøjskolen i Århus
RDBMS JDBC DataBean / JavaBean
• This may be better suited for WebServices / RMI
• You may also employ SQL directly in your Servant
objects
• Also see: http://db.apache.org/torque/torque301/tutorial/index.html on how to use Torque
Slide 48 af 53
Ingeniørhøjskolen i Århus
Using the Torque framework
Excerpt from tutorial – defining the Schema
…
<table name="author" description="Author Table">
<column name="author_id" required="true" primaryKey="true" type="INTEGER"
description="Author Id"/>
<column name="first_name" required="true" type="VARCHAR" size="128"
description="First Name"/>
<column name="last_name" required="true" type="VARCHAR" size="128"
description="Last Name"/>
</table>
</database>
Excerpt from tutorial – sample code
Publisher addison = new Publisher();
addison.setName("Addison Wesley Professional");
addison.save(); Author bloch = new Author();
bloch.setFirstName("Joshua");
bloch.setLastName("Bloch"); bloch.save();
Slide 49 af 53
Ingeniørhøjskolen i Århus
Principles of Persistence continued
ODBMS
ODBMS
• ODBMS have been standardized by the Object
Database Management Group
– Schema definition language (ODL) – subset of CORBA
IDL
– Programming language bindings to
• C++
• Java
• And many others
– Object Query Language (OQL)
• Support persistence of OO programming
language objects
Slide 51 af 53
Ingeniørhøjskolen i Århus
Mapping to ODBMSs
• ODL is a superset of OMG/IDL
• Programming language bindings of ODBMS are
also supported by CORBA
• CORBA portable object adapter supports ODBMS
• ODBMS objects can be
– clients of CORBA objects
– servers for CORBA objects
Slide 52 af 53
Ingeniørhøjskolen i Århus
Comparison
• Externalization/Serilization
– only well suited for smaller size projects
• Persistence in RDBMS is
– complicated by OR Impedence Mismatch
– simplified by wide availability of RDBMS
– very performant (if OR imp.mis. is handled)
• Persistence in ODBMS is
– simplified by conceptual similarities of
• object models
• programming language bindings
– but fairly unproven yet
Slide 53 af 53
Ingeniørhøjskolen i Århus