PostgreSQL and PL/Java

     Server-Side Functions in Java

                 Peter Eisentraut
           petere@postgresql...
Agenda
•   Functions in PostgreSQL
•   Enter PL/Java
•   Features of PL/Java
•   Support and Compatibility
•   Outlook and...
Defining a Function
Example of an SQL function:

CREATE FUNCTION add(int, int) RETURNS int
 LANGUAGE SQL
 AS 'SELECT $1 + ...
Defining a Function
Example of a C function:

PG_FUNCTION_INFO_V1(funcname);
Datum add(PG_FUNCTION_ARGS)
{
    int32 a = P...
Defining a Function
Example of a C function, continued:

gcc -fPIC -c file.c
gcc -shared -o file.so file.o


CREATE FUNCTI...
Features of Functions
• Overloading
• Processing sets/tables
• Caching options
  (deterministic/nondeterministic)
• Execut...
Advantages of Server-Side
             Functions
•   Encapsulation
•   Faster database access
•   Plan caching, inlining
•...
Functions as Building Blocks
•   Operators
•   Data types
•   Aggregate functions
•   Index access methods
•   Type casts
...
Procedural Languages
• Choice of SQL vs. C quite limited
• Solution: pluggable language handlers

• Available languages:
 ...
Procedural Language Example:
          PL/pgSQL
CREATE FUNCTION logfunc(logtxt text)
 RETURNS timestamp
AS '
 DECLARE
    ...
Procedural Language Example:
            PL/Perl
CREATE OR REPLACE FUNCTION valid_id()
 RETURNS trigger
AS '
 if (($_TD->{...
Enter PL/Java
• Developed by Thomas Hallgren

• Stored procedures written in the Java
  language
• Java the most popular (...
Standardization
SQL standard: ISO/IEC 9075-13:2003
SQL Routines and Types for the Java
  Programming Language ("SQL/JRT")
...
Timeline of PL/Java
•   Nov. 2000: first attempt with Kaffe 1.0.6
•   Dec. 2003: PL/Java project launched
•   Jan. 2004: f...
Concept
•   Write a Java class
•   Designate static method as entry point
•   Pack into JAR
•   Load JAR into database
•  ...
Simple Example: Code
package com.example;


public class Foo
{
    static int add(int a, int b)
    {
        return a + b...
Simple Example: Deployment
javac com/example/Foo.java
jar cf foo.jar com/example/Foo.class


SELECT
  sqlj.install_jar('fi...
Deployment Descriptor
Optional way to integrate install/uninstall SQL
 statements into the JAR file:
SQLActions[] = {
    ...
Configuration
New parameters for postgresql.conf:

custom_variable_classes = 'pljava'


pljava.classpath = '/some/where/pl...
Parameter Type Mapping
Parameter types are mapped automatically:
  PostgreSQL         Java
  boolean            boolean
  ...
Composite Types
CREATE TYPE compositeTest AS (
     base    integer,
     incbase integer,
     ctime   timestamp
);


CRE...
Composite Types
Represented as java.sql.ResultSet with one
 row.
public static String useCompositeTest(ResultSet
   compos...
Returning Sets
CREATE FUNCTION getNames() RETURNS SETOF varchar
   AS 'Bar.getNames'
   LANGUAGE java;


import java.util....
Built-in JDBC Driver
• Prepare/execute queries
• Query metadata
• No transaction management (can use
  savepoints)

Connec...
Triggers
static void moddatetime(TriggerData td) throws SQLException
{
    if(td.isFiredForStatement())
     throw new Tri...
Other Features
•   Exception handling
•   Logging
•   DatabaseMetaData
•   Multithreading
•   IN/OUT parameters (PostgreSQ...
Problem Areas
• Memory usage
• Performance?
• Stack handling




                           27
Build Options
• Builds with:
  • Sun JDK ≥ 1.4 (shared library + JAR)
  • GCJ ≥ 4.0 (shared library)
• Does not work with:...
GCJ Issues
• Missing java.security implementation
• GCJ-based PL/Java installations are
  untrusted.




                 ...
Supported Platforms
• Linux (most architectures)
• Cygwin
• Windows (PostgreSQL 8.1/recent)

• More reports welcome!




 ...
Compatibility
• vs. Oracle:
  • data type system not as good
  • trigger procedures not compatible (wrappers
    possible)...
The Future
• Dynamic type system (SQL:2003)
• Work on SQL conformance and
  compatibility
• More work on J4SQL
• Cooperati...
Conclusion
•   PL/Java is stable today.
•   It is being used.
•   It is almost feature complete.
•   Get it now!




http:...
Upcoming SlideShare
Loading in...5
×

PostgreSQL and PL/Java

13,299

Published on

server-side functions in Java

Published in: Technology, News & Politics
1 Comment
9 Likes
Statistics
Notes
  • Bonjour,
    jusqu’à présent je ne parviens pas à écrire mes fonctions pl/java sur postgresql avec JAVA trusted, seulement avec JAVAU (untrusted). quand je mets 'languege java' dans mes fonctions sur postgresql, j'ai une exception de sécurité . Mais quand je mets JAVAU ça passe sans problème, mais mon véritable problème c'est comment résoudre ce problème, car en les faisant avec javau mes programmes seront dépourvus de sécurité.
    Je voulais aussi savoir, dans quel fichier éxecuté le descripteur de déploiement qui figure dans les diapos ci dessus, peut avec cela mon problème peut etre résolu.

    Merci de m'aider
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
13,299
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
220
Comments
1
Likes
9
Embeds 0
No embeds

No notes for slide

PostgreSQL and PL/Java

  1. 1. PostgreSQL and PL/Java Server-Side Functions in Java Peter Eisentraut petere@postgresql.org
  2. 2. Agenda • Functions in PostgreSQL • Enter PL/Java • Features of PL/Java • Support and Compatibility • Outlook and Wrap-Up 2
  3. 3. Defining a Function Example of an SQL function: CREATE FUNCTION add(int, int) RETURNS int LANGUAGE SQL AS 'SELECT $1 + $2;'; SELECT add(4, 5); add ----- 9 3
  4. 4. Defining a Function Example of a C function: PG_FUNCTION_INFO_V1(funcname); Datum add(PG_FUNCTION_ARGS) { int32 a = PG_GETARG_INT32(0); int32 b = PG_GETARG_INT32(1); PG_RETURN_INT32(a + b); } 4
  5. 5. Defining a Function Example of a C function, continued: gcc -fPIC -c file.c gcc -shared -o file.so file.o CREATE FUNCTION add(int, int) RETURNS int LANGUAGE C AS 'file.so', 'add'; 5
  6. 6. Features of Functions • Overloading • Processing sets/tables • Caching options (deterministic/nondeterministic) • Execution privileges 6
  7. 7. Advantages of Server-Side Functions • Encapsulation • Faster database access • Plan caching, inlining • Data validation through triggers • Side effects through triggers 7
  8. 8. Functions as Building Blocks • Operators • Data types • Aggregate functions • Index access methods • Type casts • Character set conversions 8
  9. 9. Procedural Languages • Choice of SQL vs. C quite limited • Solution: pluggable language handlers • Available languages: Tcl, PL/pgSQL, Perl, Ruby, Python, Shell, R, Java, PHP 9
  10. 10. Procedural Language Example: PL/pgSQL CREATE FUNCTION logfunc(logtxt text) RETURNS timestamp AS ' DECLARE curtime timestamp; BEGIN curtime := ''now''; INSERT INTO logtable VALUES (logtxt, curtime); RETURN curtime; END; ' LANGUAGE plpgsql; 10
  11. 11. Procedural Language Example: PL/Perl CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS ' if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) { return "SKIP"; # skip INSERT/UPDATE command } elsif ($_TD->{new}{v} ne "immortal") { $_TD->{new}{v} .= "(modified by trigger)"; return "MODIFY"; # modify row and run INSERT/UPDATE } else { return; # execute INSERT/UPDATE command } ' LANGUAGE plperl; 11
  12. 12. Enter PL/Java • Developed by Thomas Hallgren • Stored procedures written in the Java language • Java the most popular (client) language for PostgreSQL 12
  13. 13. Standardization SQL standard: ISO/IEC 9075-13:2003 SQL Routines and Types for the Java Programming Language ("SQL/JRT") (210 pages) driven by Oracle and IBM 13
  14. 14. Timeline of PL/Java • Nov. 2000: first attempt with Kaffe 1.0.6 • Dec. 2003: PL/Java project launched • Jan. 2004: first alpha release • Jan. 2005: release 1.0.0 (for PG 7.4) • Apr. 2005: release 1.1.0 (for PG 8.0) • currently “stable” 14
  15. 15. Concept • Write a Java class • Designate static method as entry point • Pack into JAR • Load JAR into database • Adjust classpath • Create function in PostgreSQL 15
  16. 16. Simple Example: Code package com.example; public class Foo { static int add(int a, int b) { return a + b; } } 16
  17. 17. Simple Example: Deployment javac com/example/Foo.java jar cf foo.jar com/example/Foo.class SELECT sqlj.install_jar('file:/home/peter/tmp/foo.jar', 'foo', false); SELECT sqlj.set_classpath('public', 'foo:bar:etc'); CREATE FUNCTION add(int, int) RETURNS int LANGUAGE java AS 'com.example.Foo.add'; 17
  18. 18. Deployment Descriptor Optional way to integrate install/uninstall SQL statements into the JAR file: SQLActions[] = { "BEGIN INSTALL CREATE FUNCTION add(int, int) RETURNS int LANGUAGE java AS 'com.example.Foo.add'; END INSTALL", "BEGIN REMOVE DROP FUNCTION add(int, int); END REMOVE" } 18
  19. 19. Configuration New parameters for postgresql.conf: custom_variable_classes = 'pljava' pljava.classpath = '/some/where/pljava.jar' pljava.statement_cache_size = 10 pljava.release_lingering_savepoints = true pljava.vmoptions = '-Xmx64M' pljava.debug = false 19
  20. 20. Parameter Type Mapping Parameter types are mapped automatically: PostgreSQL Java boolean boolean shortint short int int bigint long real float double precision double varchar, text java.lang.String bytea byte[] date java.sql.Date time java.sql.Time timestamp java.sql.Timestamp other java.lang.String 20
  21. 21. Composite Types CREATE TYPE compositeTest AS ( base integer, incbase integer, ctime timestamp ); CREATE FUNCTION useCompositeTest (compositeTest) RETURNS varchar AS 'foo.fee.Fum.useCompositeTest' LANGUAGE java; 21
  22. 22. Composite Types Represented as java.sql.ResultSet with one row. public static String useCompositeTest(ResultSet compositeTest) throws SQLException { int base = compositeTest.getInt(1); int incbase = compositeTest.getInt(2); Timestamp ctime = compositeTest.getTimestamp(3); return "Base = "" + base + "", incbase = "" + incbase + "", ctime = "" + ctime + """; } 22
  23. 23. Returning Sets CREATE FUNCTION getNames() RETURNS SETOF varchar AS 'Bar.getNames' LANGUAGE java; import java.util.Iterator; public class Bar { public static Iterator getNames() { ArrayList names = new ArrayList(); names.add("Lisa"); names.add("Bob"); names.add("Bill"); return names.iterator(); } } 23
  24. 24. Built-in JDBC Driver • Prepare/execute queries • Query metadata • No transaction management (can use savepoints) Connection conn = DriverManager.getConnection("jdbc:default:connectio n"); 24
  25. 25. Triggers static void moddatetime(TriggerData td) throws SQLException { if(td.isFiredForStatement()) throw new TriggerException(td, "can't process STATEMENT events"); if(td.isFiredAfter()) throw new TriggerException(td, "must be fired before event"); if(!td.isFiredByUpdate()) throw new TriggerException(td, "can only process UPDATE events"); ResultSet _new = td.getNew(); String[] args = td.getArguments(); if (args.length != 1) throw new TriggerException(td, "one argument was expected"); _new.updateTimestamp(args[0], new Timestamp(System.currentTimeMillis())); } 25
  26. 26. Other Features • Exception handling • Logging • DatabaseMetaData • Multithreading • IN/OUT parameters (PostgreSQL 8.1) • Security 26
  27. 27. Problem Areas • Memory usage • Performance? • Stack handling 27
  28. 28. Build Options • Builds with: • Sun JDK ≥ 1.4 (shared library + JAR) • GCJ ≥ 4.0 (shared library) • Does not work with: • Kaffe • SableVM 28
  29. 29. GCJ Issues • Missing java.security implementation • GCJ-based PL/Java installations are untrusted. 29
  30. 30. Supported Platforms • Linux (most architectures) • Cygwin • Windows (PostgreSQL 8.1/recent) • More reports welcome! 30
  31. 31. Compatibility • vs. Oracle: • data type system not as good • trigger procedures not compatible (wrappers possible) • vs. DB/2, Firebird, ...: • unknown 31
  32. 32. The Future • Dynamic type system (SQL:2003) • Work on SQL conformance and compatibility • More work on J4SQL • Cooperation with PL/J project 32
  33. 33. Conclusion • PL/Java is stable today. • It is being used. • It is almost feature complete. • Get it now! http://gborg.postgresql.org/project/pljava/projdisplay.php 33
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×