arminw 2005/11/09 17:25:36
Modified: src/doc/forrest/src/documentation/content/xdocs/docu/guides
Tag: OJB_1_0_RELEASE sequencemanager.xml
Log:
update SequenceManagerStoredProcedureImpl section
change section order
Revision Changes Path
No revision
No revision
1.1.2.7 +260 -191
db-ojb/src/doc/forrest/src/documentation/content/xdocs/docu/guides/sequencemanager.xml
Index: sequencemanager.xml
===================================================================
RCS file:
/home/cvs/db-ojb/src/doc/forrest/src/documentation/content/xdocs/docu/guides/sequencemanager.xml,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -u -r1.1.2.6 -r1.1.2.7
--- sequencemanager.xml 12 Oct 2005 00:12:40 -0000 1.1.2.6
+++ sequencemanager.xml 10 Nov 2005 01:25:36 -0000 1.1.2.7
@@ -577,12 +577,83 @@
</section>
+ <anchor id="native"/>
<section>
- <title>Oracle-style sequencing</title>
+ <title>Database Identity-column based sequence
manager</title>
+ <p>
+ This sequence manager implementation supports
database <em>Identity columns</em>
+ (supported by MySQL, MsSQL, HSQL, ...). When using
identity columns we have to do
+ a trick to make the sequence manager work.
+ <br/>
+ OJB identify each persistence capable object by a
unique
+ <link href="ext:identity">ojb-Identity
object</link>. These ojb-Identity
+ objects were created using the sequence manager
instance to
+ get UID's. Often these ojb-Identity objects were
created before
+ the persistence capable object was written to
database.
+ <br/>
+ When using Identity columns it is not possible to
retrieve the next
+ valid UID before the object was written to database.
As recently as
+ the real object was written to database, you can ask
the DB for the last
+ generated UID. Thus in SequenceManagerNativeImpl we
have to do a trick and use
+ a 'temporary' UID till the object was written to
database.
+ <br/>
+ So for best compatibility try to avoid using
<em>Identity columns</em> in your
+ database model. If this is not possible, use this
sequence manager implementation to
+ work with database <em>Identity columns</em>.
+ </p>
<p>
- (By Ryan Vanderwerf et al.) This solution will give
those seeking an oracle-style sequence generator
- a final answer (Identity columns really suck). If
you are using multiple
- application servers in your environment, and your
database does not
+ To enable this sequence manager implementation set
in your
+ <code>jdbc-connection-descriptor</code>:
+ </p>
+ <source><![CDATA[
+<sequence-manager
+
className="org.apache.ojb.broker.util.sequence.SequenceManagerNativeImpl">
+</sequence-manager>
+ ]]></source>
+ <p>
+ To declare the identity column in the persistent
class mapping
+ <link
href="site:repository/class-descriptor">class-descriptor</link>, add the
+ following attributes to the primary key/identity key
+ <link
href="site:repository/field-descriptor">field-descriptor</link>:
+ <br/>
+ <code>primarykey="true"</code>,
+ <code>autoincrement="true"</code> and
+ <strong><code>access="readonly"</code></strong>
+ <br/>
+ The first and second attributes are the same as all
sequence manager implementations
+ use to support autoincrement PK fields, the third
one is mandatory for database
+ <em>Identity columns</em> only.
+ </p>
+ <source><![CDATA[
+<field-descriptor
+ name="identifier"
+ column="NATIVE_ID"
+ jdbc-type="BIGINT"
+ primarykey="true"
+ autoincrement="true"
+ access="readonly"/>
+ ]]></source>
+ <p>
+ Limitations:
+ <br/>- The Identity columns have to
+ <strong>start with value greater than '0'</strong>
and should
+ never be negative.
+ <br/>- Use of Identity columns is
+ <strong>not extent aware</strong> (This may change
in further versions).
+ More info
+ <link href="#extent-aware">here</link>.
+ </p>
+ </section>
+
+
+ <section>
+ <title>Stored Procedures based (Oracle-style)
sequencing</title>
+ <p>
+ <em>(By Ryan Vanderwerf et al.)</em>
+ <br/>
+ This solution will give those seeking an oracle-style
+ sequence generator a final answer (Identity columns
really suck). If you are using
+ multiple application servers in your environment,
and your database does not
support read locking like Microsoft SQL Server, this
is the only
safe way to guarantee unique keys
(HighLowSequenceManager WILL
give out duplicate keys, and corrupt your data).
@@ -591,34 +662,78 @@
<code>SequenceManagerStoredProcedureImpl</code>
implementation enabled database
sequence key generation in a
<em>Oracle-style</em> for all databases (e.g. MSSQL,
MySQL, DB2, ...).
- <br/>
- First add a new table
- <code>OJB_NEXTVAL_SEQ</code> to
- your database.
+ </p>
+ <p>
+ To declare this <em>sequence manager</em>
implementation specify a
+ <code>sequence-manager</code> element within the
+ <link
href="site:repository/jdbc-connection-descriptor">jdbc-connection-descriptor</link>:
</p>
<source><![CDATA[
+<sequence-manager
className="org.apache.ojb.broker.util.sequence.SequenceManagerStoredProcedureImpl">
+ <attribute attribute-name="seq.start" attribute-value="200000"/>
+ <attribute attribute-name="autoNaming" attribute-value="true"/>
+</sequence-manager>]]></source>
+ <p>
+ For attribute <link
href="#auto-naming"><em>autoNaming</em> see</link>.
+ </p>
+ <p>
+ This sequence manager implementation supports user
defined
+ <em>sequence-names</em>
+ to manage the sequences (see
+ <link href="#sequence-name">more</link>) or if not
+ set in <code>field-descriptor</code> it is done
automatic when
+ <link href="#auto-naming">autoNaming</link> is
enabled.
+ </p>
+ <ul>
+ <li>
+ Add a new table <code>OJB_NEXTVAL_SEQ</code> to
your database.
+ </li>
+ <li>
+ You will also need a stored procedure called
+ <code>ojb_nextval_proc</code> that will take
care of giving you a
+ guaranteed unique sequence number.
+ </li>
+ </ul>
+ <p>
+ Below you can find the stored procedures you need to
+ use sequencing for MSSQL server and Informix.
+ <br/>
+ You have to adapt the scripts for other databases
(We are interested
+ in scripts for other databases).
+ </p>
+ <p>
+ Here you can find the currently supported databases
and the statements to
+ create the sql functions:
+ </p>
+ <table>
+ <tr>
+ <th>Database</th>
+ <th>Table Statement</th>
+ <th>Stored Procedure</th>
+ </tr>
+ <tr>
+ <td>MSSQL</td>
+ <td>
+ <source><![CDATA[
+DROP TABLE OJB_NEXTVAL_SEQ;
CREATE TABLE OJB_NEXTVAL_SEQ
(
SEQ_NAME VARCHAR(150) NOT NULL,
MAX_KEY INTEGER,
- CONSTRAINT SYS_PK_OJB_NEXTVAL PRIMARY KEY(SEQ_NAME)
-)]]></source>
- <p>
- You will also need a stored procedure called
- <code>ojb_nextval_proc</code>
- that will take care of giving you a guaranteed unique
- sequence number.
- <br/>
- Here is an example for the stored procedure you need
to
- use sequencing for MSSQL server:
- </p>
- <source><![CDATA[
+ CONSTRAINT SYS_PK_OJB_NEXTVAL
+ PRIMARY KEY(SEQ_NAME)
+);]]></source>
+ </td>
+ <td>
+ <source><![CDATA[
CREATE PROCEDURE OJB_NEXTVAL_PROC
@SEQ_NAME varchar(150)
AS
declare @MAX_KEY BIGINT
--- return an error if sequence does not exist
--- so we will know if someone truncates the table
+-- return an error if
+-- sequence does not exist
+-- so we will know if someone
+-- truncates the table
set @MAX_KEY = 0
UPDATE OJB_NEXTVAL_SEQ
@@ -629,27 +744,50 @@
select 1/0
else
select @MAX_KEY
-RETURN @MAX_KEY ]]></source>
- <p>
- You have to adapt this script if MSSQL was not used
- (We are interested in scripts for other databases).
- Last, enable this sequence manager implementation:
- </p>
- <source><![CDATA[
-<sequence-manager
className="org.apache.ojb.broker.util.sequence.SequenceManagerStoredProcedureImpl">
- <attribute attribute-name="autoNaming" attribute-value="true"/>
-</sequence-manager>]]></source>
- <p>
- For attribute <link
href="#auto-naming"><em>autoNaming</em> see</link>.
- </p>
- <p>
- This sequence manager implementation supports user
defined
- <em>sequence-names</em>
- to manage the sequences (see
- <link href="#sequence-name">more</link>) or if not
- set in <code>field-descriptor</code> it is done
automatic when
- <link href="#auto-naming">autoNaming</link> is
enabled.
- </p>
+RETURN @MAX_KEY
+ ]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>Informix</td>
+ <td>
+ <source><![CDATA[
+drop table ojb_nextval_seq;
+create table ojb_nextval_seq
+(
+ seq_name varchar(250,0) not null,
+ max_key int8,
+ primary key(seq_name)
+);]]></source>
+ </td>
+ <td>
+ <source><![CDATA[
+create function ojb_nextval_proc
+(out arg1 int8, arg2 varchar(250,250))
+returns int8;
+let arg1 = 0;
+update ojb_nextval_seq
+set max_key = max_key + 1
+where seq_name = arg2;
+select max_key into arg1
+from ojb_nextval_seq
+where seq_name = arg2;
+return arg1;
+end function;]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>Oracle</td>
+ <td>
+ <source><![CDATA[
+TODO]]></source>
+ </td>
+ <td>
+ <source><![CDATA[
+TODO]]></source>
+ </td>
+ </tr>
+ </table>
<p>
Limitations:
<br/>- currently none known
@@ -711,164 +849,95 @@
</p>
</section>
-
- <anchor id="native"/>
- <section>
- <title>Identity based sequence manager</title>
- <p>
- This sequence manager implementation supports
database <em>Identity columns</em>
- (supported by MySQL, MsSQL, HSQL, ...). When using
identity columns we have to do
- a trick to make the sequence manager work.
- <br/>
- OJB identify each persistence capable object by a
unique
- <link href="ext:identity">ojb-Identity
object</link>. These ojb-Identity
- objects were created using the sequence manager
instance to
- get UID's. Often these ojb-Identity objects were
created before
- the persistence capable object was written to
database.
- <br/>
- When using Identity columns it is not possible to
retrieve the next
- valid UID before the object was written to database.
As recently as
- the real object was written to database, you can ask
the DB for the last
- generated UID. Thus in SequenceManagerNativeImpl we
have to do a trick and use
- a 'temporary' UID till the object was written to
database.
- <br/>
- So for best compatibility try to avoid using
<em>Identity columns</em> in your
- database model. If this is not possible, use this
sequence manager implementation to
- work with database <em>Identity columns</em>.
- </p>
- <p>
- To enable this sequence manager implementation set
in your
- <code>jdbc-connection-descriptor</code>:
- </p>
- <source><![CDATA[
-<sequence-manager
-
className="org.apache.ojb.broker.util.sequence.SequenceManagerNativeImpl">
-</sequence-manager>
- ]]></source>
- <p>
- To declare the identity column in the persistent
class mapping
- <link
href="site:repository/class-descriptor">class-descriptor</link>, add the
- following attributes to the primary key/identity key
- <link
href="site:repository/field-descriptor">field-descriptor</link>:
- <br/>
- <code>primarykey="true"</code>,
- <code>autoincrement="true"</code> and
- <strong><code>access="readonly"</code></strong>
- <br/>
- The first and second attributes are the same as all
sequence manager implementations
- use to support autoincrement PK fields, the third
one is mandatory for database
- <em>Identity columns</em> only.
- </p>
- <source><![CDATA[
-<field-descriptor
- name="identifier"
- column="NATIVE_ID"
- jdbc-type="BIGINT"
- primarykey="true"
- autoincrement="true"
- access="readonly"/>
- ]]></source>
- <p>
- Limitations:
- <br/>- The Identity columns have to
- <strong>start with value greater than '0'</strong>
and should
- never be negative.
- <br/>- Use of Identity columns is
- <strong>not extent aware</strong> (This may change
in further versions).
- More info
- <link href="#extent-aware">here</link>.
- </p>
- </section>
+ </section>
- <anchor id="sequence-name"/>
- <section>
- <title>The <em>sequence-name</em> attribute</title>
- <p>
- Several <link
href="ext:sequence-manager">SequenceManager</link> implementations
- using <em>sequences</em> (synonyms: <em>sequence
objects</em>, <em>sequence generators</em>)
- to manage the ID generation. Sequences are
<em>entities</em> which generate unique ID's using
- e.g. database table per sequence, database row per
sequence or an in-memory java-object.
- <br/>
- To address the sequences, each <em>sequence</em> has
an unique <em>sequence-name</em>.
- </p>
- <p>
- In OJB the sequence-name of an autoincrement field
is declared
- in a <em>sequence-name</em> attribute within the
- <link
href="site:repository/field-descriptor">field-descriptor</link>.
- </p>
- <source><![CDATA[
+ <anchor id="sequence-name"/>
+ <section>
+ <title>The <em>sequence-name</em> attribute</title>
+ <p>
+ Several <link
href="ext:sequence-manager">SequenceManager</link> implementations
+ using <em>sequences</em> (synonyms: <em>sequence
objects</em>, <em>sequence generators</em>)
+ to manage the ID generation. Sequences are
<em>entities</em> which generate unique ID's using
+ e.g. database table per sequence, database row per
sequence or an in-memory java-object.
+ <br/>
+ To address the sequences, each <em>sequence</em> has an
unique <em>sequence-name</em>.
+ </p>
+ <p>
+ In OJB the sequence-name of an autoincrement field is
declared
+ in a <em>sequence-name</em> attribute within the
+ <link
href="site:repository/field-descriptor">field-descriptor</link>.
+ </p>
+ <source><![CDATA[
<class-descriptor
- class="org.greatest.software.Person"
- table="GS_PERSON"
+class="org.greatest.software.Person"
+table="GS_PERSON"
>
- <field-descriptor
- name="id"
- column="ID_PERSON"
- jdbc-type="INTEGER"
- primarykey="true"
- autoincrement="true"
- sequence-name="PERSON_SEQUENCE"
- />
+<field-descriptor
+ name="id"
+ column="ID_PERSON"
+ jdbc-type="INTEGER"
+ primarykey="true"
+ autoincrement="true"
+ sequence-name="PERSON_SEQUENCE"
+/>
....
</class-descriptor>]]></source>
- <p>
- The <em>sequence-name</em> attribute in the
<em>field-descriptor</em> is only
- needed if the used sequence manager supports
sequences, the field should be
- <em>autoincremented</em> and the auto-assign of a
sequence-name is not desired.
- </p>
- <note>
- Each <em>sequence-name</em> has be <link
href="#extent-aware">extent-aware</link>.
- </note>
- <p>
- If you don't specify a sequence name in the
<em>field-descriptor</em> it is possible
- to auto-assign a sequence-name by OJB if <link
href="#auto-naming">autoNaming</link>
- is supported by the used sequence manager
implementation.
- </p>
+ <p>
+ The <em>sequence-name</em> attribute in the
<em>field-descriptor</em> is only
+ needed if the used sequence manager supports sequences,
the field should be
+ <em>autoincremented</em> and the auto-assign of a
sequence-name is not desired.
+ </p>
+ <note>
+ Each <em>sequence-name</em> has be <link
href="#extent-aware">extent-aware</link>.
+ </note>
+ <p>
+ If you don't specify a sequence name in the
<em>field-descriptor</em> it is possible
+ to auto-assign a sequence-name by OJB if <link
href="#auto-naming">autoNaming</link>
+ is supported by the used sequence manager implementation.
+ </p>
- </section>
+ </section>
- <anchor id="auto-naming"/>
- <section>
- <title>The <em>autoNaming</em> property</title>
- <p>
- All shipped <link
href="ext:sequence-manager">SequenceManager</link> implementations
- using <em>sequences</em> for ID generation support a
property
- called <em>autoNaming</em> which can be declared as a
- <link
href="site:repository/custom-attribute"><em>custom attribute</em></link>
- within the <em>sequence-manager</em> element:
- </p>
- <source><![CDATA[
+ <anchor id="auto-naming"/>
+ <section>
+ <title>The <em>autoNaming</em> property</title>
+ <p>
+ All shipped <link
href="ext:sequence-manager">SequenceManager</link> implementations
+ using <em>sequences</em> for ID generation support a
property
+ called <em>autoNaming</em> which can be declared as a
+ <link href="site:repository/custom-attribute"><em>custom
attribute</em></link>
+ within the <em>sequence-manager</em> element:
+ </p>
+ <source><![CDATA[
<sequence-manager
className="org.apache.ojb.broker.util.sequence.SequenceManagerNextValImpl">
- <attribute attribute-name="autoNaming" attribute-value="true"/>
+<attribute attribute-name="autoNaming" attribute-value="true"/>
</sequence-manager>]]></source>
- <p>
- If set <em>true</em> OJB try to build a
- <em>sequence name</em> by it's own (a simple
algorithm was used to auto-generate
- the sequence name - more details how it works in
- <link href="#pitfalls">pitfalls section</link>)
- and set this name as <code>sequence-name</code>
- in the <link
href="site:repository/field-descriptor">field-descriptor</link> of
- the autoincrement field if no <link
href="#sequence-name">sequence name</link>
- is specified.
- <br/>
- If set <em>false</em> the sequence manager throw an
exception
- if a <em>sequence name</em> can't be found or was
not declared in the
- <em>field-descriptor</em> of the autoincrement field.
- In this case OJB expects a valid
<em>sequence-name</em> in the <em>field-descriptor</em>.
- <br/>
- If the attribute <code>autoNaming</code> is set
<em>false</em> the sequence manager
- never try to auto-generate a <em>sequence-name</em>
(more detailed info
- <link href="#no-auto-build">here</link>). If set
<em>true</em> and a <em>sequence-name</em>
- is set in the <em>field-descriptor</em>, the
<em>SequenceManager</em> will use this one and
- does <strong>not</strong> override the existing one.
- </p>
- <p>
- The default setting is <em>true</em>.
- </p>
- </section>
-
+ <p>
+ If set <em>true</em> OJB try to build a
+ <em>sequence name</em> by it's own (a simple algorithm
was used to auto-generate
+ the sequence name - more details how it works in
+ <link href="#pitfalls">pitfalls section</link>)
+ and set this name as <code>sequence-name</code>
+ in the <link
href="site:repository/field-descriptor">field-descriptor</link> of
+ the autoincrement field if no <link
href="#sequence-name">sequence name</link>
+ is specified.
+ <br/>
+ If set <em>false</em> the sequence manager throw an
exception
+ if a <em>sequence name</em> can't be found or was not
declared in the
+ <em>field-descriptor</em> of the autoincrement field.
+ In this case OJB expects a valid <em>sequence-name</em>
in the <em>field-descriptor</em>.
+ <br/>
+ If the attribute <code>autoNaming</code> is set
<em>false</em> the sequence manager
+ never try to auto-generate a <em>sequence-name</em>
(more detailed info
+ <link href="#no-auto-build">here</link>). If set
<em>true</em> and a <em>sequence-name</em>
+ is set in the <em>field-descriptor</em>, the
<em>SequenceManager</em> will use this one and
+ does <strong>not</strong> override the existing one.
+ </p>
+ <p>
+ The default setting is <em>true</em>.
+ </p>
</section>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]