Re: Datasources in Shark

Monique Maker <[email protected]> Tue, 20 Sep 2005 12:44:53 +0300
Newsgroups gmane.comp.java.enhydra.shark
Message-ID <[email protected]>
Hello David,

We tried using oracle.sql.BLOB also and it works fine for reading data. As I can remember there was some incompatibility at writing data (sorry, I cannot give more details as it was long ago). And as we were forced to use weblogic.jdbc.vendor.oracle.OracleThinBlob for writing (there is no matter which object you will use for reading - dependancy is already introduced) we preferred the weblogic.jdbc.vendor.oracle.OracleThinBlob for reading too.

It is possible that we missed something, so please test and publish your code. Please note that using version 1.1-2 optimizations, you might never write a BLOB (you can choose "non-standard" mode for writing Shark data to the database, which avoids using of BLOBS when possible), so double-check that your tests pass the insertBlob() method.

Best Regards,
Monique

David Simón wrote:
> Hello,
> 
> First of all, I would like to say that finally we have migrated to Shark 
> 1.1-2 last week. Now we are testing it and although we have had some 
> problems it seems is working better, at least we can use db pools from 
> our Application Server :-)
> 
> One of the problems was the one of the message below, but thanks to 
> Monique code it was solved (thank you). However we have made a little 
> change, we use oracle.sql.BLOB instead of 
> weblogic.jdbc.vendor.oracle.OracleThinBlob and it works fine too. We 
> think this may be interesting for you because it is not Application 
> Server dependant.
> 
> Another problem is that the method getAssignment of the ExecutionManager 
> is throwing a "Null pointer exception" instead of returnin a null when 
> the user has not assigned the activity we are asking for. The process  
> id, the activity id and the resource passed to the method are correct 
> and it works if the user is assigned to the activity, but according to 
> the documentation if the user is not assigned it should return a null. 
> Does anyone know why is this happening?
> 
> Thank you. We will keep on testing.
> 
> Best regards.
> 
> David
> 
>> Hello Vladimir,
>>
>> We investigate the problem and our solution was to change
>> com.lutris.appserver.server.sql.oracle.OracleDriverDependencies.java
>> from dods-6.5-1. As it might help someone else, here is our code (I am
>> not sure the list accepts attachments, but just in case I will attach
>> the file too):
>>
>> -----------------------------------------------------------------------
>> package com.lutris.appserver.server.sql.oracle;
>>
>> import java.io.ByteArrayInputStream;
>> import java.io.IOException;
>> import java.io.InputStream;
>> import java.io.OutputStream;
>> import java.sql.Blob;
>> import java.sql.PreparedStatement;
>> import java.sql.ResultSet;
>> import java.sql.SQLException;
>>
>> import org.enhydra.dods.DriverDependencies;
>>
>> import weblogic.jdbc.vendor.oracle.OracleThinBlob;
>>
>> import com.lutris.appserver.server.sql.DBConnection;
>> import com.lutris.dods.builder.generator.query.RDBColumn;
>>
>> /**
>>  * This implementation refects the specifics of Oracle DB connections
>>  * handled in BEA WebLogic 8.1 SP2.
>>  */
>> public class OracleDriverDependencies implements DriverDependencies {
>>
>>   private static final int BUFFER_LENGTH = 2048;
>>
>>
>>   public boolean isBlobAccessSpecial() {
>>     return true;
>>   }
>>
>>
>>   public void insertBlob(DBConnection conn, byte[] cont, RDBColumn 
>> primary, RDBColumn column, String handle) throws SQLException {
>>     PreparedStatement update;
>>     String sqlStatement;
>>    
>>     ResultSet rs;
>>     Blob blob;   
>>     OutputStream blobOut;
>>     InputStream  dataIn;
>>     byte[] buffer = new byte[ BUFFER_LENGTH ];
>>     int length;
>>    
>>     if ( cont != null ) {
>>       sqlStatement = "select " + column.getColumnName() + " from " + 
>> column.getTableName()
>>                      + " where " + primary.getColumnName() + " = ? "
>>                      + " FOR UPDATE";
>>      
>>       update = conn.getConnection().prepareStatement( sqlStatement );
>>       try {
>>         update.setString( 1, handle );
>>        
>>         rs = update.executeQuery();
>>         try {
>>           rs.next();
>>           blob = rs.getBlob( 1 );
>>          
>> //        blob.setBytes( 1, cont ); // really sorry, this feature is not 
>> supported
>>           dataIn = new ByteArrayInputStream( cont );
>>           try {
>>             blobOut = 
>> ((OracleThinBlob)blob).getBinaryOutputStream();           
>>             try {
>>               while ( ( length = dataIn.read( buffer, 0, buffer.length ) 
>> ) != -1 ) {
>>                 blobOut.write(buffer, 0, length);
>>               }
>>             } finally {
>>               blobOut.close();
>>             }         
>>           } finally {
>>             dataIn.close();
>>           }
>>         } catch (IOException ex) { // the blob was not written properly
>>           throw new SQLException( "BLOB writing failed for statement: " 
>> + sqlStatement );
>>         } finally {
>>           rs.close();
>>         }
>>       } finally {
>>         update.close();
>>       }
>>     }
>>   }
>>
>>
>>   public byte[] readBlob(ResultSet rs, String colName) throws SQLException {
>>     // BLOB blob = ((OracleResultSet)rs).getBLOB(colName);
>>     Blob blob = rs.getBlob( colName ); // VK, 2005-07-12: Use the 
>> standard java.sql.ResultSet
>>     if ( null == blob )
>>       return null;
>>     return blob.getBytes( 1L, (int) blob.length() );
>>   }
>> }
>> -----------------------------------------------------------------------
>>
>> Note that you will need the weblojc.jar in your classpath when building
>> the DODS as we use the WebLogic specific class OracleThinBlob. We do
>> not know if these changes are needed for BEA WebLogic 9.x.
>>
>> Note that Shark rebuild is not required for this change to take effect.
>> The only thing you need to do is to copy
>> <dods-6.5-1_project_dir>\output\lib\dbvendors\oracle.jar
>> to an appropriate place (we copy it directly in our project directory,
>> as we are using Shark as library).
>>
>> Best Regards,
>> Monique
>>
>>
>> Vladimir Puskas wrote:
>>
>> > Hello Monique
>> >
>> > you wrote:
>> >
>> >> Oops!
>> >> Sorry, it was our fault: Somehow the dods-runtime.jar file from 
>> >> version 1.0.1 fall among the files from 1.1-2. When we removed it 
>> >> everything went well with the "standard" Oracle connection. 
>> >> Unfortunately we are still not able to make Shark to use datasuorce. 
>> >> Run fails with the following error:
>> >>
>> >> SharkEngineManager -> Shark engine is being initialized ...
>> >> ...
>> >> 2005-07-12 08:57:52,601: SharkUtilities -> synchronizing XPDL cache
>> >> version:1118762756000
>> >> 2005-07-12 08:57:52,804: Problem while initializing caches !!!
>> >> java.lang.ClassCastException
>> >>        at 
>> >> com.lutris.appserver.server.sql.oracle.OracleDriverDependencies.readBlob(OracleDriverDependencies.java:69) 
>> >>
>> >>        at 
>> >> org.enhydra.shark.repositorypersistence.data.XPDLDataDO.initFromResultSet(XPDLDataDO.java:3297) 
>> >>
>> >> Has anyone met similar problem?
>> >
>> >
>> > To be honest we haven't tried this combination (oracle-data source).
>> >
>> > Because Oracle has peculiar way of reading and storing BLOBs
>> > OracleDriverDependences was introduced - in line 69 it directly casts
>> > java.sql.ResultSet into oracle.jdbc.OracleResultSet to perform BLOB
>> > extraction... It's now obvious ResultSet coming form data-source doesn't
>> > fit this. With Enhydra/Tomcat it is 
>> > org.apache.tomcat.dbcp.dbcp.DelegatingResultSet and AFAICS you're 
>> > using WebLogic...
>> >
>> > Thread on [1] might be helpful, but I doubt we can provide general 
>> > enough solution, due to proposed casting to Commons DBPC classes.
>> >
>> > [1] 
>> > http://forum.java.sun.com/thread.jspa?threadID=492989&messageID=2319777 <http://forum.java.sun.com/thread.jspa?threadID=492989&messageID=2319777>
>> >
>> >
>> > regards
>>
>>
>> plain text document adjunto (OracleDriverDependencies.java)
>>
>> package com.lutris.appserver.server.sql.oracle;
>>
>> import java.io.ByteArrayInputStream;
>> import java.io.IOException;
>> import java.io.InputStream;
>> import java.io.OutputStream;
>> import java.sql.Blob;
>> import java.sql.PreparedStatement;
>> import java.sql.ResultSet;
>> import java.sql.SQLException;
>>
>> import org.enhydra.dods.DriverDependencies;
>>
>> import weblogic.jdbc.vendor.oracle.OracleThinBlob;
>>
>> import com.lutris.appserver.server.sql.DBConnection;
>> import com.lutris.dods.builder.generator.query.RDBColumn;
>>
>> /**
>>  * This implementation refects the specifics of Oracle DB connections
>>  * handled in BEA WebLogic 8.1 SP2. Updated by i:FAO
>>  */
>> public class OracleDriverDependencies implements DriverDependencies {
>>
>>   private static final int BUFFER_LENGTH = 2048;
>>
>>
>>   public boolean isBlobAccessSpecial() {
>>     return true;
>>   }
>>
>>
>>   public void insertBlob(DBConnection conn, byte[] cont, RDBColumn primary, RDBColumn column, String handle) throws SQLException {
>>     PreparedStatement update;
>>     String sqlStatement;
>>     
>>     ResultSet rs;
>>     Blob blob;    
>>     OutputStream blobOut;
>>     InputStream  dataIn;
>>     byte[] buffer = new byte[ BUFFER_LENGTH ];
>>     int length;
>>     
>>     if ( cont != null ) {
>>       sqlStatement = "select " + column.getColumnName() + " from " + column.getTableName()
>>                      + " where " + primary.getColumnName() + " = ? "
>>                      + " FOR UPDATE";
>>       
>>       update = conn.getConnection().prepareStatement( sqlStatement ); 
>>       try { 
>>         update.setString( 1, handle );
>>         
>>         rs = update.executeQuery();
>>         try {
>>           rs.next();
>>           blob = rs.getBlob( 1 );
>>           
>> //        blob.setBytes( 1, cont ); // really sorry, this feature is not supported
>>           dataIn = new ByteArrayInputStream( cont );
>>           try {
>>             blobOut = ((OracleThinBlob)blob).getBinaryOutputStream();            
>>             try {
>>               while ( ( length = dataIn.read( buffer, 0, buffer.length ) ) != -1 ) {
>>                 blobOut.write(buffer, 0, length);
>>               }
>>             } finally {
>>               blobOut.close();
>>             }          
>>           } finally {
>>             dataIn.close();
>>           }
>>         } catch (IOException ex) { // the blob was not written properly
>>           throw new SQLException( "BLOB writing failed for statement: "+sqlStatement );
>>         } finally {
>>           rs.close();
>>         }
>>       } finally {
>>         update.close();
>>       }
>>     }
>>   }
>>
>>
>>   public byte[] readBlob(ResultSet rs, String colName) throws SQLException {
>>     // BLOB blob = ((OracleResultSet)rs).getBLOB(colName);
>>     Blob blob = rs.getBlob( colName ); // VK, 2005-07-12: Use the standard java.sql.ResultSet
>>     if ( null == blob )
>>       return null;
>>     return blob.getBytes( 1L, (int) blob.length() );
>>   }
>> }
>> plain text document adjunto (message-footer.txt)
>>
>> --
>> You receive this message as a subscriber of the [email protected] <mailto:[email protected]> mailing list.
>> To unsubscribe: mailto:[email protected] <mailto:[email protected]>
>> For general help: mailto:[email protected] <mailto:[email protected]>?subject=help
>> ObjectWeb mailing lists service home page: http://www.objectweb.org/wws
message-footer.txt (text/plain, 271 B)
--
You receive this message as a subscriber of the [email protected] mailing list.
To unsubscribe: mailto:[email protected]
For general help: mailto:[email protected]?subject=help
ObjectWeb mailing lists service home page: http://www.objectweb.org/wws