agora inbox for pljava-dev@postgresql.org  
help / color / mirror / Atom feed
Subject: [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?
Date: Sat, 8 Mar 2014 19:21:03 +0900
Message-ID: <30A6B4B499494CED93770BBC4835840C@maumau> (raw)

Hello,

Is PL/Java safe to use in terms of its threading design?  I've just asked 
pgsql-hackers about this and am waiting for response, adding the sentence:

"To put the question in other words, is it safe to load a multi-threaded PL 
library in the single-threaded backend process, if the PL only calls SPI in 
the main thread?"

My understanding is:

* PL/Java (pljava.so) is linked with the JNI (Java Native Interface) 
library, libjvm.so, in JRE.  libjvm.so is linked with libpthread.so, because 
Java VM is multi-threaded.  SO, "ldd pljava.so" shows libjvm.so and 
libpthread.so. pljava.so doesn't seem to be built for multh-threading ---  
none of -mt, -D_REENTRANT or -D_POSIX_C_SOURCE is specified when building 
it.

* When the application calls Java stored function, pljava.so calls a 
function in libjvm.so to create a JVM in the backend process, then invokes 
the user-defined Java method in the main thread.  The user-defined Java 
method calls JDBC methods to access database.  The JDBC method calls are 
translated to backend SPI function calls through JNI.

* The main thread can create Java threads using Java Thread API, and those 
threads can call JDBC methods.  However, PL/Java intercepts JDBC method 
calls and serializes SPI calls.  So, only one thread calls SPI functions at 
a time.  I'm wondering if this is the reason why PL/Java is safe for use.


What I'm concerned about is whether multi-threaded code (Java VM) can run 
safely in a single-threaded code (postgres).  I cannot point out what can be 
a particular problem with PL/Java, but in general, the mixture of 
single-threaded code and multi-threaded one seems to cause trouble around 
handling errno, memory and file handles/pointers.

FYI, JNI specification says that the code called from Java VM should be 
built for multi-threading as follows.  But postgres is not.

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp9502

[Excerpt]
Compiling, Loading and Linking Native Methods
Since the Java VM is multithreaded, native libraries should also be compiled 
and linked with multithread aware native compilers. For example, the -mt 
flag should be used for C++ code compiled with the Sun Studio compiler. For 
code complied with the GNU gcc compiler, the flags -D_REENTRANT 
or -D_POSIX_C_SOURCE should be used. For more information please refer to 
the native compiler documentation.

Regards
MauMau




view thread (13+ messages)  latest in thread

Message-ID: <30A6B4B499494CED93770BBC4835840C@maumau>
Permalink:  ../30A6B4B499494CED93770BBC4835840C@maumau/
Also on:    postgresql.org/message-id/30A6B4B499494CED93770BBC4835840C@maumau

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pljava-dev@postgresql.org
  Subject: Re: [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?
  In-Reply-To: <30A6B4B499494CED93770BBC4835840C@maumau>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox